Coverage Report

Created: 2026-10-17 07:17

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/capstonenext/arch/SystemZ/SystemZDisassembler.c
Line
Count
Source
1
/* Capstone Disassembly Engine, http://www.capstone-engine.org */
2
/* By Nguyen Anh Quynh <aquynh@gmail.com>, 2013-2022, */
3
/*    Rot127 <unisono@quyllur.org> 2022-2023 */
4
/* Automatically translated source file from LLVM. */
5
6
/* LLVM-commit: <commit> */
7
/* LLVM-tag: <tag> */
8
9
/* Only small edits allowed. */
10
/* For multiple similar edits, please create a Patch for the translator. */
11
12
/* Capstone's C++ file translator: */
13
/* https://github.com/capstone-engine/capstone/tree/next/suite/auto-sync */
14
15
//===-- SystemZDisassembler.cpp - Disassembler for SystemZ ------*- C++ -*-===//
16
//
17
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
18
// See https://llvm.org/LICENSE.txt for license information.
19
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
20
//
21
//===----------------------------------------------------------------------===//
22
23
#include <stdio.h>
24
#include <string.h>
25
#include <stdlib.h>
26
#include <capstone/platform.h>
27
28
#include "../../MCInst.h"
29
#include "../../MathExtras.h"
30
#include "../../MCInstPrinter.h"
31
#include "../../MCDisassembler.h"
32
#include "../../MCFixedLenDisassembler.h"
33
#include "../../cs_priv.h"
34
#include "../../utils.h"
35
36
#include "SystemZMCTargetDesc.h"
37
#include "SystemZDisassemblerExtension.h"
38
39
171k
#define CONCAT(a, b) CONCAT_(a, b)
40
171k
#define CONCAT_(a, b) a##_##b
41
42
#define DEBUG_TYPE "systemz-disassembler"
43
44
static DecodeStatus getInstruction(MCInst *Instr, uint16_t *Size,
45
           const uint8_t *Bytes, size_t BytesLen,
46
           uint64_t Address, SStream *CStream);
47
48
/// tryAddingSymbolicOperand - trys to add a symbolic operand in place of the
49
/// immediate Value in the MCInst.
50
///
51
/// @param Value      - The immediate Value, has had any PC adjustment made by
52
///                     the caller.
53
/// @param isBranch   - If the instruction is a branch instruction
54
/// @param Address    - The starting address of the instruction
55
/// @param Offset     - The byte offset to this immediate in the instruction
56
/// @param Width      - The byte width of this immediate in the instruction
57
///
58
/// If the getOpInfo() function was set when setupForSymbolicDisassembly() was
59
/// called then that function is called to get any symbolic information for the
60
/// immediate in the instruction using the Address, Offset and Width.  If that
61
/// returns non-zero then the symbolic information it returns is used to create
62
/// an MCExpr and that is added as an operand to the MCInst.  If getOpInfo()
63
/// returns zero and isBranch is true then a symbol look up for immediate Value
64
/// is done and if a symbol is found an MCExpr is created with that, else
65
/// an MCExpr with the immediate Value is created.  This function returns true
66
/// if it adds an operand to the MCInst and false otherwise.
67
static bool tryAddingSymbolicOperand(int64_t Value, bool IsBranch,
68
             uint64_t Address, uint64_t Offset,
69
             uint64_t Width, MCInst *MI,
70
             const void *Decoder)
71
7.70k
{
72
  // return Decoder->tryAddingSymbolicOperand(MI, Value, Address, IsBranch,
73
  //           Offset, Width, /*InstSize=*/0);
74
7.70k
  return false;
75
7.70k
}
76
77
static DecodeStatus decodeRegisterClass(MCInst *Inst, uint64_t RegNo,
78
          const unsigned *Regs, unsigned Size,
79
          bool IsAddr)
80
425k
{
81
425k
  CS_ASSERT_RET_VAL(RegNo < Size, MCDisassembler_Fail);
82
425k
  if (IsAddr && RegNo == 0) {
83
54.3k
    RegNo = SystemZ_NoRegister;
84
371k
  } else {
85
371k
    RegNo = Regs[RegNo];
86
371k
    if (RegNo == 0)
87
178
      return MCDisassembler_Fail;
88
371k
  }
89
425k
  MCOperand_CreateReg0(Inst, (RegNo));
90
425k
  return MCDisassembler_Success;
91
425k
}
92
93
static DecodeStatus DecodeGR32BitRegisterClass(MCInst *Inst, uint64_t RegNo,
94
                 uint64_t Address,
95
                 const void *Decoder)
96
72.5k
{
97
72.5k
  return decodeRegisterClass(Inst, RegNo, SystemZMC_GR32Regs, 16, false);
98
72.5k
}
99
100
static DecodeStatus DecodeGRH32BitRegisterClass(MCInst *Inst, uint64_t RegNo,
101
            uint64_t Address,
102
            const void *Decoder)
103
11.1k
{
104
11.1k
  return decodeRegisterClass(Inst, RegNo, SystemZMC_GRH32Regs, 16, false);
105
11.1k
}
106
107
static DecodeStatus DecodeGR64BitRegisterClass(MCInst *Inst, uint64_t RegNo,
108
                 uint64_t Address,
109
                 const void *Decoder)
110
46.8k
{
111
46.8k
  return decodeRegisterClass(Inst, RegNo, SystemZMC_GR64Regs, 16, false);
112
46.8k
}
113
114
static DecodeStatus DecodeGR128BitRegisterClass(MCInst *Inst, uint64_t RegNo,
115
            uint64_t Address,
116
            const void *Decoder)
117
22.1k
{
118
22.1k
  return decodeRegisterClass(Inst, RegNo, SystemZMC_GR128Regs, 16, false);
119
22.1k
}
120
121
static DecodeStatus DecodeADDR32BitRegisterClass(MCInst *Inst, uint64_t RegNo,
122
             uint64_t Address,
123
             const void *Decoder)
124
7.92k
{
125
7.92k
  return decodeRegisterClass(Inst, RegNo, SystemZMC_GR32Regs, 16, true);
126
7.92k
}
127
128
static DecodeStatus DecodeADDR64BitRegisterClass(MCInst *Inst, uint64_t RegNo,
129
             uint64_t Address,
130
             const void *Decoder)
131
141k
{
132
141k
  return decodeRegisterClass(Inst, RegNo, SystemZMC_GR64Regs, 16, true);
133
141k
}
134
135
static DecodeStatus DecodeFP32BitRegisterClass(MCInst *Inst, uint64_t RegNo,
136
                 uint64_t Address,
137
                 const void *Decoder)
138
27.0k
{
139
27.0k
  return decodeRegisterClass(Inst, RegNo, SystemZMC_FP32Regs, 16, false);
140
27.0k
}
141
142
static DecodeStatus DecodeFP64BitRegisterClass(MCInst *Inst, uint64_t RegNo,
143
                 uint64_t Address,
144
                 const void *Decoder)
145
48.0k
{
146
48.0k
  return decodeRegisterClass(Inst, RegNo, SystemZMC_FP64Regs, 16, false);
147
48.0k
}
148
149
static DecodeStatus DecodeFP128BitRegisterClass(MCInst *Inst, uint64_t RegNo,
150
            uint64_t Address,
151
            const void *Decoder)
152
12.6k
{
153
12.6k
  return decodeRegisterClass(Inst, RegNo, SystemZMC_FP128Regs, 16, false);
154
12.6k
}
155
156
static DecodeStatus DecodeVR32BitRegisterClass(MCInst *Inst, uint64_t RegNo,
157
                 uint64_t Address,
158
                 const void *Decoder)
159
1.55k
{
160
1.55k
  return decodeRegisterClass(Inst, RegNo, SystemZMC_VR32Regs, 32, false);
161
1.55k
}
162
163
static DecodeStatus DecodeVR64BitRegisterClass(MCInst *Inst, uint64_t RegNo,
164
                 uint64_t Address,
165
                 const void *Decoder)
166
2.23k
{
167
2.23k
  return decodeRegisterClass(Inst, RegNo, SystemZMC_VR64Regs, 32, false);
168
2.23k
}
169
170
static DecodeStatus DecodeVR128BitRegisterClass(MCInst *Inst, uint64_t RegNo,
171
            uint64_t Address,
172
            const void *Decoder)
173
27.2k
{
174
27.2k
  return decodeRegisterClass(Inst, RegNo, SystemZMC_VR128Regs, 32, false);
175
27.2k
}
176
177
static DecodeStatus DecodeAR32BitRegisterClass(MCInst *Inst, uint64_t RegNo,
178
                 uint64_t Address,
179
                 const void *Decoder)
180
3.10k
{
181
3.10k
  return decodeRegisterClass(Inst, RegNo, SystemZMC_AR32Regs, 16, false);
182
3.10k
}
183
184
static DecodeStatus DecodeCR64BitRegisterClass(MCInst *Inst, uint64_t RegNo,
185
                 uint64_t Address,
186
                 const void *Decoder)
187
2.15k
{
188
2.15k
  return decodeRegisterClass(Inst, RegNo, SystemZMC_CR64Regs, 16, false);
189
2.15k
}
190
191
#define DEFINE_decodeUImmOperand(N) \
192
  static DecodeStatus CONCAT(decodeUImmOperand, N)(MCInst * Inst, \
193
               uint64_t Imm) \
194
134k
  { \
195
134k
    if (!isUIntN(N, Imm)) \
196
134k
      return MCDisassembler_Fail; \
197
134k
    MCOperand_CreateImm0(Inst, (Imm)); \
198
134k
    return MCDisassembler_Success; \
199
134k
  }
SystemZDisassembler.c:decodeUImmOperand_4
Line
Count
Source
194
34.5k
  { \
195
34.5k
    if (!isUIntN(N, Imm)) \
196
34.5k
      return MCDisassembler_Fail; \
197
34.5k
    MCOperand_CreateImm0(Inst, (Imm)); \
198
34.5k
    return MCDisassembler_Success; \
199
34.5k
  }
SystemZDisassembler.c:decodeUImmOperand_8
Line
Count
Source
194
8.85k
  { \
195
8.85k
    if (!isUIntN(N, Imm)) \
196
8.85k
      return MCDisassembler_Fail; \
197
8.85k
    MCOperand_CreateImm0(Inst, (Imm)); \
198
8.85k
    return MCDisassembler_Success; \
199
8.85k
  }
SystemZDisassembler.c:decodeUImmOperand_12
Line
Count
Source
194
83.5k
  { \
195
83.5k
    if (!isUIntN(N, Imm)) \
196
83.5k
      return MCDisassembler_Fail; \
197
83.5k
    MCOperand_CreateImm0(Inst, (Imm)); \
198
83.5k
    return MCDisassembler_Success; \
199
83.5k
  }
SystemZDisassembler.c:decodeUImmOperand_16
Line
Count
Source
194
2.32k
  { \
195
2.32k
    if (!isUIntN(N, Imm)) \
196
2.32k
      return MCDisassembler_Fail; \
197
2.32k
    MCOperand_CreateImm0(Inst, (Imm)); \
198
2.32k
    return MCDisassembler_Success; \
199
2.32k
  }
SystemZDisassembler.c:decodeUImmOperand_32
Line
Count
Source
194
1.49k
  { \
195
1.49k
    if (!isUIntN(N, Imm)) \
196
1.49k
      return MCDisassembler_Fail; \
197
1.49k
    MCOperand_CreateImm0(Inst, (Imm)); \
198
1.49k
    return MCDisassembler_Success; \
199
1.49k
  }
SystemZDisassembler.c:decodeUImmOperand_3
Line
Count
Source
194
1.18k
  { \
195
1.18k
    if (!isUIntN(N, Imm)) \
196
1.18k
      return MCDisassembler_Fail; \
197
1.18k
    MCOperand_CreateImm0(Inst, (Imm)); \
198
1.18k
    return MCDisassembler_Success; \
199
1.18k
  }
SystemZDisassembler.c:decodeUImmOperand_1
Line
Count
Source
194
1.23k
  { \
195
1.23k
    if (!isUIntN(N, Imm)) \
196
1.23k
      return MCDisassembler_Fail; \
197
1.23k
    MCOperand_CreateImm0(Inst, (Imm)); \
198
1.22k
    return MCDisassembler_Success; \
199
1.23k
  }
SystemZDisassembler.c:decodeUImmOperand_2
Line
Count
Source
194
1.51k
  { \
195
1.51k
    if (!isUIntN(N, Imm)) \
196
1.51k
      return MCDisassembler_Fail; \
197
1.51k
    MCOperand_CreateImm0(Inst, (Imm)); \
198
1.49k
    return MCDisassembler_Success; \
199
1.51k
  }
200
DEFINE_decodeUImmOperand(1);
201
DEFINE_decodeUImmOperand(2);
202
DEFINE_decodeUImmOperand(3);
203
DEFINE_decodeUImmOperand(4);
204
DEFINE_decodeUImmOperand(8);
205
DEFINE_decodeUImmOperand(12);
206
DEFINE_decodeUImmOperand(16);
207
DEFINE_decodeUImmOperand(32);
208
209
#define DEFINE_decodeSImmOperand(N) \
210
  static DecodeStatus CONCAT(decodeSImmOperand, N)(MCInst * Inst, \
211
               uint64_t Imm) \
212
29.5k
  { \
213
29.5k
    if (!isUIntN(N, Imm)) \
214
29.5k
      return MCDisassembler_Fail; \
215
29.5k
    MCOperand_CreateImm0(Inst, (SignExtend64((Imm), N))); \
216
29.5k
    return MCDisassembler_Success; \
217
29.5k
  }
SystemZDisassembler.c:decodeSImmOperand_16
Line
Count
Source
212
5.52k
  { \
213
5.52k
    if (!isUIntN(N, Imm)) \
214
5.52k
      return MCDisassembler_Fail; \
215
5.52k
    MCOperand_CreateImm0(Inst, (SignExtend64((Imm), N))); \
216
5.52k
    return MCDisassembler_Success; \
217
5.52k
  }
SystemZDisassembler.c:decodeSImmOperand_32
Line
Count
Source
212
1.16k
  { \
213
1.16k
    if (!isUIntN(N, Imm)) \
214
1.16k
      return MCDisassembler_Fail; \
215
1.16k
    MCOperand_CreateImm0(Inst, (SignExtend64((Imm), N))); \
216
1.16k
    return MCDisassembler_Success; \
217
1.16k
  }
SystemZDisassembler.c:decodeSImmOperand_20
Line
Count
Source
212
19.7k
  { \
213
19.7k
    if (!isUIntN(N, Imm)) \
214
19.7k
      return MCDisassembler_Fail; \
215
19.7k
    MCOperand_CreateImm0(Inst, (SignExtend64((Imm), N))); \
216
19.7k
    return MCDisassembler_Success; \
217
19.7k
  }
SystemZDisassembler.c:decodeSImmOperand_8
Line
Count
Source
212
3.02k
  { \
213
3.02k
    if (!isUIntN(N, Imm)) \
214
3.02k
      return MCDisassembler_Fail; \
215
3.02k
    MCOperand_CreateImm0(Inst, (SignExtend64((Imm), N))); \
216
3.02k
    return MCDisassembler_Success; \
217
3.02k
  }
218
DEFINE_decodeSImmOperand(8);
219
DEFINE_decodeSImmOperand(16);
220
DEFINE_decodeSImmOperand(20);
221
DEFINE_decodeSImmOperand(32);
222
223
static DecodeStatus decodeU1ImmOperand(MCInst *Inst, uint64_t Imm,
224
               uint64_t Address, const void *Decoder)
225
1.23k
{
226
1.23k
  return CONCAT(decodeUImmOperand, 1)(Inst, Imm);
227
1.23k
}
228
229
static DecodeStatus decodeU2ImmOperand(MCInst *Inst, uint64_t Imm,
230
               uint64_t Address, const void *Decoder)
231
1.51k
{
232
1.51k
  return CONCAT(decodeUImmOperand, 2)(Inst, Imm);
233
1.51k
}
234
235
static DecodeStatus decodeU3ImmOperand(MCInst *Inst, uint64_t Imm,
236
               uint64_t Address, const void *Decoder)
237
1.18k
{
238
1.18k
  return CONCAT(decodeUImmOperand, 3)(Inst, Imm);
239
1.18k
}
240
241
static DecodeStatus decodeU4ImmOperand(MCInst *Inst, uint64_t Imm,
242
               uint64_t Address, const void *Decoder)
243
34.5k
{
244
34.5k
  return CONCAT(decodeUImmOperand, 4)(Inst, Imm);
245
34.5k
}
246
247
static DecodeStatus decodeU8ImmOperand(MCInst *Inst, uint64_t Imm,
248
               uint64_t Address, const void *Decoder)
249
8.85k
{
250
8.85k
  return CONCAT(decodeUImmOperand, 8)(Inst, Imm);
251
8.85k
}
252
253
static DecodeStatus decodeU12ImmOperand(MCInst *Inst, uint64_t Imm,
254
          uint64_t Address, const void *Decoder)
255
83.5k
{
256
83.5k
  return CONCAT(decodeUImmOperand, 12)(Inst, Imm);
257
83.5k
}
258
259
static DecodeStatus decodeU16ImmOperand(MCInst *Inst, uint64_t Imm,
260
          uint64_t Address, const void *Decoder)
261
2.32k
{
262
2.32k
  return CONCAT(decodeUImmOperand, 16)(Inst, Imm);
263
2.32k
}
264
265
static DecodeStatus decodeU32ImmOperand(MCInst *Inst, uint64_t Imm,
266
          uint64_t Address, const void *Decoder)
267
1.49k
{
268
1.49k
  return CONCAT(decodeUImmOperand, 32)(Inst, Imm);
269
1.49k
}
270
271
static DecodeStatus decodeS8ImmOperand(MCInst *Inst, uint64_t Imm,
272
               uint64_t Address, const void *Decoder)
273
3.02k
{
274
3.02k
  return CONCAT(decodeSImmOperand, 8)(Inst, Imm);
275
3.02k
}
276
277
static DecodeStatus decodeS16ImmOperand(MCInst *Inst, uint64_t Imm,
278
          uint64_t Address, const void *Decoder)
279
5.52k
{
280
5.52k
  return CONCAT(decodeSImmOperand, 16)(Inst, Imm);
281
5.52k
}
282
283
static DecodeStatus decodeS20ImmOperand(MCInst *Inst, uint64_t Imm,
284
          uint64_t Address, const void *Decoder)
285
19.7k
{
286
19.7k
  return CONCAT(decodeSImmOperand, 20)(Inst, Imm);
287
19.7k
}
288
289
static DecodeStatus decodeS32ImmOperand(MCInst *Inst, uint64_t Imm,
290
          uint64_t Address, const void *Decoder)
291
1.16k
{
292
1.16k
  return CONCAT(decodeSImmOperand, 32)(Inst, Imm);
293
1.16k
}
294
295
#define DEFINE_decodeLenOperand(N) \
296
  static DecodeStatus CONCAT(decodeLenOperand, \
297
           N)(MCInst * Inst, uint64_t Imm, \
298
              uint64_t Address, const void *Decoder) \
299
11.4k
  { \
300
11.4k
    if (!isUIntN(N, Imm)) \
301
11.4k
      return MCDisassembler_Fail; \
302
11.4k
    MCOperand_CreateImm0(Inst, (Imm + 1)); \
303
11.4k
    return MCDisassembler_Success; \
304
11.4k
  }
SystemZDisassembler.c:decodeLenOperand_8
Line
Count
Source
299
5.37k
  { \
300
5.37k
    if (!isUIntN(N, Imm)) \
301
5.37k
      return MCDisassembler_Fail; \
302
5.37k
    MCOperand_CreateImm0(Inst, (Imm + 1)); \
303
5.37k
    return MCDisassembler_Success; \
304
5.37k
  }
SystemZDisassembler.c:decodeLenOperand_4
Line
Count
Source
299
6.06k
  { \
300
6.06k
    if (!isUIntN(N, Imm)) \
301
6.06k
      return MCDisassembler_Fail; \
302
6.06k
    MCOperand_CreateImm0(Inst, (Imm + 1)); \
303
6.06k
    return MCDisassembler_Success; \
304
6.06k
  }
305
DEFINE_decodeLenOperand(8);
306
DEFINE_decodeLenOperand(4);
307
308
#define DEFINE_decodePCDBLOperand(N) \
309
  static DecodeStatus CONCAT(decodePCDBLOperand, N)( \
310
    MCInst * Inst, uint64_t Imm, uint64_t Address, bool isBranch, \
311
    const void *Decoder) \
312
7.70k
  { \
313
7.70k
    CS_ASSERT((isUIntN(N, Imm) && "Invalid PC-relative offset")); \
314
7.70k
    uint64_t Value = SignExtend64((Imm), N) * 2 + Address; \
315
7.70k
\
316
7.70k
    if (!tryAddingSymbolicOperand(Value, isBranch, Address, 2, \
317
7.70k
                N / 8, Inst, Decoder)) \
318
7.70k
      MCOperand_CreateImm0(Inst, (Value)); \
319
7.70k
\
320
7.70k
    return MCDisassembler_Success; \
321
7.70k
  }
SystemZDisassembler.c:decodePCDBLOperand_16
Line
Count
Source
312
4.22k
  { \
313
4.22k
    CS_ASSERT((isUIntN(N, Imm) && "Invalid PC-relative offset")); \
314
4.22k
    uint64_t Value = SignExtend64((Imm), N) * 2 + Address; \
315
4.22k
\
316
4.22k
    if (!tryAddingSymbolicOperand(Value, isBranch, Address, 2, \
317
4.22k
                N / 8, Inst, Decoder)) \
318
4.22k
      MCOperand_CreateImm0(Inst, (Value)); \
319
4.22k
\
320
4.22k
    return MCDisassembler_Success; \
321
4.22k
  }
SystemZDisassembler.c:decodePCDBLOperand_32
Line
Count
Source
312
2.93k
  { \
313
2.93k
    CS_ASSERT((isUIntN(N, Imm) && "Invalid PC-relative offset")); \
314
2.93k
    uint64_t Value = SignExtend64((Imm), N) * 2 + Address; \
315
2.93k
\
316
2.93k
    if (!tryAddingSymbolicOperand(Value, isBranch, Address, 2, \
317
2.93k
                N / 8, Inst, Decoder)) \
318
2.93k
      MCOperand_CreateImm0(Inst, (Value)); \
319
2.93k
\
320
2.93k
    return MCDisassembler_Success; \
321
2.93k
  }
SystemZDisassembler.c:decodePCDBLOperand_12
Line
Count
Source
312
273
  { \
313
273
    CS_ASSERT((isUIntN(N, Imm) && "Invalid PC-relative offset")); \
314
273
    uint64_t Value = SignExtend64((Imm), N) * 2 + Address; \
315
273
\
316
273
    if (!tryAddingSymbolicOperand(Value, isBranch, Address, 2, \
317
273
                N / 8, Inst, Decoder)) \
318
273
      MCOperand_CreateImm0(Inst, (Value)); \
319
273
\
320
273
    return MCDisassembler_Success; \
321
273
  }
SystemZDisassembler.c:decodePCDBLOperand_24
Line
Count
Source
312
273
  { \
313
273
    CS_ASSERT((isUIntN(N, Imm) && "Invalid PC-relative offset")); \
314
273
    uint64_t Value = SignExtend64((Imm), N) * 2 + Address; \
315
273
\
316
273
    if (!tryAddingSymbolicOperand(Value, isBranch, Address, 2, \
317
273
                N / 8, Inst, Decoder)) \
318
273
      MCOperand_CreateImm0(Inst, (Value)); \
319
273
\
320
273
    return MCDisassembler_Success; \
321
273
  }
322
DEFINE_decodePCDBLOperand(12);
323
DEFINE_decodePCDBLOperand(16);
324
DEFINE_decodePCDBLOperand(24);
325
DEFINE_decodePCDBLOperand(32);
326
327
static DecodeStatus decodePC12DBLBranchOperand(MCInst *Inst, uint64_t Imm,
328
                 uint64_t Address,
329
                 const void *Decoder)
330
273
{
331
273
  return CONCAT(decodePCDBLOperand, 12)(Inst, Imm, Address, true,
332
273
                Decoder);
333
273
}
334
335
static DecodeStatus decodePC16DBLBranchOperand(MCInst *Inst, uint64_t Imm,
336
                 uint64_t Address,
337
                 const void *Decoder)
338
4.22k
{
339
4.22k
  return CONCAT(decodePCDBLOperand, 16)(Inst, Imm, Address, true,
340
4.22k
                Decoder);
341
4.22k
}
342
343
static DecodeStatus decodePC24DBLBranchOperand(MCInst *Inst, uint64_t Imm,
344
                 uint64_t Address,
345
                 const void *Decoder)
346
273
{
347
273
  return CONCAT(decodePCDBLOperand, 24)(Inst, Imm, Address, true,
348
273
                Decoder);
349
273
}
350
351
static DecodeStatus decodePC32DBLBranchOperand(MCInst *Inst, uint64_t Imm,
352
                 uint64_t Address,
353
                 const void *Decoder)
354
1.37k
{
355
1.37k
  return CONCAT(decodePCDBLOperand, 32)(Inst, Imm, Address, true,
356
1.37k
                Decoder);
357
1.37k
}
358
359
static DecodeStatus decodePC32DBLOperand(MCInst *Inst, uint64_t Imm,
360
           uint64_t Address, const void *Decoder)
361
1.55k
{
362
1.55k
  return CONCAT(decodePCDBLOperand, 32)(Inst, Imm, Address, false,
363
1.55k
                Decoder);
364
1.55k
}
365
366
#include "SystemZGenDisassemblerTables.inc"
367
368
static DecodeStatus getInstruction(MCInst *MI, uint16_t *Size,
369
           const uint8_t *Bytes, size_t BytesLen,
370
           uint64_t Address, SStream *CS)
371
169k
{
372
  // Get the first two bytes of the instruction.
373
169k
  *Size = 0;
374
169k
  if (BytesLen < 2)
375
741
    return MCDisassembler_Fail;
376
377
  // The top 2 bits of the first byte specify the size.
378
169k
  const uint8_t *Table;
379
169k
  uint64_t Inst = 0;
380
169k
  if (Bytes[0] < 0x40) {
381
38.5k
    *Size = 2;
382
38.5k
    Table = DecoderTable16;
383
38.5k
    Inst = readBytes16(MI, Bytes);
384
130k
  } else if (Bytes[0] < 0xc0) {
385
55.4k
    if (BytesLen < 4) {
386
273
      return MCDisassembler_Fail;
387
273
    }
388
55.1k
    *Size = 4;
389
55.1k
    Table = DecoderTable32;
390
55.1k
    Inst = readBytes32(MI, Bytes);
391
75.0k
  } else {
392
75.0k
    if (BytesLen < 6) {
393
485
      return MCDisassembler_Fail;
394
485
    }
395
74.5k
    *Size = 6;
396
74.5k
    Table = DecoderTable48;
397
74.5k
    Inst = readBytes48(MI, Bytes);
398
74.5k
  }
399
400
  // Read any remaining bytes.
401
168k
  if (BytesLen < *Size) {
402
0
    *Size = BytesLen;
403
0
    return MCDisassembler_Fail;
404
0
  }
405
406
168k
  return decodeInstruction_8(Table, MI, Inst, Address, NULL);
407
168k
}
408
409
DecodeStatus SystemZ_LLVM_getInstruction(csh handle, const uint8_t *Bytes,
410
           size_t BytesLen, MCInst *MI,
411
           uint16_t *Size, uint64_t Address,
412
           void *Info)
413
169k
{
414
  return getInstruction(MI, Size, Bytes, BytesLen, MI->address, NULL);
415
169k
}