23 #define DEBUG_TYPE "systemz-disassembler" 33 ~SystemZDisassembler()
override =
default;
46 return new SystemZDisassembler(STI, Ctx);
77 const void *Decoder) {
84 const unsigned *Regs,
unsigned Size) {
85 assert(RegNo < Size &&
"Invalid register");
95 const void *Decoder) {
101 const void *Decoder) {
107 const void *Decoder) {
113 const void *Decoder) {
119 const void *Decoder) {
125 const void *Decoder) {
131 const void *Decoder) {
137 const void *Decoder) {
143 const void *Decoder) {
149 const void *Decoder) {
155 const void *Decoder) {
161 const void *Decoder) {
167 const void *Decoder) {
188 uint64_t
Address,
const void *Decoder) {
189 return decodeUImmOperand<1>(Inst, Imm);
193 uint64_t
Address,
const void *Decoder) {
194 return decodeUImmOperand<2>(Inst, Imm);
198 uint64_t
Address,
const void *Decoder) {
199 return decodeUImmOperand<3>(Inst, Imm);
203 uint64_t
Address,
const void *Decoder) {
204 return decodeUImmOperand<4>(Inst, Imm);
208 uint64_t
Address,
const void *Decoder) {
209 return decodeUImmOperand<6>(Inst, Imm);
213 uint64_t
Address,
const void *Decoder) {
214 return decodeUImmOperand<8>(Inst, Imm);
218 uint64_t
Address,
const void *Decoder) {
219 return decodeUImmOperand<12>(Inst, Imm);
223 uint64_t
Address,
const void *Decoder) {
224 return decodeUImmOperand<16>(Inst, Imm);
228 uint64_t
Address,
const void *Decoder) {
229 return decodeUImmOperand<32>(Inst, Imm);
233 uint64_t
Address,
const void *Decoder) {
234 return decodeSImmOperand<8>(Inst, Imm);
238 uint64_t
Address,
const void *Decoder) {
239 return decodeSImmOperand<16>(Inst, Imm);
243 uint64_t
Address,
const void *Decoder) {
244 return decodeSImmOperand<32>(Inst, Imm);
251 const void *Decoder) {
252 assert(isUInt<N>(Imm) &&
"Invalid PC-relative offset");
253 uint64_t
Value = SignExtend64<N>(Imm) * 2 + Address;
264 const void *Decoder) {
265 return decodePCDBLOperand<12>(Inst, Imm,
Address,
true, Decoder);
270 const void *Decoder) {
271 return decodePCDBLOperand<16>(Inst, Imm,
Address,
true, Decoder);
276 const void *Decoder) {
277 return decodePCDBLOperand<24>(Inst, Imm,
Address,
true, Decoder);
282 const void *Decoder) {
283 return decodePCDBLOperand<32>(Inst, Imm,
Address,
true, Decoder);
288 const void *Decoder) {
289 return decodePCDBLOperand<32>(Inst, Imm,
Address,
false, Decoder);
293 const unsigned *Regs) {
294 uint64_t
Base = Field >> 12;
295 uint64_t Disp = Field & 0xfff;
296 assert(Base < 16 &&
"Invalid BDAddr12");
303 const unsigned *Regs) {
304 uint64_t
Base = Field >> 20;
305 uint64_t Disp = ((Field << 12) & 0xff000) | ((Field >> 8) & 0xfff);
306 assert(Base < 16 &&
"Invalid BDAddr20");
313 const unsigned *Regs) {
314 uint64_t
Index = Field >> 16;
315 uint64_t
Base = (Field >> 12) & 0xf;
316 uint64_t Disp = Field & 0xfff;
317 assert(Index < 16 &&
"Invalid BDXAddr12");
325 const unsigned *Regs) {
326 uint64_t
Index = Field >> 24;
327 uint64_t
Base = (Field >> 20) & 0xf;
328 uint64_t Disp = ((Field & 0xfff00) >> 8) | ((Field & 0xff) << 12);
329 assert(Index < 16 &&
"Invalid BDXAddr20");
337 const unsigned *Regs) {
338 uint64_t Length = Field >> 16;
339 uint64_t
Base = (Field >> 12) & 0xf;
340 uint64_t Disp = Field & 0xfff;
341 assert(Length < 16 &&
"Invalid BDLAddr12Len4");
349 const unsigned *Regs) {
350 uint64_t Length = Field >> 16;
351 uint64_t
Base = (Field >> 12) & 0xf;
352 uint64_t Disp = Field & 0xfff;
353 assert(Length < 256 &&
"Invalid BDLAddr12Len8");
361 const unsigned *Regs) {
362 uint64_t Length = Field >> 16;
363 uint64_t
Base = (Field >> 12) & 0xf;
364 uint64_t Disp = Field & 0xfff;
365 assert(Length < 16 &&
"Invalid BDRAddr12");
373 const unsigned *Regs) {
374 uint64_t
Index = Field >> 16;
375 uint64_t
Base = (Field >> 12) & 0xf;
376 uint64_t Disp = Field & 0xfff;
377 assert(Index < 32 &&
"Invalid BDVAddr12");
386 const void *Decoder) {
392 const void *Decoder) {
398 const void *Decoder) {
404 const void *Decoder) {
410 const void *Decoder) {
416 const void *Decoder) {
423 const void *Decoder) {
430 const void *Decoder) {
437 const void *Decoder) {
443 const void *Decoder) {
447 #include "SystemZGenDisassemblerTables.inc" 456 if (Bytes.
size() < 2)
460 const uint8_t *Table;
461 if (Bytes[0] < 0x40) {
463 Table = DecoderTable16;
464 }
else if (Bytes[0] < 0xc0) {
466 Table = DecoderTable32;
469 Table = DecoderTable48;
478 for (uint64_t
I = 0;
I <
Size; ++
I)
479 Inst = (Inst << 8) | Bytes[
I];
static DecodeStatus decodeBDAddr12Operand(MCInst &Inst, uint64_t Field, const unsigned *Regs)
const unsigned GR32Regs[16]
static DecodeStatus decodePCDBLOperand(MCInst &Inst, uint64_t Imm, uint64_t Address, bool isBranch, const void *Decoder)
This class represents lattice values for constants.
const unsigned FP128Regs[16]
static DecodeStatus decodeBDAddr32Disp12Operand(MCInst &Inst, uint64_t Field, uint64_t Address, const void *Decoder)
DecodeStatus
Ternary decode status.
static DecodeStatus decodeBDAddr20Operand(MCInst &Inst, uint64_t Field, const unsigned *Regs)
Superclass for all disassemblers.
bool tryAddingSymbolicOperand(MCInst &Inst, int64_t Value, uint64_t Address, bool IsBranch, uint64_t Offset, uint64_t InstSize) const
static DecodeStatus decodePC32DBLOperand(MCInst &Inst, uint64_t Imm, uint64_t Address, const void *Decoder)
static DecodeStatus decodePC16DBLBranchOperand(MCInst &Inst, uint64_t Imm, uint64_t Address, const void *Decoder)
static DecodeStatus decodeBDXAddr12Operand(MCInst &Inst, uint64_t Field, const unsigned *Regs)
static DecodeStatus decodeU1ImmOperand(MCInst &Inst, uint64_t Imm, uint64_t Address, const void *Decoder)
MCDisassembler::DecodeStatus DecodeStatus
static DecodeStatus DecodeADDR64BitRegisterClass(MCInst &Inst, uint64_t RegNo, uint64_t Address, const void *Decoder)
static DecodeStatus DecodeVR64BitRegisterClass(MCInst &Inst, uint64_t RegNo, uint64_t Address, const void *Decoder)
static void RegisterMCDisassembler(Target &T, Target::MCDisassemblerCtorTy Fn)
RegisterMCDisassembler - Register a MCDisassembler implementation for the given target.
const unsigned FP32Regs[16]
static DecodeStatus DecodeFP32BitRegisterClass(MCInst &Inst, uint64_t RegNo, uint64_t Address, const void *Decoder)
static DecodeStatus decodeBDVAddr12Operand(MCInst &Inst, uint64_t Field, const unsigned *Regs)
static DecodeStatus decodeBDVAddr64Disp12Operand(MCInst &Inst, uint64_t Field, uint64_t Address, const void *Decoder)
static DecodeStatus DecodeFP128BitRegisterClass(MCInst &Inst, uint64_t RegNo, uint64_t Address, const void *Decoder)
const unsigned VR64Regs[32]
static DecodeStatus decodeS32ImmOperand(MCInst &Inst, uint64_t Imm, uint64_t Address, const void *Decoder)
static DecodeStatus decodeBDLAddr64Disp12Len4Operand(MCInst &Inst, uint64_t Field, uint64_t Address, const void *Decoder)
static MCOperand createReg(unsigned Reg)
static DecodeStatus decodeU6ImmOperand(MCInst &Inst, uint64_t Imm, uint64_t Address, const void *Decoder)
static DecodeStatus decodeBDAddr64Disp20Operand(MCInst &Inst, uint64_t Field, uint64_t Address, const void *Decoder)
const unsigned AR32Regs[16]
static DecodeStatus decodeBDXAddr20Operand(MCInst &Inst, uint64_t Field, const unsigned *Regs)
const unsigned GRH32Regs[16]
static MCDisassembler * createSystemZDisassembler(const Target &T, const MCSubtargetInfo &STI, MCContext &Ctx)
Context object for machine code objects.
static DecodeStatus decodeU16ImmOperand(MCInst &Inst, uint64_t Imm, uint64_t Address, const void *Decoder)
static bool tryAddingSymbolicOperand(int64_t Value, bool isBranch, uint64_t Address, uint64_t Offset, uint64_t Width, MCInst &MI, const void *Decoder)
tryAddingSymbolicOperand - trys to add a symbolic operand in place of the immediate Value in the MCIn...
int decodeInstruction(InternalInstruction *insn, byteReader_t reader, const void *readerArg, dlog_t logger, void *loggerArg, const void *miiArg, uint64_t startLoc, DisassemblerMode mode)
Decode one instruction and store the decoding results in a buffer provided by the consumer...
static DecodeStatus decodeBDAddr32Disp20Operand(MCInst &Inst, uint64_t Field, uint64_t Address, const void *Decoder)
static DecodeStatus DecodeGR32BitRegisterClass(MCInst &Inst, uint64_t RegNo, uint64_t Address, const void *Decoder)
static DecodeStatus decodeBDAddr64Disp12Operand(MCInst &Inst, uint64_t Field, uint64_t Address, const void *Decoder)
const unsigned CR64Regs[16]
Instances of this class represent a single low-level machine instruction.
static DecodeStatus decodeBDXAddr64Disp12Operand(MCInst &Inst, uint64_t Field, uint64_t Address, const void *Decoder)
static DecodeStatus decodePC12DBLBranchOperand(MCInst &Inst, uint64_t Imm, uint64_t Address, const void *Decoder)
static DecodeStatus decodeS8ImmOperand(MCInst &Inst, uint64_t Imm, uint64_t Address, const void *Decoder)
static DecodeStatus decodeBDLAddr12Len8Operand(MCInst &Inst, uint64_t Field, const unsigned *Regs)
size_t size() const
size - Get the array size.
static DecodeStatus decodeU32ImmOperand(MCInst &Inst, uint64_t Imm, uint64_t Address, const void *Decoder)
static DecodeStatus DecodeGR64BitRegisterClass(MCInst &Inst, uint64_t RegNo, uint64_t Address, const void *Decoder)
static DecodeStatus decodeUImmOperand(MCInst &Inst, uint64_t Imm)
static DecodeStatus decodeBDXAddr64Disp20Operand(MCInst &Inst, uint64_t Field, uint64_t Address, const void *Decoder)
static DecodeStatus decodeBDLAddr12Len4Operand(MCInst &Inst, uint64_t Field, const unsigned *Regs)
static DecodeStatus decodeU2ImmOperand(MCInst &Inst, uint64_t Imm, uint64_t Address, const void *Decoder)
static DecodeStatus decodeS16ImmOperand(MCInst &Inst, uint64_t Imm, uint64_t Address, const void *Decoder)
static DecodeStatus decodeBDRAddr12Operand(MCInst &Inst, uint64_t Field, const unsigned *Regs)
static DecodeStatus decodeBDLAddr64Disp12Len8Operand(MCInst &Inst, uint64_t Field, uint64_t Address, const void *Decoder)
const unsigned FP64Regs[16]
const unsigned GR128Regs[16]
const unsigned GR64Regs[16]
static DecodeStatus decodeU8ImmOperand(MCInst &Inst, uint64_t Imm, uint64_t Address, const void *Decoder)
static DecodeStatus DecodeAR32BitRegisterClass(MCInst &Inst, uint64_t RegNo, uint64_t Address, const void *Decoder)
Target - Wrapper for Target specific information.
static DecodeStatus decodeU12ImmOperand(MCInst &Inst, uint64_t Imm, uint64_t Address, const void *Decoder)
Target & getTheSystemZTarget()
static DecodeStatus decodeU4ImmOperand(MCInst &Inst, uint64_t Imm, uint64_t Address, const void *Decoder)
static DecodeStatus DecodeGRH32BitRegisterClass(MCInst &Inst, uint64_t RegNo, uint64_t Address, const void *Decoder)
Generic base class for all target subtargets.
static DecodeStatus DecodeGR128BitRegisterClass(MCInst &Inst, uint64_t RegNo, uint64_t Address, const void *Decoder)
static DecodeStatus decodeSImmOperand(MCInst &Inst, uint64_t Imm)
const unsigned VR32Regs[32]
static DecodeStatus decodeU3ImmOperand(MCInst &Inst, uint64_t Imm, uint64_t Address, const void *Decoder)
void LLVMInitializeSystemZDisassembler()
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
static bool isBranch(unsigned Opcode)
static DecodeStatus DecodeVR128BitRegisterClass(MCInst &Inst, uint64_t RegNo, uint64_t Address, const void *Decoder)
LLVM Value Representation.
static DecodeStatus decodePC24DBLBranchOperand(MCInst &Inst, uint64_t Imm, uint64_t Address, const void *Decoder)
static DecodeStatus DecodeFP64BitRegisterClass(MCInst &Inst, uint64_t RegNo, uint64_t Address, const void *Decoder)
This class implements an extremely fast bulk output stream that can only output to a stream...
void addOperand(const MCOperand &Op)
static DecodeStatus decodeRegisterClass(MCInst &Inst, uint64_t RegNo, const unsigned *Regs, unsigned Size)
static DecodeStatus decodePC32DBLBranchOperand(MCInst &Inst, uint64_t Imm, uint64_t Address, const void *Decoder)
static DecodeStatus DecodeCR64BitRegisterClass(MCInst &Inst, uint64_t RegNo, uint64_t Address, const void *Decoder)
static MCOperand createImm(int64_t Val)
const unsigned VR128Regs[32]
static DecodeStatus decodeBDRAddr64Disp12Operand(MCInst &Inst, uint64_t Field, uint64_t Address, const void *Decoder)
static DecodeStatus DecodeVR32BitRegisterClass(MCInst &Inst, uint64_t RegNo, uint64_t Address, const void *Decoder)