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 typedef MCDisassembler::DecodeStatus DecodeStatus;
32 /// MipsDisassemblerBase - a disasembler class for Mips.
33 class MipsDisassemblerBase : public MCDisassembler {
35 /// Constructor - Initializes the disassembler.
37 MipsDisassemblerBase(const MCSubtargetInfo &STI, MCContext &Ctx,
39 MCDisassembler(STI, Ctx),
40 IsN64(STI.getFeatureBits() & Mips::FeatureN64), isBigEndian(bigEndian) {}
42 virtual ~MipsDisassemblerBase() {}
44 bool isN64() const { return IsN64; }
52 /// MipsDisassembler - a disasembler class for Mips32.
53 class MipsDisassembler : public MipsDisassemblerBase {
56 /// Constructor - Initializes the disassembler.
58 MipsDisassembler(const MCSubtargetInfo &STI, MCContext &Ctx,
60 MipsDisassemblerBase(STI, Ctx, bigEndian) {
61 IsMicroMips = STI.getFeatureBits() & Mips::FeatureMicroMips;
64 /// getInstruction - See MCDisassembler.
65 virtual DecodeStatus getInstruction(MCInst &instr,
67 const MemoryObject ®ion,
70 raw_ostream &cStream) const;
74 /// Mips64Disassembler - a disasembler class for Mips64.
75 class Mips64Disassembler : public MipsDisassemblerBase {
77 /// Constructor - Initializes the disassembler.
79 Mips64Disassembler(const MCSubtargetInfo &STI, MCContext &Ctx,
81 MipsDisassemblerBase(STI, Ctx, bigEndian) {}
83 /// getInstruction - See MCDisassembler.
84 virtual DecodeStatus getInstruction(MCInst &instr,
86 const MemoryObject ®ion,
89 raw_ostream &cStream) const;
92 } // end anonymous namespace
94 // Forward declare these because the autogenerated code will reference them.
95 // Definitions are further down.
96 static DecodeStatus DecodeGPR64RegisterClass(MCInst &Inst,
101 static DecodeStatus DecodeCPU16RegsRegisterClass(MCInst &Inst,
104 const void *Decoder);
106 static DecodeStatus DecodeGPR32RegisterClass(MCInst &Inst,
109 const void *Decoder);
111 static DecodeStatus DecodePtrRegisterClass(MCInst &Inst,
114 const void *Decoder);
116 static DecodeStatus DecodeDSPRRegisterClass(MCInst &Inst,
119 const void *Decoder);
121 static DecodeStatus DecodeFGR64RegisterClass(MCInst &Inst,
124 const void *Decoder);
126 static DecodeStatus DecodeFGR32RegisterClass(MCInst &Inst,
129 const void *Decoder);
131 static DecodeStatus DecodeFGRH32RegisterClass(MCInst &Inst,
134 const void *Decoder);
136 static DecodeStatus DecodeCCRRegisterClass(MCInst &Inst,
139 const void *Decoder);
141 static DecodeStatus DecodeFCCRegisterClass(MCInst &Inst,
144 const void *Decoder);
146 static DecodeStatus DecodeHWRegsRegisterClass(MCInst &Inst,
149 const void *Decoder);
151 static DecodeStatus DecodeAFGR64RegisterClass(MCInst &Inst,
154 const void *Decoder);
156 static DecodeStatus DecodeACC64DSPRegisterClass(MCInst &Inst,
159 const void *Decoder);
161 static DecodeStatus DecodeHI32DSPRegisterClass(MCInst &Inst,
164 const void *Decoder);
166 static DecodeStatus DecodeLO32DSPRegisterClass(MCInst &Inst,
169 const void *Decoder);
171 static DecodeStatus DecodeMSA128BRegisterClass(MCInst &Inst,
174 const void *Decoder);
176 static DecodeStatus DecodeMSA128HRegisterClass(MCInst &Inst,
179 const void *Decoder);
181 static DecodeStatus DecodeMSA128WRegisterClass(MCInst &Inst,
184 const void *Decoder);
186 static DecodeStatus DecodeMSA128DRegisterClass(MCInst &Inst,
189 const void *Decoder);
191 static DecodeStatus DecodeMSACtrlRegisterClass(MCInst &Inst,
194 const void *Decoder);
196 static DecodeStatus DecodeBranchTarget(MCInst &Inst,
199 const void *Decoder);
201 static DecodeStatus DecodeJumpTarget(MCInst &Inst,
204 const void *Decoder);
206 // DecodeBranchTargetMM - Decode microMIPS branch offset, which is
207 // shifted left by 1 bit.
208 static DecodeStatus DecodeBranchTargetMM(MCInst &Inst,
211 const void *Decoder);
213 // DecodeJumpTargetMM - Decode microMIPS jump target, which is
214 // shifted left by 1 bit.
215 static DecodeStatus DecodeJumpTargetMM(MCInst &Inst,
218 const void *Decoder);
220 static DecodeStatus DecodeMem(MCInst &Inst,
223 const void *Decoder);
225 static DecodeStatus DecodeMSA128Mem(MCInst &Inst, unsigned Insn,
226 uint64_t Address, const void *Decoder);
228 static DecodeStatus DecodeMemMMImm12(MCInst &Inst,
231 const void *Decoder);
233 static DecodeStatus DecodeMemMMImm16(MCInst &Inst,
236 const void *Decoder);
238 static DecodeStatus DecodeFMem(MCInst &Inst, unsigned Insn,
240 const void *Decoder);
242 static DecodeStatus DecodeSimm16(MCInst &Inst,
245 const void *Decoder);
247 // Decode the immediate field of an LSA instruction which
249 static DecodeStatus DecodeLSAImm(MCInst &Inst,
252 const void *Decoder);
254 static DecodeStatus DecodeInsSize(MCInst &Inst,
257 const void *Decoder);
259 static DecodeStatus DecodeExtSize(MCInst &Inst,
262 const void *Decoder);
264 /// INSVE_[BHWD] have an implicit operand that the generated decoder doesn't
266 template <typename InsnType>
267 static DecodeStatus DecodeINSVE_DF(MCInst &MI, InsnType insn, uint64_t Address,
268 const void *Decoder);
270 extern Target TheMipselTarget, TheMipsTarget, TheMips64Target,
274 static MCDisassembler *createMipsDisassembler(
276 const MCSubtargetInfo &STI,
278 return new MipsDisassembler(STI, Ctx, true);
281 static MCDisassembler *createMipselDisassembler(
283 const MCSubtargetInfo &STI,
285 return new MipsDisassembler(STI, Ctx, false);
288 static MCDisassembler *createMips64Disassembler(
290 const MCSubtargetInfo &STI,
292 return new Mips64Disassembler(STI, Ctx, true);
295 static MCDisassembler *createMips64elDisassembler(
297 const MCSubtargetInfo &STI,
299 return new Mips64Disassembler(STI, Ctx, false);
302 extern "C" void LLVMInitializeMipsDisassembler() {
303 // Register the disassembler.
304 TargetRegistry::RegisterMCDisassembler(TheMipsTarget,
305 createMipsDisassembler);
306 TargetRegistry::RegisterMCDisassembler(TheMipselTarget,
307 createMipselDisassembler);
308 TargetRegistry::RegisterMCDisassembler(TheMips64Target,
309 createMips64Disassembler);
310 TargetRegistry::RegisterMCDisassembler(TheMips64elTarget,
311 createMips64elDisassembler);
314 #include "MipsGenDisassemblerTables.inc"
316 template <typename InsnType>
317 static DecodeStatus DecodeINSVE_DF(MCInst &MI, InsnType insn, uint64_t Address,
318 const void *Decoder) {
319 typedef DecodeStatus (*DecodeFN)(MCInst &, unsigned, uint64_t, const void *);
320 // The size of the n field depends on the element size
321 // The register class also depends on this.
322 InsnType tmp = fieldFromInstruction(insn, 17, 5);
324 DecodeFN RegDecoder = nullptr;
325 if ((tmp & 0x18) == 0x00) { // INSVE_B
327 RegDecoder = DecodeMSA128BRegisterClass;
328 } else if ((tmp & 0x1c) == 0x10) { // INSVE_H
330 RegDecoder = DecodeMSA128HRegisterClass;
331 } else if ((tmp & 0x1e) == 0x18) { // INSVE_W
333 RegDecoder = DecodeMSA128WRegisterClass;
334 } else if ((tmp & 0x1f) == 0x1c) { // INSVE_D
336 RegDecoder = DecodeMSA128DRegisterClass;
338 llvm_unreachable("Invalid encoding");
340 assert(NSize != 0 && RegDecoder != nullptr);
343 tmp = fieldFromInstruction(insn, 6, 5);
344 if (RegDecoder(MI, tmp, Address, Decoder) == MCDisassembler::Fail)
345 return MCDisassembler::Fail;
347 if (RegDecoder(MI, tmp, Address, Decoder) == MCDisassembler::Fail)
348 return MCDisassembler::Fail;
350 tmp = fieldFromInstruction(insn, 16, NSize);
351 MI.addOperand(MCOperand::CreateImm(tmp));
353 tmp = fieldFromInstruction(insn, 11, 5);
354 if (RegDecoder(MI, tmp, Address, Decoder) == MCDisassembler::Fail)
355 return MCDisassembler::Fail;
357 MI.addOperand(MCOperand::CreateImm(0));
359 return MCDisassembler::Success;
362 /// readInstruction - read four bytes from the MemoryObject
363 /// and return 32 bit word sorted according to the given endianess
364 static DecodeStatus readInstruction32(const MemoryObject ®ion,
372 // We want to read exactly 4 Bytes of data.
373 if (region.readBytes(address, 4, Bytes) == -1) {
375 return MCDisassembler::Fail;
379 // Encoded as a big-endian 32-bit word in the stream.
380 insn = (Bytes[3] << 0) |
386 // Encoded as a small-endian 32-bit word in the stream.
387 // Little-endian byte ordering:
388 // mips32r2: 4 | 3 | 2 | 1
389 // microMIPS: 2 | 1 | 4 | 3
391 insn = (Bytes[2] << 0) |
396 insn = (Bytes[0] << 0) |
403 return MCDisassembler::Success;
407 MipsDisassembler::getInstruction(MCInst &instr,
409 const MemoryObject &Region,
411 raw_ostream &vStream,
412 raw_ostream &cStream) const {
415 DecodeStatus Result = readInstruction32(Region, Address, Size,
416 Insn, isBigEndian, IsMicroMips);
417 if (Result == MCDisassembler::Fail)
418 return MCDisassembler::Fail;
421 // Calling the auto-generated decoder function.
422 Result = decodeInstruction(DecoderTableMicroMips32, instr, Insn, Address,
424 if (Result != MCDisassembler::Fail) {
428 return MCDisassembler::Fail;
431 // Calling the auto-generated decoder function.
432 Result = decodeInstruction(DecoderTableMips32, instr, Insn, Address,
434 if (Result != MCDisassembler::Fail) {
439 return MCDisassembler::Fail;
443 Mips64Disassembler::getInstruction(MCInst &instr,
445 const MemoryObject &Region,
447 raw_ostream &vStream,
448 raw_ostream &cStream) const {
451 DecodeStatus Result = readInstruction32(Region, Address, Size,
452 Insn, isBigEndian, false);
453 if (Result == MCDisassembler::Fail)
454 return MCDisassembler::Fail;
456 // Calling the auto-generated decoder function.
457 Result = decodeInstruction(DecoderTableMips6432, instr, Insn, Address,
459 if (Result != MCDisassembler::Fail) {
463 // If we fail to decode in Mips64 decoder space we can try in Mips32
464 Result = decodeInstruction(DecoderTableMips32, instr, Insn, Address,
466 if (Result != MCDisassembler::Fail) {
471 return MCDisassembler::Fail;
474 static unsigned getReg(const void *D, unsigned RC, unsigned RegNo) {
475 const MipsDisassemblerBase *Dis = static_cast<const MipsDisassemblerBase*>(D);
476 const MCRegisterInfo *RegInfo = Dis->getContext().getRegisterInfo();
477 return *(RegInfo->getRegClass(RC).begin() + RegNo);
480 static DecodeStatus DecodeCPU16RegsRegisterClass(MCInst &Inst,
483 const void *Decoder) {
485 return MCDisassembler::Fail;
489 static DecodeStatus DecodeGPR64RegisterClass(MCInst &Inst,
492 const void *Decoder) {
495 return MCDisassembler::Fail;
497 unsigned Reg = getReg(Decoder, Mips::GPR64RegClassID, RegNo);
498 Inst.addOperand(MCOperand::CreateReg(Reg));
499 return MCDisassembler::Success;
502 static DecodeStatus DecodeGPR32RegisterClass(MCInst &Inst,
505 const void *Decoder) {
507 return MCDisassembler::Fail;
508 unsigned Reg = getReg(Decoder, Mips::GPR32RegClassID, RegNo);
509 Inst.addOperand(MCOperand::CreateReg(Reg));
510 return MCDisassembler::Success;
513 static DecodeStatus DecodePtrRegisterClass(MCInst &Inst,
516 const void *Decoder) {
517 if (static_cast<const MipsDisassembler *>(Decoder)->isN64())
518 return DecodeGPR64RegisterClass(Inst, RegNo, Address, Decoder);
520 return DecodeGPR32RegisterClass(Inst, RegNo, Address, Decoder);
523 static DecodeStatus DecodeDSPRRegisterClass(MCInst &Inst,
526 const void *Decoder) {
527 return DecodeGPR32RegisterClass(Inst, RegNo, Address, Decoder);
530 static DecodeStatus DecodeFGR64RegisterClass(MCInst &Inst,
533 const void *Decoder) {
535 return MCDisassembler::Fail;
537 unsigned Reg = getReg(Decoder, Mips::FGR64RegClassID, RegNo);
538 Inst.addOperand(MCOperand::CreateReg(Reg));
539 return MCDisassembler::Success;
542 static DecodeStatus DecodeFGR32RegisterClass(MCInst &Inst,
545 const void *Decoder) {
547 return MCDisassembler::Fail;
549 unsigned Reg = getReg(Decoder, Mips::FGR32RegClassID, RegNo);
550 Inst.addOperand(MCOperand::CreateReg(Reg));
551 return MCDisassembler::Success;
554 static DecodeStatus DecodeFGRH32RegisterClass(MCInst &Inst,
557 const void *Decoder) {
559 return MCDisassembler::Fail;
561 unsigned Reg = getReg(Decoder, Mips::FGRH32RegClassID, RegNo);
562 Inst.addOperand(MCOperand::CreateReg(Reg));
563 return MCDisassembler::Success;
566 static DecodeStatus DecodeCCRRegisterClass(MCInst &Inst,
569 const void *Decoder) {
571 return MCDisassembler::Fail;
572 unsigned Reg = getReg(Decoder, Mips::CCRRegClassID, RegNo);
573 Inst.addOperand(MCOperand::CreateReg(Reg));
574 return MCDisassembler::Success;
577 static DecodeStatus DecodeFCCRegisterClass(MCInst &Inst,
580 const void *Decoder) {
582 return MCDisassembler::Fail;
583 unsigned Reg = getReg(Decoder, Mips::FCCRegClassID, RegNo);
584 Inst.addOperand(MCOperand::CreateReg(Reg));
585 return MCDisassembler::Success;
588 static DecodeStatus DecodeMem(MCInst &Inst,
591 const void *Decoder) {
592 int Offset = SignExtend32<16>(Insn & 0xffff);
593 unsigned Reg = fieldFromInstruction(Insn, 16, 5);
594 unsigned Base = fieldFromInstruction(Insn, 21, 5);
596 Reg = getReg(Decoder, Mips::GPR32RegClassID, Reg);
597 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
599 if(Inst.getOpcode() == Mips::SC){
600 Inst.addOperand(MCOperand::CreateReg(Reg));
603 Inst.addOperand(MCOperand::CreateReg(Reg));
604 Inst.addOperand(MCOperand::CreateReg(Base));
605 Inst.addOperand(MCOperand::CreateImm(Offset));
607 return MCDisassembler::Success;
610 static DecodeStatus DecodeMSA128Mem(MCInst &Inst, unsigned Insn,
611 uint64_t Address, const void *Decoder) {
612 int Offset = SignExtend32<10>(fieldFromInstruction(Insn, 16, 10));
613 unsigned Reg = fieldFromInstruction(Insn, 6, 5);
614 unsigned Base = fieldFromInstruction(Insn, 11, 5);
616 Reg = getReg(Decoder, Mips::MSA128BRegClassID, Reg);
617 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
619 Inst.addOperand(MCOperand::CreateReg(Reg));
620 Inst.addOperand(MCOperand::CreateReg(Base));
622 // The immediate field of an LD/ST instruction is scaled which means it must
623 // be multiplied (when decoding) by the size (in bytes) of the instructions'
629 switch(Inst.getOpcode())
632 assert (0 && "Unexpected instruction");
633 return MCDisassembler::Fail;
637 Inst.addOperand(MCOperand::CreateImm(Offset));
641 Inst.addOperand(MCOperand::CreateImm(Offset << 1));
645 Inst.addOperand(MCOperand::CreateImm(Offset << 2));
649 Inst.addOperand(MCOperand::CreateImm(Offset << 3));
653 return MCDisassembler::Success;
656 static DecodeStatus DecodeMemMMImm12(MCInst &Inst,
659 const void *Decoder) {
660 int Offset = SignExtend32<12>(Insn & 0x0fff);
661 unsigned Reg = fieldFromInstruction(Insn, 21, 5);
662 unsigned Base = fieldFromInstruction(Insn, 16, 5);
664 Reg = getReg(Decoder, Mips::GPR32RegClassID, Reg);
665 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
667 if (Inst.getOpcode() == Mips::SC_MM)
668 Inst.addOperand(MCOperand::CreateReg(Reg));
670 Inst.addOperand(MCOperand::CreateReg(Reg));
671 Inst.addOperand(MCOperand::CreateReg(Base));
672 Inst.addOperand(MCOperand::CreateImm(Offset));
674 return MCDisassembler::Success;
677 static DecodeStatus DecodeMemMMImm16(MCInst &Inst,
680 const void *Decoder) {
681 int Offset = SignExtend32<16>(Insn & 0xffff);
682 unsigned Reg = fieldFromInstruction(Insn, 21, 5);
683 unsigned Base = fieldFromInstruction(Insn, 16, 5);
685 Reg = getReg(Decoder, Mips::GPR32RegClassID, Reg);
686 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
688 Inst.addOperand(MCOperand::CreateReg(Reg));
689 Inst.addOperand(MCOperand::CreateReg(Base));
690 Inst.addOperand(MCOperand::CreateImm(Offset));
692 return MCDisassembler::Success;
695 static DecodeStatus DecodeFMem(MCInst &Inst,
698 const void *Decoder) {
699 int Offset = SignExtend32<16>(Insn & 0xffff);
700 unsigned Reg = fieldFromInstruction(Insn, 16, 5);
701 unsigned Base = fieldFromInstruction(Insn, 21, 5);
703 Reg = getReg(Decoder, Mips::FGR64RegClassID, Reg);
704 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
706 Inst.addOperand(MCOperand::CreateReg(Reg));
707 Inst.addOperand(MCOperand::CreateReg(Base));
708 Inst.addOperand(MCOperand::CreateImm(Offset));
710 return MCDisassembler::Success;
714 static DecodeStatus DecodeHWRegsRegisterClass(MCInst &Inst,
717 const void *Decoder) {
718 // Currently only hardware register 29 is supported.
720 return MCDisassembler::Fail;
721 Inst.addOperand(MCOperand::CreateReg(Mips::HWR29));
722 return MCDisassembler::Success;
725 static DecodeStatus DecodeAFGR64RegisterClass(MCInst &Inst,
728 const void *Decoder) {
729 if (RegNo > 30 || RegNo %2)
730 return MCDisassembler::Fail;
733 unsigned Reg = getReg(Decoder, Mips::AFGR64RegClassID, RegNo /2);
734 Inst.addOperand(MCOperand::CreateReg(Reg));
735 return MCDisassembler::Success;
738 static DecodeStatus DecodeACC64DSPRegisterClass(MCInst &Inst,
741 const void *Decoder) {
743 return MCDisassembler::Fail;
745 unsigned Reg = getReg(Decoder, Mips::ACC64DSPRegClassID, RegNo);
746 Inst.addOperand(MCOperand::CreateReg(Reg));
747 return MCDisassembler::Success;
750 static DecodeStatus DecodeHI32DSPRegisterClass(MCInst &Inst,
753 const void *Decoder) {
755 return MCDisassembler::Fail;
757 unsigned Reg = getReg(Decoder, Mips::HI32DSPRegClassID, RegNo);
758 Inst.addOperand(MCOperand::CreateReg(Reg));
759 return MCDisassembler::Success;
762 static DecodeStatus DecodeLO32DSPRegisterClass(MCInst &Inst,
765 const void *Decoder) {
767 return MCDisassembler::Fail;
769 unsigned Reg = getReg(Decoder, Mips::LO32DSPRegClassID, RegNo);
770 Inst.addOperand(MCOperand::CreateReg(Reg));
771 return MCDisassembler::Success;
774 static DecodeStatus DecodeMSA128BRegisterClass(MCInst &Inst,
777 const void *Decoder) {
779 return MCDisassembler::Fail;
781 unsigned Reg = getReg(Decoder, Mips::MSA128BRegClassID, RegNo);
782 Inst.addOperand(MCOperand::CreateReg(Reg));
783 return MCDisassembler::Success;
786 static DecodeStatus DecodeMSA128HRegisterClass(MCInst &Inst,
789 const void *Decoder) {
791 return MCDisassembler::Fail;
793 unsigned Reg = getReg(Decoder, Mips::MSA128HRegClassID, RegNo);
794 Inst.addOperand(MCOperand::CreateReg(Reg));
795 return MCDisassembler::Success;
798 static DecodeStatus DecodeMSA128WRegisterClass(MCInst &Inst,
801 const void *Decoder) {
803 return MCDisassembler::Fail;
805 unsigned Reg = getReg(Decoder, Mips::MSA128WRegClassID, RegNo);
806 Inst.addOperand(MCOperand::CreateReg(Reg));
807 return MCDisassembler::Success;
810 static DecodeStatus DecodeMSA128DRegisterClass(MCInst &Inst,
813 const void *Decoder) {
815 return MCDisassembler::Fail;
817 unsigned Reg = getReg(Decoder, Mips::MSA128DRegClassID, RegNo);
818 Inst.addOperand(MCOperand::CreateReg(Reg));
819 return MCDisassembler::Success;
822 static DecodeStatus DecodeMSACtrlRegisterClass(MCInst &Inst,
825 const void *Decoder) {
827 return MCDisassembler::Fail;
829 unsigned Reg = getReg(Decoder, Mips::MSACtrlRegClassID, RegNo);
830 Inst.addOperand(MCOperand::CreateReg(Reg));
831 return MCDisassembler::Success;
834 static DecodeStatus DecodeBranchTarget(MCInst &Inst,
837 const void *Decoder) {
838 unsigned BranchOffset = Offset & 0xffff;
839 BranchOffset = SignExtend32<18>(BranchOffset << 2) + 4;
840 Inst.addOperand(MCOperand::CreateImm(BranchOffset));
841 return MCDisassembler::Success;
844 static DecodeStatus DecodeJumpTarget(MCInst &Inst,
847 const void *Decoder) {
849 unsigned JumpOffset = fieldFromInstruction(Insn, 0, 26) << 2;
850 Inst.addOperand(MCOperand::CreateImm(JumpOffset));
851 return MCDisassembler::Success;
854 static DecodeStatus DecodeBranchTargetMM(MCInst &Inst,
857 const void *Decoder) {
858 unsigned BranchOffset = Offset & 0xffff;
859 BranchOffset = SignExtend32<18>(BranchOffset << 1);
860 Inst.addOperand(MCOperand::CreateImm(BranchOffset));
861 return MCDisassembler::Success;
864 static DecodeStatus DecodeJumpTargetMM(MCInst &Inst,
867 const void *Decoder) {
868 unsigned JumpOffset = fieldFromInstruction(Insn, 0, 26) << 1;
869 Inst.addOperand(MCOperand::CreateImm(JumpOffset));
870 return MCDisassembler::Success;
873 static DecodeStatus DecodeSimm16(MCInst &Inst,
876 const void *Decoder) {
877 Inst.addOperand(MCOperand::CreateImm(SignExtend32<16>(Insn)));
878 return MCDisassembler::Success;
881 static DecodeStatus DecodeLSAImm(MCInst &Inst,
884 const void *Decoder) {
885 // We add one to the immediate field as it was encoded as 'imm - 1'.
886 Inst.addOperand(MCOperand::CreateImm(Insn + 1));
887 return MCDisassembler::Success;
890 static DecodeStatus DecodeInsSize(MCInst &Inst,
893 const void *Decoder) {
894 // First we need to grab the pos(lsb) from MCInst.
895 int Pos = Inst.getOperand(2).getImm();
896 int Size = (int) Insn - Pos + 1;
897 Inst.addOperand(MCOperand::CreateImm(SignExtend32<16>(Size)));
898 return MCDisassembler::Success;
901 static DecodeStatus DecodeExtSize(MCInst &Inst,
904 const void *Decoder) {
905 int Size = (int) Insn + 1;
906 Inst.addOperand(MCOperand::CreateImm(SignExtend32<16>(Size)));
907 return MCDisassembler::Success;