1 //===- SparcDisassembler.cpp - Disassembler for Sparc -----------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file is part of the Sparc Disassembler.
12 //===----------------------------------------------------------------------===//
14 #include "MCTargetDesc/SparcMCTargetDesc.h"
15 #include "llvm/MC/MCAsmInfo.h"
16 #include "llvm/MC/MCContext.h"
17 #include "llvm/MC/MCDisassembler/MCDisassembler.h"
18 #include "llvm/MC/MCFixedLenDisassembler.h"
19 #include "llvm/MC/MCInst.h"
20 #include "llvm/Support/TargetRegistry.h"
24 #define DEBUG_TYPE "sparc-disassembler"
26 typedef MCDisassembler::DecodeStatus DecodeStatus
;
30 /// A disassembler class for Sparc.
31 class SparcDisassembler
: public MCDisassembler
{
33 SparcDisassembler(const MCSubtargetInfo
&STI
, MCContext
&Ctx
)
34 : MCDisassembler(STI
, Ctx
) {}
35 virtual ~SparcDisassembler() {}
37 DecodeStatus
getInstruction(MCInst
&Instr
, uint64_t &Size
,
38 ArrayRef
<uint8_t> Bytes
, uint64_t Address
,
40 raw_ostream
&CStream
) const override
;
45 Target
&getTheSparcTarget();
46 Target
&getTheSparcV9Target();
47 Target
&getTheSparcelTarget();
50 static MCDisassembler
*createSparcDisassembler(const Target
&T
,
51 const MCSubtargetInfo
&STI
,
53 return new SparcDisassembler(STI
, Ctx
);
57 extern "C" void LLVMInitializeSparcDisassembler() {
58 // Register the disassembler.
59 TargetRegistry::RegisterMCDisassembler(getTheSparcTarget(),
60 createSparcDisassembler
);
61 TargetRegistry::RegisterMCDisassembler(getTheSparcV9Target(),
62 createSparcDisassembler
);
63 TargetRegistry::RegisterMCDisassembler(getTheSparcelTarget(),
64 createSparcDisassembler
);
67 static const unsigned IntRegDecoderTable
[] = {
68 SP::G0
, SP::G1
, SP::G2
, SP::G3
,
69 SP::G4
, SP::G5
, SP::G6
, SP::G7
,
70 SP::O0
, SP::O1
, SP::O2
, SP::O3
,
71 SP::O4
, SP::O5
, SP::O6
, SP::O7
,
72 SP::L0
, SP::L1
, SP::L2
, SP::L3
,
73 SP::L4
, SP::L5
, SP::L6
, SP::L7
,
74 SP::I0
, SP::I1
, SP::I2
, SP::I3
,
75 SP::I4
, SP::I5
, SP::I6
, SP::I7
};
77 static const unsigned FPRegDecoderTable
[] = {
78 SP::F0
, SP::F1
, SP::F2
, SP::F3
,
79 SP::F4
, SP::F5
, SP::F6
, SP::F7
,
80 SP::F8
, SP::F9
, SP::F10
, SP::F11
,
81 SP::F12
, SP::F13
, SP::F14
, SP::F15
,
82 SP::F16
, SP::F17
, SP::F18
, SP::F19
,
83 SP::F20
, SP::F21
, SP::F22
, SP::F23
,
84 SP::F24
, SP::F25
, SP::F26
, SP::F27
,
85 SP::F28
, SP::F29
, SP::F30
, SP::F31
};
87 static const unsigned DFPRegDecoderTable
[] = {
88 SP::D0
, SP::D16
, SP::D1
, SP::D17
,
89 SP::D2
, SP::D18
, SP::D3
, SP::D19
,
90 SP::D4
, SP::D20
, SP::D5
, SP::D21
,
91 SP::D6
, SP::D22
, SP::D7
, SP::D23
,
92 SP::D8
, SP::D24
, SP::D9
, SP::D25
,
93 SP::D10
, SP::D26
, SP::D11
, SP::D27
,
94 SP::D12
, SP::D28
, SP::D13
, SP::D29
,
95 SP::D14
, SP::D30
, SP::D15
, SP::D31
};
97 static const unsigned QFPRegDecoderTable
[] = {
98 SP::Q0
, SP::Q8
, ~0U, ~0U,
99 SP::Q1
, SP::Q9
, ~0U, ~0U,
100 SP::Q2
, SP::Q10
, ~0U, ~0U,
101 SP::Q3
, SP::Q11
, ~0U, ~0U,
102 SP::Q4
, SP::Q12
, ~0U, ~0U,
103 SP::Q5
, SP::Q13
, ~0U, ~0U,
104 SP::Q6
, SP::Q14
, ~0U, ~0U,
105 SP::Q7
, SP::Q15
, ~0U, ~0U } ;
107 static const unsigned FCCRegDecoderTable
[] = {
108 SP::FCC0
, SP::FCC1
, SP::FCC2
, SP::FCC3
};
110 static const unsigned ASRRegDecoderTable
[] = {
111 SP::Y
, SP::ASR1
, SP::ASR2
, SP::ASR3
,
112 SP::ASR4
, SP::ASR5
, SP::ASR6
, SP::ASR7
,
113 SP::ASR8
, SP::ASR9
, SP::ASR10
, SP::ASR11
,
114 SP::ASR12
, SP::ASR13
, SP::ASR14
, SP::ASR15
,
115 SP::ASR16
, SP::ASR17
, SP::ASR18
, SP::ASR19
,
116 SP::ASR20
, SP::ASR21
, SP::ASR22
, SP::ASR23
,
117 SP::ASR24
, SP::ASR25
, SP::ASR26
, SP::ASR27
,
118 SP::ASR28
, SP::ASR29
, SP::ASR30
, SP::ASR31
};
120 static const unsigned PRRegDecoderTable
[] = {
121 SP::TPC
, SP::TNPC
, SP::TSTATE
, SP::TT
, SP::TICK
, SP::TBA
, SP::PSTATE
,
122 SP::TL
, SP::PIL
, SP::CWP
, SP::CANSAVE
, SP::CANRESTORE
, SP::CLEANWIN
,
123 SP::OTHERWIN
, SP::WSTATE
126 static const uint16_t IntPairDecoderTable
[] = {
127 SP::G0_G1
, SP::G2_G3
, SP::G4_G5
, SP::G6_G7
,
128 SP::O0_O1
, SP::O2_O3
, SP::O4_O5
, SP::O6_O7
,
129 SP::L0_L1
, SP::L2_L3
, SP::L4_L5
, SP::L6_L7
,
130 SP::I0_I1
, SP::I2_I3
, SP::I4_I5
, SP::I6_I7
,
133 static const unsigned CPRegDecoderTable
[] = {
134 SP::C0
, SP::C1
, SP::C2
, SP::C3
,
135 SP::C4
, SP::C5
, SP::C6
, SP::C7
,
136 SP::C8
, SP::C9
, SP::C10
, SP::C11
,
137 SP::C12
, SP::C13
, SP::C14
, SP::C15
,
138 SP::C16
, SP::C17
, SP::C18
, SP::C19
,
139 SP::C20
, SP::C21
, SP::C22
, SP::C23
,
140 SP::C24
, SP::C25
, SP::C26
, SP::C27
,
141 SP::C28
, SP::C29
, SP::C30
, SP::C31
145 static const uint16_t CPPairDecoderTable
[] = {
146 SP::C0_C1
, SP::C2_C3
, SP::C4_C5
, SP::C6_C7
,
147 SP::C8_C9
, SP::C10_C11
, SP::C12_C13
, SP::C14_C15
,
148 SP::C16_C17
, SP::C18_C19
, SP::C20_C21
, SP::C22_C23
,
149 SP::C24_C25
, SP::C26_C27
, SP::C28_C29
, SP::C30_C31
152 static DecodeStatus
DecodeIntRegsRegisterClass(MCInst
&Inst
,
155 const void *Decoder
) {
157 return MCDisassembler::Fail
;
158 unsigned Reg
= IntRegDecoderTable
[RegNo
];
159 Inst
.addOperand(MCOperand::createReg(Reg
));
160 return MCDisassembler::Success
;
163 static DecodeStatus
DecodeI64RegsRegisterClass(MCInst
&Inst
,
166 const void *Decoder
) {
168 return MCDisassembler::Fail
;
169 unsigned Reg
= IntRegDecoderTable
[RegNo
];
170 Inst
.addOperand(MCOperand::createReg(Reg
));
171 return MCDisassembler::Success
;
175 static DecodeStatus
DecodeFPRegsRegisterClass(MCInst
&Inst
,
178 const void *Decoder
) {
180 return MCDisassembler::Fail
;
181 unsigned Reg
= FPRegDecoderTable
[RegNo
];
182 Inst
.addOperand(MCOperand::createReg(Reg
));
183 return MCDisassembler::Success
;
187 static DecodeStatus
DecodeDFPRegsRegisterClass(MCInst
&Inst
,
190 const void *Decoder
) {
192 return MCDisassembler::Fail
;
193 unsigned Reg
= DFPRegDecoderTable
[RegNo
];
194 Inst
.addOperand(MCOperand::createReg(Reg
));
195 return MCDisassembler::Success
;
199 static DecodeStatus
DecodeQFPRegsRegisterClass(MCInst
&Inst
,
202 const void *Decoder
) {
204 return MCDisassembler::Fail
;
206 unsigned Reg
= QFPRegDecoderTable
[RegNo
];
208 return MCDisassembler::Fail
;
209 Inst
.addOperand(MCOperand::createReg(Reg
));
210 return MCDisassembler::Success
;
213 static DecodeStatus
DecodeCPRegsRegisterClass(MCInst
&Inst
,
216 const void *Decoder
) {
218 return MCDisassembler::Fail
;
219 unsigned Reg
= CPRegDecoderTable
[RegNo
];
220 Inst
.addOperand(MCOperand::createReg(Reg
));
221 return MCDisassembler::Success
;
224 static DecodeStatus
DecodeFCCRegsRegisterClass(MCInst
&Inst
, unsigned RegNo
,
226 const void *Decoder
) {
228 return MCDisassembler::Fail
;
229 Inst
.addOperand(MCOperand::createReg(FCCRegDecoderTable
[RegNo
]));
230 return MCDisassembler::Success
;
233 static DecodeStatus
DecodeASRRegsRegisterClass(MCInst
&Inst
, unsigned RegNo
,
235 const void *Decoder
) {
237 return MCDisassembler::Fail
;
238 Inst
.addOperand(MCOperand::createReg(ASRRegDecoderTable
[RegNo
]));
239 return MCDisassembler::Success
;
242 static DecodeStatus
DecodePRRegsRegisterClass(MCInst
&Inst
, unsigned RegNo
,
244 const void *Decoder
) {
245 if (RegNo
>= array_lengthof(PRRegDecoderTable
))
246 return MCDisassembler::Fail
;
247 Inst
.addOperand(MCOperand::createReg(PRRegDecoderTable
[RegNo
]));
248 return MCDisassembler::Success
;
251 static DecodeStatus
DecodeIntPairRegisterClass(MCInst
&Inst
, unsigned RegNo
,
252 uint64_t Address
, const void *Decoder
) {
253 DecodeStatus S
= MCDisassembler::Success
;
256 return MCDisassembler::Fail
;
259 S
= MCDisassembler::SoftFail
;
261 unsigned RegisterPair
= IntPairDecoderTable
[RegNo
/2];
262 Inst
.addOperand(MCOperand::createReg(RegisterPair
));
266 static DecodeStatus
DecodeCPPairRegisterClass(MCInst
&Inst
, unsigned RegNo
,
267 uint64_t Address
, const void *Decoder
) {
269 return MCDisassembler::Fail
;
271 unsigned RegisterPair
= CPPairDecoderTable
[RegNo
/2];
272 Inst
.addOperand(MCOperand::createReg(RegisterPair
));
273 return MCDisassembler::Success
;
276 static DecodeStatus
DecodeLoadInt(MCInst
&Inst
, unsigned insn
, uint64_t Address
,
277 const void *Decoder
);
278 static DecodeStatus
DecodeLoadIntPair(MCInst
&Inst
, unsigned insn
, uint64_t Address
,
279 const void *Decoder
);
280 static DecodeStatus
DecodeLoadFP(MCInst
&Inst
, unsigned insn
, uint64_t Address
,
281 const void *Decoder
);
282 static DecodeStatus
DecodeLoadDFP(MCInst
&Inst
, unsigned insn
, uint64_t Address
,
283 const void *Decoder
);
284 static DecodeStatus
DecodeLoadQFP(MCInst
&Inst
, unsigned insn
, uint64_t Address
,
285 const void *Decoder
);
286 static DecodeStatus
DecodeLoadCP(MCInst
&Inst
, unsigned insn
, uint64_t Address
,
287 const void *Decoder
);
288 static DecodeStatus
DecodeLoadCPPair(MCInst
&Inst
, unsigned insn
, uint64_t Address
,
289 const void *Decoder
);
290 static DecodeStatus
DecodeStoreInt(MCInst
&Inst
, unsigned insn
,
291 uint64_t Address
, const void *Decoder
);
292 static DecodeStatus
DecodeStoreIntPair(MCInst
&Inst
, unsigned insn
,
293 uint64_t Address
, const void *Decoder
);
294 static DecodeStatus
DecodeStoreFP(MCInst
&Inst
, unsigned insn
,
295 uint64_t Address
, const void *Decoder
);
296 static DecodeStatus
DecodeStoreDFP(MCInst
&Inst
, unsigned insn
,
297 uint64_t Address
, const void *Decoder
);
298 static DecodeStatus
DecodeStoreQFP(MCInst
&Inst
, unsigned insn
,
299 uint64_t Address
, const void *Decoder
);
300 static DecodeStatus
DecodeStoreCP(MCInst
&Inst
, unsigned insn
,
301 uint64_t Address
, const void *Decoder
);
302 static DecodeStatus
DecodeStoreCPPair(MCInst
&Inst
, unsigned insn
,
303 uint64_t Address
, const void *Decoder
);
304 static DecodeStatus
DecodeCall(MCInst
&Inst
, unsigned insn
,
305 uint64_t Address
, const void *Decoder
);
306 static DecodeStatus
DecodeSIMM13(MCInst
&Inst
, unsigned insn
,
307 uint64_t Address
, const void *Decoder
);
308 static DecodeStatus
DecodeJMPL(MCInst
&Inst
, unsigned insn
, uint64_t Address
,
309 const void *Decoder
);
310 static DecodeStatus
DecodeReturn(MCInst
&MI
, unsigned insn
, uint64_t Address
,
311 const void *Decoder
);
312 static DecodeStatus
DecodeSWAP(MCInst
&Inst
, unsigned insn
, uint64_t Address
,
313 const void *Decoder
);
314 static DecodeStatus
DecodeTRAP(MCInst
&Inst
, unsigned insn
, uint64_t Address
,
315 const void *Decoder
);
317 #include "SparcGenDisassemblerTables.inc"
319 /// Read four bytes from the ArrayRef and return 32 bit word.
320 static DecodeStatus
readInstruction32(ArrayRef
<uint8_t> Bytes
, uint64_t Address
,
321 uint64_t &Size
, uint32_t &Insn
,
322 bool IsLittleEndian
) {
323 // We want to read exactly 4 Bytes of data.
324 if (Bytes
.size() < 4) {
326 return MCDisassembler::Fail
;
329 Insn
= IsLittleEndian
330 ? (Bytes
[0] << 0) | (Bytes
[1] << 8) | (Bytes
[2] << 16) |
332 : (Bytes
[3] << 0) | (Bytes
[2] << 8) | (Bytes
[1] << 16) |
335 return MCDisassembler::Success
;
338 DecodeStatus
SparcDisassembler::getInstruction(MCInst
&Instr
, uint64_t &Size
,
339 ArrayRef
<uint8_t> Bytes
,
341 raw_ostream
&VStream
,
342 raw_ostream
&CStream
) const {
344 bool isLittleEndian
= getContext().getAsmInfo()->isLittleEndian();
345 DecodeStatus Result
=
346 readInstruction32(Bytes
, Address
, Size
, Insn
, isLittleEndian
);
347 if (Result
== MCDisassembler::Fail
)
348 return MCDisassembler::Fail
;
350 // Calling the auto-generated decoder function.
352 if (STI
.getFeatureBits()[Sparc::FeatureV9
])
354 Result
= decodeInstruction(DecoderTableSparcV932
, Instr
, Insn
, Address
, this, STI
);
358 Result
= decodeInstruction(DecoderTableSparcV832
, Instr
, Insn
, Address
, this, STI
);
360 if (Result
!= MCDisassembler::Fail
)
364 decodeInstruction(DecoderTableSparc32
, Instr
, Insn
, Address
, this, STI
);
366 if (Result
!= MCDisassembler::Fail
) {
371 return MCDisassembler::Fail
;
375 typedef DecodeStatus (*DecodeFunc
)(MCInst
&MI
, unsigned insn
, uint64_t Address
,
376 const void *Decoder
);
378 static DecodeStatus
DecodeMem(MCInst
&MI
, unsigned insn
, uint64_t Address
,
380 bool isLoad
, DecodeFunc DecodeRD
) {
381 unsigned rd
= fieldFromInstruction(insn
, 25, 5);
382 unsigned rs1
= fieldFromInstruction(insn
, 14, 5);
383 bool isImm
= fieldFromInstruction(insn
, 13, 1);
384 bool hasAsi
= fieldFromInstruction(insn
, 23, 1); // (in op3 field)
385 unsigned asi
= fieldFromInstruction(insn
, 5, 8);
389 simm13
= SignExtend32
<13>(fieldFromInstruction(insn
, 0, 13));
391 rs2
= fieldFromInstruction(insn
, 0, 5);
395 status
= DecodeRD(MI
, rd
, Address
, Decoder
);
396 if (status
!= MCDisassembler::Success
)
401 status
= DecodeIntRegsRegisterClass(MI
, rs1
, Address
, Decoder
);
402 if (status
!= MCDisassembler::Success
)
407 MI
.addOperand(MCOperand::createImm(simm13
));
409 status
= DecodeIntRegsRegisterClass(MI
, rs2
, Address
, Decoder
);
410 if (status
!= MCDisassembler::Success
)
415 MI
.addOperand(MCOperand::createImm(asi
));
418 status
= DecodeRD(MI
, rd
, Address
, Decoder
);
419 if (status
!= MCDisassembler::Success
)
422 return MCDisassembler::Success
;
425 static DecodeStatus
DecodeLoadInt(MCInst
&Inst
, unsigned insn
, uint64_t Address
,
426 const void *Decoder
) {
427 return DecodeMem(Inst
, insn
, Address
, Decoder
, true,
428 DecodeIntRegsRegisterClass
);
431 static DecodeStatus
DecodeLoadIntPair(MCInst
&Inst
, unsigned insn
, uint64_t Address
,
432 const void *Decoder
) {
433 return DecodeMem(Inst
, insn
, Address
, Decoder
, true,
434 DecodeIntPairRegisterClass
);
437 static DecodeStatus
DecodeLoadFP(MCInst
&Inst
, unsigned insn
, uint64_t Address
,
438 const void *Decoder
) {
439 return DecodeMem(Inst
, insn
, Address
, Decoder
, true,
440 DecodeFPRegsRegisterClass
);
443 static DecodeStatus
DecodeLoadDFP(MCInst
&Inst
, unsigned insn
, uint64_t Address
,
444 const void *Decoder
) {
445 return DecodeMem(Inst
, insn
, Address
, Decoder
, true,
446 DecodeDFPRegsRegisterClass
);
449 static DecodeStatus
DecodeLoadQFP(MCInst
&Inst
, unsigned insn
, uint64_t Address
,
450 const void *Decoder
) {
451 return DecodeMem(Inst
, insn
, Address
, Decoder
, true,
452 DecodeQFPRegsRegisterClass
);
455 static DecodeStatus
DecodeLoadCP(MCInst
&Inst
, unsigned insn
, uint64_t Address
,
456 const void *Decoder
) {
457 return DecodeMem(Inst
, insn
, Address
, Decoder
, true,
458 DecodeCPRegsRegisterClass
);
461 static DecodeStatus
DecodeLoadCPPair(MCInst
&Inst
, unsigned insn
, uint64_t Address
,
462 const void *Decoder
) {
463 return DecodeMem(Inst
, insn
, Address
, Decoder
, true,
464 DecodeCPPairRegisterClass
);
467 static DecodeStatus
DecodeStoreInt(MCInst
&Inst
, unsigned insn
,
468 uint64_t Address
, const void *Decoder
) {
469 return DecodeMem(Inst
, insn
, Address
, Decoder
, false,
470 DecodeIntRegsRegisterClass
);
473 static DecodeStatus
DecodeStoreIntPair(MCInst
&Inst
, unsigned insn
,
474 uint64_t Address
, const void *Decoder
) {
475 return DecodeMem(Inst
, insn
, Address
, Decoder
, false,
476 DecodeIntPairRegisterClass
);
479 static DecodeStatus
DecodeStoreFP(MCInst
&Inst
, unsigned insn
, uint64_t Address
,
480 const void *Decoder
) {
481 return DecodeMem(Inst
, insn
, Address
, Decoder
, false,
482 DecodeFPRegsRegisterClass
);
485 static DecodeStatus
DecodeStoreDFP(MCInst
&Inst
, unsigned insn
,
486 uint64_t Address
, const void *Decoder
) {
487 return DecodeMem(Inst
, insn
, Address
, Decoder
, false,
488 DecodeDFPRegsRegisterClass
);
491 static DecodeStatus
DecodeStoreQFP(MCInst
&Inst
, unsigned insn
,
492 uint64_t Address
, const void *Decoder
) {
493 return DecodeMem(Inst
, insn
, Address
, Decoder
, false,
494 DecodeQFPRegsRegisterClass
);
497 static DecodeStatus
DecodeStoreCP(MCInst
&Inst
, unsigned insn
,
498 uint64_t Address
, const void *Decoder
) {
499 return DecodeMem(Inst
, insn
, Address
, Decoder
, false,
500 DecodeCPRegsRegisterClass
);
503 static DecodeStatus
DecodeStoreCPPair(MCInst
&Inst
, unsigned insn
,
504 uint64_t Address
, const void *Decoder
) {
505 return DecodeMem(Inst
, insn
, Address
, Decoder
, false,
506 DecodeCPPairRegisterClass
);
509 static bool tryAddingSymbolicOperand(int64_t Value
, bool isBranch
,
510 uint64_t Address
, uint64_t Offset
,
511 uint64_t Width
, MCInst
&MI
,
512 const void *Decoder
) {
513 const MCDisassembler
*Dis
= static_cast<const MCDisassembler
*>(Decoder
);
514 return Dis
->tryAddingSymbolicOperand(MI
, Value
, Address
, isBranch
,
518 static DecodeStatus
DecodeCall(MCInst
&MI
, unsigned insn
,
519 uint64_t Address
, const void *Decoder
) {
520 unsigned tgt
= fieldFromInstruction(insn
, 0, 30);
522 if (!tryAddingSymbolicOperand(tgt
+Address
, false, Address
,
524 MI
.addOperand(MCOperand::createImm(tgt
));
525 return MCDisassembler::Success
;
528 static DecodeStatus
DecodeSIMM13(MCInst
&MI
, unsigned insn
,
529 uint64_t Address
, const void *Decoder
) {
530 unsigned tgt
= SignExtend32
<13>(fieldFromInstruction(insn
, 0, 13));
531 MI
.addOperand(MCOperand::createImm(tgt
));
532 return MCDisassembler::Success
;
535 static DecodeStatus
DecodeJMPL(MCInst
&MI
, unsigned insn
, uint64_t Address
,
536 const void *Decoder
) {
538 unsigned rd
= fieldFromInstruction(insn
, 25, 5);
539 unsigned rs1
= fieldFromInstruction(insn
, 14, 5);
540 unsigned isImm
= fieldFromInstruction(insn
, 13, 1);
544 simm13
= SignExtend32
<13>(fieldFromInstruction(insn
, 0, 13));
546 rs2
= fieldFromInstruction(insn
, 0, 5);
549 DecodeStatus status
= DecodeIntRegsRegisterClass(MI
, rd
, Address
, Decoder
);
550 if (status
!= MCDisassembler::Success
)
554 status
= DecodeIntRegsRegisterClass(MI
, rs1
, Address
, Decoder
);
555 if (status
!= MCDisassembler::Success
)
558 // Decode RS1 | SIMM13.
560 MI
.addOperand(MCOperand::createImm(simm13
));
562 status
= DecodeIntRegsRegisterClass(MI
, rs2
, Address
, Decoder
);
563 if (status
!= MCDisassembler::Success
)
566 return MCDisassembler::Success
;
569 static DecodeStatus
DecodeReturn(MCInst
&MI
, unsigned insn
, uint64_t Address
,
570 const void *Decoder
) {
572 unsigned rs1
= fieldFromInstruction(insn
, 14, 5);
573 unsigned isImm
= fieldFromInstruction(insn
, 13, 1);
577 simm13
= SignExtend32
<13>(fieldFromInstruction(insn
, 0, 13));
579 rs2
= fieldFromInstruction(insn
, 0, 5);
582 DecodeStatus status
= DecodeIntRegsRegisterClass(MI
, rs1
, Address
, Decoder
);
583 if (status
!= MCDisassembler::Success
)
586 // Decode RS2 | SIMM13.
588 MI
.addOperand(MCOperand::createImm(simm13
));
590 status
= DecodeIntRegsRegisterClass(MI
, rs2
, Address
, Decoder
);
591 if (status
!= MCDisassembler::Success
)
594 return MCDisassembler::Success
;
597 static DecodeStatus
DecodeSWAP(MCInst
&MI
, unsigned insn
, uint64_t Address
,
598 const void *Decoder
) {
600 unsigned rd
= fieldFromInstruction(insn
, 25, 5);
601 unsigned rs1
= fieldFromInstruction(insn
, 14, 5);
602 unsigned isImm
= fieldFromInstruction(insn
, 13, 1);
603 bool hasAsi
= fieldFromInstruction(insn
, 23, 1); // (in op3 field)
604 unsigned asi
= fieldFromInstruction(insn
, 5, 8);
608 simm13
= SignExtend32
<13>(fieldFromInstruction(insn
, 0, 13));
610 rs2
= fieldFromInstruction(insn
, 0, 5);
613 DecodeStatus status
= DecodeIntRegsRegisterClass(MI
, rd
, Address
, Decoder
);
614 if (status
!= MCDisassembler::Success
)
618 status
= DecodeIntRegsRegisterClass(MI
, rs1
, Address
, Decoder
);
619 if (status
!= MCDisassembler::Success
)
622 // Decode RS1 | SIMM13.
624 MI
.addOperand(MCOperand::createImm(simm13
));
626 status
= DecodeIntRegsRegisterClass(MI
, rs2
, Address
, Decoder
);
627 if (status
!= MCDisassembler::Success
)
632 MI
.addOperand(MCOperand::createImm(asi
));
634 return MCDisassembler::Success
;
637 static DecodeStatus
DecodeTRAP(MCInst
&MI
, unsigned insn
, uint64_t Address
,
638 const void *Decoder
) {
640 unsigned rs1
= fieldFromInstruction(insn
, 14, 5);
641 unsigned isImm
= fieldFromInstruction(insn
, 13, 1);
642 unsigned cc
=fieldFromInstruction(insn
, 25, 4);
646 imm7
= fieldFromInstruction(insn
, 0, 7);
648 rs2
= fieldFromInstruction(insn
, 0, 5);
651 DecodeStatus status
= DecodeIntRegsRegisterClass(MI
, rs1
, Address
, Decoder
);
652 if (status
!= MCDisassembler::Success
)
655 // Decode RS1 | IMM7.
657 MI
.addOperand(MCOperand::createImm(imm7
));
659 status
= DecodeIntRegsRegisterClass(MI
, rs2
, Address
, Decoder
);
660 if (status
!= MCDisassembler::Success
)
665 MI
.addOperand(MCOperand::createImm(cc
));
667 return MCDisassembler::Success
;