1 //===- MipsDisassembler.cpp - Disassembler for Mips -------------*- 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 Mips Disassembler.
12 //===----------------------------------------------------------------------===//
15 #include "MipsRegisterInfo.h"
16 #include "MipsSubtarget.h"
17 #include "llvm/MC/MCContext.h"
18 #include "llvm/MC/MCDisassembler.h"
19 #include "llvm/MC/MCFixedLenDisassembler.h"
20 #include "llvm/MC/MCInst.h"
21 #include "llvm/MC/MCSubtargetInfo.h"
22 #include "llvm/Support/MathExtras.h"
23 #include "llvm/Support/MemoryObject.h"
24 #include "llvm/Support/TargetRegistry.h"
28 #define DEBUG_TYPE "mips-disassembler"
30 typedef MCDisassembler::DecodeStatus DecodeStatus;
34 /// MipsDisassemblerBase - a disasembler class for Mips.
35 class MipsDisassemblerBase : public MCDisassembler {
37 /// Constructor - Initializes the disassembler.
39 MipsDisassemblerBase(const MCSubtargetInfo &STI, MCContext &Ctx,
41 MCDisassembler(STI, Ctx),
42 IsN64(STI.getFeatureBits() & Mips::FeatureN64), isBigEndian(bigEndian) {}
44 virtual ~MipsDisassemblerBase() {}
46 bool isN64() const { return IsN64; }
54 /// MipsDisassembler - a disasembler class for Mips32.
55 class MipsDisassembler : public MipsDisassemblerBase {
58 /// Constructor - Initializes the disassembler.
60 MipsDisassembler(const MCSubtargetInfo &STI, MCContext &Ctx,
62 MipsDisassemblerBase(STI, Ctx, bigEndian) {
63 IsMicroMips = STI.getFeatureBits() & Mips::FeatureMicroMips;
66 /// getInstruction - See MCDisassembler.
67 DecodeStatus getInstruction(MCInst &instr,
69 const MemoryObject ®ion,
72 raw_ostream &cStream) const override;
76 /// Mips64Disassembler - a disasembler class for Mips64.
77 class Mips64Disassembler : public MipsDisassemblerBase {
79 /// Constructor - Initializes the disassembler.
81 Mips64Disassembler(const MCSubtargetInfo &STI, MCContext &Ctx,
83 MipsDisassemblerBase(STI, Ctx, bigEndian) {}
85 /// getInstruction - See MCDisassembler.
86 DecodeStatus getInstruction(MCInst &instr,
88 const MemoryObject ®ion,
91 raw_ostream &cStream) const override;
94 } // end anonymous namespace
96 // Forward declare these because the autogenerated code will reference them.
97 // Definitions are further down.
98 static DecodeStatus DecodeGPR64RegisterClass(MCInst &Inst,
101 const void *Decoder);
103 static DecodeStatus DecodeCPU16RegsRegisterClass(MCInst &Inst,
106 const void *Decoder);
108 static DecodeStatus DecodeGPR32RegisterClass(MCInst &Inst,
111 const void *Decoder);
113 static DecodeStatus DecodePtrRegisterClass(MCInst &Inst,
116 const void *Decoder);
118 static DecodeStatus DecodeDSPRRegisterClass(MCInst &Inst,
121 const void *Decoder);
123 static DecodeStatus DecodeFGR64RegisterClass(MCInst &Inst,
126 const void *Decoder);
128 static DecodeStatus DecodeFGR32RegisterClass(MCInst &Inst,
131 const void *Decoder);
133 static DecodeStatus DecodeFGRH32RegisterClass(MCInst &Inst,
136 const void *Decoder);
138 static DecodeStatus DecodeCCRRegisterClass(MCInst &Inst,
141 const void *Decoder);
143 static DecodeStatus DecodeFCCRegisterClass(MCInst &Inst,
146 const void *Decoder);
148 static DecodeStatus DecodeHWRegsRegisterClass(MCInst &Inst,
151 const void *Decoder);
153 static DecodeStatus DecodeAFGR64RegisterClass(MCInst &Inst,
156 const void *Decoder);
158 static DecodeStatus DecodeACC64DSPRegisterClass(MCInst &Inst,
161 const void *Decoder);
163 static DecodeStatus DecodeHI32DSPRegisterClass(MCInst &Inst,
166 const void *Decoder);
168 static DecodeStatus DecodeLO32DSPRegisterClass(MCInst &Inst,
171 const void *Decoder);
173 static DecodeStatus DecodeMSA128BRegisterClass(MCInst &Inst,
176 const void *Decoder);
178 static DecodeStatus DecodeMSA128HRegisterClass(MCInst &Inst,
181 const void *Decoder);
183 static DecodeStatus DecodeMSA128WRegisterClass(MCInst &Inst,
186 const void *Decoder);
188 static DecodeStatus DecodeMSA128DRegisterClass(MCInst &Inst,
191 const void *Decoder);
193 static DecodeStatus DecodeMSACtrlRegisterClass(MCInst &Inst,
196 const void *Decoder);
198 static DecodeStatus DecodeBranchTarget(MCInst &Inst,
201 const void *Decoder);
203 static DecodeStatus DecodeJumpTarget(MCInst &Inst,
206 const void *Decoder);
208 static DecodeStatus DecodeBranchTarget21(MCInst &Inst,
211 const void *Decoder);
213 static DecodeStatus DecodeBranchTarget26(MCInst &Inst,
216 const void *Decoder);
218 // DecodeBranchTargetMM - Decode microMIPS branch offset, which is
219 // shifted left by 1 bit.
220 static DecodeStatus DecodeBranchTargetMM(MCInst &Inst,
223 const void *Decoder);
225 // DecodeJumpTargetMM - Decode microMIPS jump target, which is
226 // shifted left by 1 bit.
227 static DecodeStatus DecodeJumpTargetMM(MCInst &Inst,
230 const void *Decoder);
232 static DecodeStatus DecodeMem(MCInst &Inst,
235 const void *Decoder);
237 static DecodeStatus DecodeMSA128Mem(MCInst &Inst, unsigned Insn,
238 uint64_t Address, const void *Decoder);
240 static DecodeStatus DecodeMemMMImm12(MCInst &Inst,
243 const void *Decoder);
245 static DecodeStatus DecodeMemMMImm16(MCInst &Inst,
248 const void *Decoder);
250 static DecodeStatus DecodeFMem(MCInst &Inst, unsigned Insn,
252 const void *Decoder);
254 static DecodeStatus DecodeSimm16(MCInst &Inst,
257 const void *Decoder);
259 // Decode the immediate field of an LSA instruction which
261 static DecodeStatus DecodeLSAImm(MCInst &Inst,
264 const void *Decoder);
266 static DecodeStatus DecodeInsSize(MCInst &Inst,
269 const void *Decoder);
271 static DecodeStatus DecodeExtSize(MCInst &Inst,
274 const void *Decoder);
276 static DecodeStatus DecodeSimm19Lsl2(MCInst &Inst, unsigned Insn,
277 uint64_t Address, const void *Decoder);
279 /// INSVE_[BHWD] have an implicit operand that the generated decoder doesn't
281 template <typename InsnType>
282 static DecodeStatus DecodeINSVE_DF(MCInst &MI, InsnType insn, uint64_t Address,
283 const void *Decoder);
285 extern Target TheMipselTarget, TheMipsTarget, TheMips64Target,
289 static MCDisassembler *createMipsDisassembler(
291 const MCSubtargetInfo &STI,
293 return new MipsDisassembler(STI, Ctx, true);
296 static MCDisassembler *createMipselDisassembler(
298 const MCSubtargetInfo &STI,
300 return new MipsDisassembler(STI, Ctx, false);
303 static MCDisassembler *createMips64Disassembler(
305 const MCSubtargetInfo &STI,
307 return new Mips64Disassembler(STI, Ctx, true);
310 static MCDisassembler *createMips64elDisassembler(
312 const MCSubtargetInfo &STI,
314 return new Mips64Disassembler(STI, Ctx, false);
317 extern "C" void LLVMInitializeMipsDisassembler() {
318 // Register the disassembler.
319 TargetRegistry::RegisterMCDisassembler(TheMipsTarget,
320 createMipsDisassembler);
321 TargetRegistry::RegisterMCDisassembler(TheMipselTarget,
322 createMipselDisassembler);
323 TargetRegistry::RegisterMCDisassembler(TheMips64Target,
324 createMips64Disassembler);
325 TargetRegistry::RegisterMCDisassembler(TheMips64elTarget,
326 createMips64elDisassembler);
329 #include "MipsGenDisassemblerTables.inc"
331 template <typename InsnType>
332 static DecodeStatus DecodeINSVE_DF(MCInst &MI, InsnType insn, uint64_t Address,
333 const void *Decoder) {
334 typedef DecodeStatus (*DecodeFN)(MCInst &, unsigned, uint64_t, const void *);
335 // The size of the n field depends on the element size
336 // The register class also depends on this.
337 InsnType tmp = fieldFromInstruction(insn, 17, 5);
339 DecodeFN RegDecoder = nullptr;
340 if ((tmp & 0x18) == 0x00) { // INSVE_B
342 RegDecoder = DecodeMSA128BRegisterClass;
343 } else if ((tmp & 0x1c) == 0x10) { // INSVE_H
345 RegDecoder = DecodeMSA128HRegisterClass;
346 } else if ((tmp & 0x1e) == 0x18) { // INSVE_W
348 RegDecoder = DecodeMSA128WRegisterClass;
349 } else if ((tmp & 0x1f) == 0x1c) { // INSVE_D
351 RegDecoder = DecodeMSA128DRegisterClass;
353 llvm_unreachable("Invalid encoding");
355 assert(NSize != 0 && RegDecoder != nullptr);
358 tmp = fieldFromInstruction(insn, 6, 5);
359 if (RegDecoder(MI, tmp, Address, Decoder) == MCDisassembler::Fail)
360 return MCDisassembler::Fail;
362 if (RegDecoder(MI, tmp, Address, Decoder) == MCDisassembler::Fail)
363 return MCDisassembler::Fail;
365 tmp = fieldFromInstruction(insn, 16, NSize);
366 MI.addOperand(MCOperand::CreateImm(tmp));
368 tmp = fieldFromInstruction(insn, 11, 5);
369 if (RegDecoder(MI, tmp, Address, Decoder) == MCDisassembler::Fail)
370 return MCDisassembler::Fail;
372 MI.addOperand(MCOperand::CreateImm(0));
374 return MCDisassembler::Success;
377 /// readInstruction - read four bytes from the MemoryObject
378 /// and return 32 bit word sorted according to the given endianess
379 static DecodeStatus readInstruction32(const MemoryObject ®ion,
387 // We want to read exactly 4 Bytes of data.
388 if (region.readBytes(address, 4, Bytes) == -1) {
390 return MCDisassembler::Fail;
394 // Encoded as a big-endian 32-bit word in the stream.
395 insn = (Bytes[3] << 0) |
401 // Encoded as a small-endian 32-bit word in the stream.
402 // Little-endian byte ordering:
403 // mips32r2: 4 | 3 | 2 | 1
404 // microMIPS: 2 | 1 | 4 | 3
406 insn = (Bytes[2] << 0) |
411 insn = (Bytes[0] << 0) |
418 return MCDisassembler::Success;
422 MipsDisassembler::getInstruction(MCInst &instr,
424 const MemoryObject &Region,
426 raw_ostream &vStream,
427 raw_ostream &cStream) const {
430 DecodeStatus Result = readInstruction32(Region, Address, Size,
431 Insn, isBigEndian, IsMicroMips);
432 if (Result == MCDisassembler::Fail)
433 return MCDisassembler::Fail;
436 // Calling the auto-generated decoder function.
437 Result = decodeInstruction(DecoderTableMicroMips32, instr, Insn, Address,
439 if (Result != MCDisassembler::Fail) {
443 return MCDisassembler::Fail;
446 // Calling the auto-generated decoder function.
447 Result = decodeInstruction(DecoderTableMips32, instr, Insn, Address,
449 if (Result != MCDisassembler::Fail) {
454 return MCDisassembler::Fail;
458 Mips64Disassembler::getInstruction(MCInst &instr,
460 const MemoryObject &Region,
462 raw_ostream &vStream,
463 raw_ostream &cStream) const {
466 DecodeStatus Result = readInstruction32(Region, Address, Size,
467 Insn, isBigEndian, false);
468 if (Result == MCDisassembler::Fail)
469 return MCDisassembler::Fail;
471 // Calling the auto-generated decoder function.
472 Result = decodeInstruction(DecoderTableMips6432, instr, Insn, Address,
474 if (Result != MCDisassembler::Fail) {
478 // If we fail to decode in Mips64 decoder space we can try in Mips32
479 Result = decodeInstruction(DecoderTableMips32, instr, Insn, Address,
481 if (Result != MCDisassembler::Fail) {
486 return MCDisassembler::Fail;
489 static unsigned getReg(const void *D, unsigned RC, unsigned RegNo) {
490 const MipsDisassemblerBase *Dis = static_cast<const MipsDisassemblerBase*>(D);
491 const MCRegisterInfo *RegInfo = Dis->getContext().getRegisterInfo();
492 return *(RegInfo->getRegClass(RC).begin() + RegNo);
495 static DecodeStatus DecodeCPU16RegsRegisterClass(MCInst &Inst,
498 const void *Decoder) {
500 return MCDisassembler::Fail;
504 static DecodeStatus DecodeGPR64RegisterClass(MCInst &Inst,
507 const void *Decoder) {
510 return MCDisassembler::Fail;
512 unsigned Reg = getReg(Decoder, Mips::GPR64RegClassID, RegNo);
513 Inst.addOperand(MCOperand::CreateReg(Reg));
514 return MCDisassembler::Success;
517 static DecodeStatus DecodeGPR32RegisterClass(MCInst &Inst,
520 const void *Decoder) {
522 return MCDisassembler::Fail;
523 unsigned Reg = getReg(Decoder, Mips::GPR32RegClassID, RegNo);
524 Inst.addOperand(MCOperand::CreateReg(Reg));
525 return MCDisassembler::Success;
528 static DecodeStatus DecodePtrRegisterClass(MCInst &Inst,
531 const void *Decoder) {
532 if (static_cast<const MipsDisassembler *>(Decoder)->isN64())
533 return DecodeGPR64RegisterClass(Inst, RegNo, Address, Decoder);
535 return DecodeGPR32RegisterClass(Inst, RegNo, Address, Decoder);
538 static DecodeStatus DecodeDSPRRegisterClass(MCInst &Inst,
541 const void *Decoder) {
542 return DecodeGPR32RegisterClass(Inst, RegNo, Address, Decoder);
545 static DecodeStatus DecodeFGR64RegisterClass(MCInst &Inst,
548 const void *Decoder) {
550 return MCDisassembler::Fail;
552 unsigned Reg = getReg(Decoder, Mips::FGR64RegClassID, RegNo);
553 Inst.addOperand(MCOperand::CreateReg(Reg));
554 return MCDisassembler::Success;
557 static DecodeStatus DecodeFGR32RegisterClass(MCInst &Inst,
560 const void *Decoder) {
562 return MCDisassembler::Fail;
564 unsigned Reg = getReg(Decoder, Mips::FGR32RegClassID, RegNo);
565 Inst.addOperand(MCOperand::CreateReg(Reg));
566 return MCDisassembler::Success;
569 static DecodeStatus DecodeFGRH32RegisterClass(MCInst &Inst,
572 const void *Decoder) {
574 return MCDisassembler::Fail;
576 unsigned Reg = getReg(Decoder, Mips::FGRH32RegClassID, RegNo);
577 Inst.addOperand(MCOperand::CreateReg(Reg));
578 return MCDisassembler::Success;
581 static DecodeStatus DecodeCCRRegisterClass(MCInst &Inst,
584 const void *Decoder) {
586 return MCDisassembler::Fail;
587 unsigned Reg = getReg(Decoder, Mips::CCRRegClassID, RegNo);
588 Inst.addOperand(MCOperand::CreateReg(Reg));
589 return MCDisassembler::Success;
592 static DecodeStatus DecodeFCCRegisterClass(MCInst &Inst,
595 const void *Decoder) {
597 return MCDisassembler::Fail;
598 unsigned Reg = getReg(Decoder, Mips::FCCRegClassID, RegNo);
599 Inst.addOperand(MCOperand::CreateReg(Reg));
600 return MCDisassembler::Success;
603 static DecodeStatus DecodeMem(MCInst &Inst,
606 const void *Decoder) {
607 int Offset = SignExtend32<16>(Insn & 0xffff);
608 unsigned Reg = fieldFromInstruction(Insn, 16, 5);
609 unsigned Base = fieldFromInstruction(Insn, 21, 5);
611 Reg = getReg(Decoder, Mips::GPR32RegClassID, Reg);
612 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
614 if(Inst.getOpcode() == Mips::SC){
615 Inst.addOperand(MCOperand::CreateReg(Reg));
618 Inst.addOperand(MCOperand::CreateReg(Reg));
619 Inst.addOperand(MCOperand::CreateReg(Base));
620 Inst.addOperand(MCOperand::CreateImm(Offset));
622 return MCDisassembler::Success;
625 static DecodeStatus DecodeMSA128Mem(MCInst &Inst, unsigned Insn,
626 uint64_t Address, const void *Decoder) {
627 int Offset = SignExtend32<10>(fieldFromInstruction(Insn, 16, 10));
628 unsigned Reg = fieldFromInstruction(Insn, 6, 5);
629 unsigned Base = fieldFromInstruction(Insn, 11, 5);
631 Reg = getReg(Decoder, Mips::MSA128BRegClassID, Reg);
632 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
634 Inst.addOperand(MCOperand::CreateReg(Reg));
635 Inst.addOperand(MCOperand::CreateReg(Base));
637 // The immediate field of an LD/ST instruction is scaled which means it must
638 // be multiplied (when decoding) by the size (in bytes) of the instructions'
644 switch(Inst.getOpcode())
647 assert (0 && "Unexpected instruction");
648 return MCDisassembler::Fail;
652 Inst.addOperand(MCOperand::CreateImm(Offset));
656 Inst.addOperand(MCOperand::CreateImm(Offset << 1));
660 Inst.addOperand(MCOperand::CreateImm(Offset << 2));
664 Inst.addOperand(MCOperand::CreateImm(Offset << 3));
668 return MCDisassembler::Success;
671 static DecodeStatus DecodeMemMMImm12(MCInst &Inst,
674 const void *Decoder) {
675 int Offset = SignExtend32<12>(Insn & 0x0fff);
676 unsigned Reg = fieldFromInstruction(Insn, 21, 5);
677 unsigned Base = fieldFromInstruction(Insn, 16, 5);
679 Reg = getReg(Decoder, Mips::GPR32RegClassID, Reg);
680 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
682 if (Inst.getOpcode() == Mips::SC_MM)
683 Inst.addOperand(MCOperand::CreateReg(Reg));
685 Inst.addOperand(MCOperand::CreateReg(Reg));
686 Inst.addOperand(MCOperand::CreateReg(Base));
687 Inst.addOperand(MCOperand::CreateImm(Offset));
689 return MCDisassembler::Success;
692 static DecodeStatus DecodeMemMMImm16(MCInst &Inst,
695 const void *Decoder) {
696 int Offset = SignExtend32<16>(Insn & 0xffff);
697 unsigned Reg = fieldFromInstruction(Insn, 21, 5);
698 unsigned Base = fieldFromInstruction(Insn, 16, 5);
700 Reg = getReg(Decoder, Mips::GPR32RegClassID, Reg);
701 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
703 Inst.addOperand(MCOperand::CreateReg(Reg));
704 Inst.addOperand(MCOperand::CreateReg(Base));
705 Inst.addOperand(MCOperand::CreateImm(Offset));
707 return MCDisassembler::Success;
710 static DecodeStatus DecodeFMem(MCInst &Inst,
713 const void *Decoder) {
714 int Offset = SignExtend32<16>(Insn & 0xffff);
715 unsigned Reg = fieldFromInstruction(Insn, 16, 5);
716 unsigned Base = fieldFromInstruction(Insn, 21, 5);
718 Reg = getReg(Decoder, Mips::FGR64RegClassID, Reg);
719 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
721 Inst.addOperand(MCOperand::CreateReg(Reg));
722 Inst.addOperand(MCOperand::CreateReg(Base));
723 Inst.addOperand(MCOperand::CreateImm(Offset));
725 return MCDisassembler::Success;
729 static DecodeStatus DecodeHWRegsRegisterClass(MCInst &Inst,
732 const void *Decoder) {
733 // Currently only hardware register 29 is supported.
735 return MCDisassembler::Fail;
736 Inst.addOperand(MCOperand::CreateReg(Mips::HWR29));
737 return MCDisassembler::Success;
740 static DecodeStatus DecodeAFGR64RegisterClass(MCInst &Inst,
743 const void *Decoder) {
744 if (RegNo > 30 || RegNo %2)
745 return MCDisassembler::Fail;
748 unsigned Reg = getReg(Decoder, Mips::AFGR64RegClassID, RegNo /2);
749 Inst.addOperand(MCOperand::CreateReg(Reg));
750 return MCDisassembler::Success;
753 static DecodeStatus DecodeACC64DSPRegisterClass(MCInst &Inst,
756 const void *Decoder) {
758 return MCDisassembler::Fail;
760 unsigned Reg = getReg(Decoder, Mips::ACC64DSPRegClassID, RegNo);
761 Inst.addOperand(MCOperand::CreateReg(Reg));
762 return MCDisassembler::Success;
765 static DecodeStatus DecodeHI32DSPRegisterClass(MCInst &Inst,
768 const void *Decoder) {
770 return MCDisassembler::Fail;
772 unsigned Reg = getReg(Decoder, Mips::HI32DSPRegClassID, RegNo);
773 Inst.addOperand(MCOperand::CreateReg(Reg));
774 return MCDisassembler::Success;
777 static DecodeStatus DecodeLO32DSPRegisterClass(MCInst &Inst,
780 const void *Decoder) {
782 return MCDisassembler::Fail;
784 unsigned Reg = getReg(Decoder, Mips::LO32DSPRegClassID, RegNo);
785 Inst.addOperand(MCOperand::CreateReg(Reg));
786 return MCDisassembler::Success;
789 static DecodeStatus DecodeMSA128BRegisterClass(MCInst &Inst,
792 const void *Decoder) {
794 return MCDisassembler::Fail;
796 unsigned Reg = getReg(Decoder, Mips::MSA128BRegClassID, RegNo);
797 Inst.addOperand(MCOperand::CreateReg(Reg));
798 return MCDisassembler::Success;
801 static DecodeStatus DecodeMSA128HRegisterClass(MCInst &Inst,
804 const void *Decoder) {
806 return MCDisassembler::Fail;
808 unsigned Reg = getReg(Decoder, Mips::MSA128HRegClassID, RegNo);
809 Inst.addOperand(MCOperand::CreateReg(Reg));
810 return MCDisassembler::Success;
813 static DecodeStatus DecodeMSA128WRegisterClass(MCInst &Inst,
816 const void *Decoder) {
818 return MCDisassembler::Fail;
820 unsigned Reg = getReg(Decoder, Mips::MSA128WRegClassID, RegNo);
821 Inst.addOperand(MCOperand::CreateReg(Reg));
822 return MCDisassembler::Success;
825 static DecodeStatus DecodeMSA128DRegisterClass(MCInst &Inst,
828 const void *Decoder) {
830 return MCDisassembler::Fail;
832 unsigned Reg = getReg(Decoder, Mips::MSA128DRegClassID, RegNo);
833 Inst.addOperand(MCOperand::CreateReg(Reg));
834 return MCDisassembler::Success;
837 static DecodeStatus DecodeMSACtrlRegisterClass(MCInst &Inst,
840 const void *Decoder) {
842 return MCDisassembler::Fail;
844 unsigned Reg = getReg(Decoder, Mips::MSACtrlRegClassID, RegNo);
845 Inst.addOperand(MCOperand::CreateReg(Reg));
846 return MCDisassembler::Success;
849 static DecodeStatus DecodeBranchTarget(MCInst &Inst,
852 const void *Decoder) {
853 unsigned BranchOffset = Offset & 0xffff;
854 BranchOffset = SignExtend32<18>(BranchOffset << 2) + 4;
855 Inst.addOperand(MCOperand::CreateImm(BranchOffset));
856 return MCDisassembler::Success;
859 static DecodeStatus DecodeJumpTarget(MCInst &Inst,
862 const void *Decoder) {
864 unsigned JumpOffset = fieldFromInstruction(Insn, 0, 26) << 2;
865 Inst.addOperand(MCOperand::CreateImm(JumpOffset));
866 return MCDisassembler::Success;
869 static DecodeStatus DecodeBranchTarget21(MCInst &Inst,
872 const void *Decoder) {
873 int32_t BranchOffset = SignExtend32<21>(Offset) << 2;
875 Inst.addOperand(MCOperand::CreateImm(BranchOffset));
876 return MCDisassembler::Success;
879 static DecodeStatus DecodeBranchTarget26(MCInst &Inst,
882 const void *Decoder) {
883 int32_t BranchOffset = SignExtend32<26>(Offset) << 2;
885 Inst.addOperand(MCOperand::CreateImm(BranchOffset));
886 return MCDisassembler::Success;
889 static DecodeStatus DecodeBranchTargetMM(MCInst &Inst,
892 const void *Decoder) {
893 unsigned BranchOffset = Offset & 0xffff;
894 BranchOffset = SignExtend32<18>(BranchOffset << 1);
895 Inst.addOperand(MCOperand::CreateImm(BranchOffset));
896 return MCDisassembler::Success;
899 static DecodeStatus DecodeJumpTargetMM(MCInst &Inst,
902 const void *Decoder) {
903 unsigned JumpOffset = fieldFromInstruction(Insn, 0, 26) << 1;
904 Inst.addOperand(MCOperand::CreateImm(JumpOffset));
905 return MCDisassembler::Success;
908 static DecodeStatus DecodeSimm16(MCInst &Inst,
911 const void *Decoder) {
912 Inst.addOperand(MCOperand::CreateImm(SignExtend32<16>(Insn)));
913 return MCDisassembler::Success;
916 static DecodeStatus DecodeLSAImm(MCInst &Inst,
919 const void *Decoder) {
920 // We add one to the immediate field as it was encoded as 'imm - 1'.
921 Inst.addOperand(MCOperand::CreateImm(Insn + 1));
922 return MCDisassembler::Success;
925 static DecodeStatus DecodeInsSize(MCInst &Inst,
928 const void *Decoder) {
929 // First we need to grab the pos(lsb) from MCInst.
930 int Pos = Inst.getOperand(2).getImm();
931 int Size = (int) Insn - Pos + 1;
932 Inst.addOperand(MCOperand::CreateImm(SignExtend32<16>(Size)));
933 return MCDisassembler::Success;
936 static DecodeStatus DecodeExtSize(MCInst &Inst,
939 const void *Decoder) {
940 int Size = (int) Insn + 1;
941 Inst.addOperand(MCOperand::CreateImm(SignExtend32<16>(Size)));
942 return MCDisassembler::Success;
945 static DecodeStatus DecodeSimm19Lsl2(MCInst &Inst, unsigned Insn,
946 uint64_t Address, const void *Decoder) {
947 Inst.addOperand(MCOperand::CreateImm(SignExtend32<19>(Insn) << 2));
948 return MCDisassembler::Success;