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/TargetRegistry.h"
27 #define DEBUG_TYPE "mips-disassembler"
29 typedef MCDisassembler::DecodeStatus DecodeStatus;
33 class MipsDisassembler : public MCDisassembler {
37 MipsDisassembler(const MCSubtargetInfo &STI, MCContext &Ctx, bool IsBigEndian)
38 : MCDisassembler(STI, Ctx),
39 IsMicroMips(STI.getFeatureBits()[Mips::FeatureMicroMips]),
40 IsBigEndian(IsBigEndian) {}
42 bool hasMips3() const { return STI.getFeatureBits()[Mips::FeatureMips3]; }
43 bool hasMips32() const { return STI.getFeatureBits()[Mips::FeatureMips32]; }
44 bool hasMips32r6() const {
45 return STI.getFeatureBits()[Mips::FeatureMips32r6];
48 bool isGP64() const { return STI.getFeatureBits()[Mips::FeatureGP64Bit]; }
50 bool hasCnMips() const { return STI.getFeatureBits()[Mips::FeatureCnMips]; }
52 bool hasCOP3() const {
53 // Only present in MIPS-I and MIPS-II
54 return !hasMips32() && !hasMips3();
57 DecodeStatus getInstruction(MCInst &Instr, uint64_t &Size,
58 ArrayRef<uint8_t> Bytes, uint64_t Address,
60 raw_ostream &CStream) const override;
63 } // end anonymous namespace
65 // Forward declare these because the autogenerated code will reference them.
66 // Definitions are further down.
67 static DecodeStatus DecodeGPR64RegisterClass(MCInst &Inst,
72 static DecodeStatus DecodeCPU16RegsRegisterClass(MCInst &Inst,
77 static DecodeStatus DecodeGPRMM16RegisterClass(MCInst &Inst,
82 static DecodeStatus DecodeGPRMM16ZeroRegisterClass(MCInst &Inst,
87 static DecodeStatus DecodeGPRMM16MovePRegisterClass(MCInst &Inst,
92 static DecodeStatus DecodeGPR32RegisterClass(MCInst &Inst,
97 static DecodeStatus DecodePtrRegisterClass(MCInst &Inst,
100 const void *Decoder);
102 static DecodeStatus DecodeDSPRRegisterClass(MCInst &Inst,
105 const void *Decoder);
107 static DecodeStatus DecodeFGR64RegisterClass(MCInst &Inst,
110 const void *Decoder);
112 static DecodeStatus DecodeFGR32RegisterClass(MCInst &Inst,
115 const void *Decoder);
117 static DecodeStatus DecodeCCRRegisterClass(MCInst &Inst,
120 const void *Decoder);
122 static DecodeStatus DecodeFCCRegisterClass(MCInst &Inst,
125 const void *Decoder);
127 static DecodeStatus DecodeFGRCCRegisterClass(MCInst &Inst, unsigned RegNo,
129 const void *Decoder);
131 static DecodeStatus DecodeHWRegsRegisterClass(MCInst &Inst,
134 const void *Decoder);
136 static DecodeStatus DecodeAFGR64RegisterClass(MCInst &Inst,
139 const void *Decoder);
141 static DecodeStatus DecodeACC64DSPRegisterClass(MCInst &Inst,
144 const void *Decoder);
146 static DecodeStatus DecodeHI32DSPRegisterClass(MCInst &Inst,
149 const void *Decoder);
151 static DecodeStatus DecodeLO32DSPRegisterClass(MCInst &Inst,
154 const void *Decoder);
156 static DecodeStatus DecodeMSA128BRegisterClass(MCInst &Inst,
159 const void *Decoder);
161 static DecodeStatus DecodeMSA128HRegisterClass(MCInst &Inst,
164 const void *Decoder);
166 static DecodeStatus DecodeMSA128WRegisterClass(MCInst &Inst,
169 const void *Decoder);
171 static DecodeStatus DecodeMSA128DRegisterClass(MCInst &Inst,
174 const void *Decoder);
176 static DecodeStatus DecodeMSACtrlRegisterClass(MCInst &Inst,
179 const void *Decoder);
181 static DecodeStatus DecodeCOP0RegisterClass(MCInst &Inst,
184 const void *Decoder);
186 static DecodeStatus DecodeCOP2RegisterClass(MCInst &Inst,
189 const void *Decoder);
191 static DecodeStatus DecodeBranchTarget(MCInst &Inst,
194 const void *Decoder);
196 static DecodeStatus DecodeJumpTarget(MCInst &Inst,
199 const void *Decoder);
201 static DecodeStatus DecodeBranchTarget21(MCInst &Inst,
204 const void *Decoder);
206 static DecodeStatus DecodeBranchTarget26(MCInst &Inst,
209 const void *Decoder);
211 // DecodeBranchTarget7MM - Decode microMIPS branch offset, which is
212 // shifted left by 1 bit.
213 static DecodeStatus DecodeBranchTarget7MM(MCInst &Inst,
216 const void *Decoder);
218 // DecodeBranchTarget10MM - Decode microMIPS branch offset, which is
219 // shifted left by 1 bit.
220 static DecodeStatus DecodeBranchTarget10MM(MCInst &Inst,
223 const void *Decoder);
225 // DecodeBranchTargetMM - Decode microMIPS branch offset, which is
226 // shifted left by 1 bit.
227 static DecodeStatus DecodeBranchTargetMM(MCInst &Inst,
230 const void *Decoder);
232 // DecodeJumpTargetMM - Decode microMIPS jump target, which is
233 // shifted left by 1 bit.
234 static DecodeStatus DecodeJumpTargetMM(MCInst &Inst,
237 const void *Decoder);
239 static DecodeStatus DecodeMem(MCInst &Inst,
242 const void *Decoder);
244 static DecodeStatus DecodeCacheOp(MCInst &Inst,
247 const void *Decoder);
249 static DecodeStatus DecodeCacheOpR6(MCInst &Inst,
252 const void *Decoder);
254 static DecodeStatus DecodeCacheOpMM(MCInst &Inst,
257 const void *Decoder);
259 static DecodeStatus DecodeStoreEvaOpMM(MCInst &Inst,
262 const void *Decoder);
264 static DecodeStatus DecodeSyncI(MCInst &Inst,
267 const void *Decoder);
269 static DecodeStatus DecodeMSA128Mem(MCInst &Inst, unsigned Insn,
270 uint64_t Address, const void *Decoder);
272 static DecodeStatus DecodeMemMMImm4(MCInst &Inst,
275 const void *Decoder);
277 static DecodeStatus DecodeMemMMSPImm5Lsl2(MCInst &Inst,
280 const void *Decoder);
282 static DecodeStatus DecodeMemMMGPImm7Lsl2(MCInst &Inst,
285 const void *Decoder);
287 static DecodeStatus DecodeMemMMReglistImm4Lsl2(MCInst &Inst,
290 const void *Decoder);
292 static DecodeStatus DecodeMemMMImm9(MCInst &Inst,
295 const void *Decoder);
297 static DecodeStatus DecodeMemMMImm12(MCInst &Inst,
300 const void *Decoder);
302 static DecodeStatus DecodeMemMMImm16(MCInst &Inst,
305 const void *Decoder);
307 static DecodeStatus DecodeFMem(MCInst &Inst, unsigned Insn,
309 const void *Decoder);
311 static DecodeStatus DecodeFMem2(MCInst &Inst, unsigned Insn,
313 const void *Decoder);
315 static DecodeStatus DecodeFMem3(MCInst &Inst, unsigned Insn,
317 const void *Decoder);
319 static DecodeStatus DecodeFMemCop2R6(MCInst &Inst, unsigned Insn,
321 const void *Decoder);
323 static DecodeStatus DecodeSpecial3LlSc(MCInst &Inst,
326 const void *Decoder);
328 static DecodeStatus DecodeAddiur2Simm7(MCInst &Inst,
331 const void *Decoder);
333 static DecodeStatus DecodeUImm6Lsl2(MCInst &Inst,
336 const void *Decoder);
338 static DecodeStatus DecodeLiSimm7(MCInst &Inst,
341 const void *Decoder);
343 static DecodeStatus DecodeSimm4(MCInst &Inst,
346 const void *Decoder);
348 static DecodeStatus DecodeSimm16(MCInst &Inst,
351 const void *Decoder);
353 // Decode the immediate field of an LSA instruction which
355 static DecodeStatus DecodeLSAImm(MCInst &Inst,
358 const void *Decoder);
360 static DecodeStatus DecodeInsSize(MCInst &Inst,
363 const void *Decoder);
365 static DecodeStatus DecodeExtSize(MCInst &Inst,
368 const void *Decoder);
370 static DecodeStatus DecodeSimm19Lsl2(MCInst &Inst, unsigned Insn,
371 uint64_t Address, const void *Decoder);
373 static DecodeStatus DecodeSimm18Lsl3(MCInst &Inst, unsigned Insn,
374 uint64_t Address, const void *Decoder);
376 static DecodeStatus DecodeSimm9SP(MCInst &Inst, unsigned Insn,
377 uint64_t Address, const void *Decoder);
379 static DecodeStatus DecodeANDI16Imm(MCInst &Inst, unsigned Insn,
380 uint64_t Address, const void *Decoder);
382 static DecodeStatus DecodeUImm5lsl2(MCInst &Inst, unsigned Insn,
383 uint64_t Address, const void *Decoder);
385 static DecodeStatus DecodeSimm23Lsl2(MCInst &Inst, unsigned Insn,
386 uint64_t Address, const void *Decoder);
388 /// INSVE_[BHWD] have an implicit operand that the generated decoder doesn't
390 template <typename InsnType>
391 static DecodeStatus DecodeINSVE_DF(MCInst &MI, InsnType insn, uint64_t Address,
392 const void *Decoder);
394 template <typename InsnType>
396 DecodeAddiGroupBranch(MCInst &MI, InsnType insn, uint64_t Address,
397 const void *Decoder);
399 template <typename InsnType>
401 DecodeDaddiGroupBranch(MCInst &MI, InsnType insn, uint64_t Address,
402 const void *Decoder);
404 template <typename InsnType>
406 DecodeBlezlGroupBranch(MCInst &MI, InsnType insn, uint64_t Address,
407 const void *Decoder);
409 template <typename InsnType>
411 DecodeBgtzlGroupBranch(MCInst &MI, InsnType insn, uint64_t Address,
412 const void *Decoder);
414 template <typename InsnType>
416 DecodeBgtzGroupBranch(MCInst &MI, InsnType insn, uint64_t Address,
417 const void *Decoder);
419 template <typename InsnType>
421 DecodeBlezGroupBranch(MCInst &MI, InsnType insn, uint64_t Address,
422 const void *Decoder);
424 static DecodeStatus DecodeRegListOperand(MCInst &Inst, unsigned Insn,
426 const void *Decoder);
428 static DecodeStatus DecodeRegListOperand16(MCInst &Inst, unsigned Insn,
430 const void *Decoder);
432 static DecodeStatus DecodeMovePRegPair(MCInst &Inst, unsigned Insn,
434 const void *Decoder);
437 extern Target TheMipselTarget, TheMipsTarget, TheMips64Target,
441 static MCDisassembler *createMipsDisassembler(
443 const MCSubtargetInfo &STI,
445 return new MipsDisassembler(STI, Ctx, true);
448 static MCDisassembler *createMipselDisassembler(
450 const MCSubtargetInfo &STI,
452 return new MipsDisassembler(STI, Ctx, false);
455 extern "C" void LLVMInitializeMipsDisassembler() {
456 // Register the disassembler.
457 TargetRegistry::RegisterMCDisassembler(TheMipsTarget,
458 createMipsDisassembler);
459 TargetRegistry::RegisterMCDisassembler(TheMipselTarget,
460 createMipselDisassembler);
461 TargetRegistry::RegisterMCDisassembler(TheMips64Target,
462 createMipsDisassembler);
463 TargetRegistry::RegisterMCDisassembler(TheMips64elTarget,
464 createMipselDisassembler);
467 #include "MipsGenDisassemblerTables.inc"
469 static unsigned getReg(const void *D, unsigned RC, unsigned RegNo) {
470 const MipsDisassembler *Dis = static_cast<const MipsDisassembler*>(D);
471 const MCRegisterInfo *RegInfo = Dis->getContext().getRegisterInfo();
472 return *(RegInfo->getRegClass(RC).begin() + RegNo);
475 template <typename InsnType>
476 static DecodeStatus DecodeINSVE_DF(MCInst &MI, InsnType insn, uint64_t Address,
477 const void *Decoder) {
478 typedef DecodeStatus (*DecodeFN)(MCInst &, unsigned, uint64_t, const void *);
479 // The size of the n field depends on the element size
480 // The register class also depends on this.
481 InsnType tmp = fieldFromInstruction(insn, 17, 5);
483 DecodeFN RegDecoder = nullptr;
484 if ((tmp & 0x18) == 0x00) { // INSVE_B
486 RegDecoder = DecodeMSA128BRegisterClass;
487 } else if ((tmp & 0x1c) == 0x10) { // INSVE_H
489 RegDecoder = DecodeMSA128HRegisterClass;
490 } else if ((tmp & 0x1e) == 0x18) { // INSVE_W
492 RegDecoder = DecodeMSA128WRegisterClass;
493 } else if ((tmp & 0x1f) == 0x1c) { // INSVE_D
495 RegDecoder = DecodeMSA128DRegisterClass;
497 llvm_unreachable("Invalid encoding");
499 assert(NSize != 0 && RegDecoder != nullptr);
502 tmp = fieldFromInstruction(insn, 6, 5);
503 if (RegDecoder(MI, tmp, Address, Decoder) == MCDisassembler::Fail)
504 return MCDisassembler::Fail;
506 if (RegDecoder(MI, tmp, Address, Decoder) == MCDisassembler::Fail)
507 return MCDisassembler::Fail;
509 tmp = fieldFromInstruction(insn, 16, NSize);
510 MI.addOperand(MCOperand::createImm(tmp));
512 tmp = fieldFromInstruction(insn, 11, 5);
513 if (RegDecoder(MI, tmp, Address, Decoder) == MCDisassembler::Fail)
514 return MCDisassembler::Fail;
516 MI.addOperand(MCOperand::createImm(0));
518 return MCDisassembler::Success;
521 template <typename InsnType>
522 static DecodeStatus DecodeAddiGroupBranch(MCInst &MI, InsnType insn,
524 const void *Decoder) {
525 // If we are called then we can assume that MIPS32r6/MIPS64r6 is enabled
526 // (otherwise we would have matched the ADDI instruction from the earlier
530 // 0b001000 sssss ttttt iiiiiiiiiiiiiiii
532 // BEQZALC if rs == 0 && rt != 0
533 // BEQC if rs < rt && rs != 0
535 InsnType Rs = fieldFromInstruction(insn, 21, 5);
536 InsnType Rt = fieldFromInstruction(insn, 16, 5);
537 InsnType Imm = SignExtend64(fieldFromInstruction(insn, 0, 16), 16) * 4;
541 MI.setOpcode(Mips::BOVC);
543 } else if (Rs != 0 && Rs < Rt) {
544 MI.setOpcode(Mips::BEQC);
547 MI.setOpcode(Mips::BEQZALC);
550 MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,
553 MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,
555 MI.addOperand(MCOperand::createImm(Imm));
557 return MCDisassembler::Success;
560 template <typename InsnType>
561 static DecodeStatus DecodeDaddiGroupBranch(MCInst &MI, InsnType insn,
563 const void *Decoder) {
564 // If we are called then we can assume that MIPS32r6/MIPS64r6 is enabled
565 // (otherwise we would have matched the ADDI instruction from the earlier
569 // 0b011000 sssss ttttt iiiiiiiiiiiiiiii
571 // BNEZALC if rs == 0 && rt != 0
572 // BNEC if rs < rt && rs != 0
574 InsnType Rs = fieldFromInstruction(insn, 21, 5);
575 InsnType Rt = fieldFromInstruction(insn, 16, 5);
576 InsnType Imm = SignExtend64(fieldFromInstruction(insn, 0, 16), 16) * 4;
580 MI.setOpcode(Mips::BNVC);
582 } else if (Rs != 0 && Rs < Rt) {
583 MI.setOpcode(Mips::BNEC);
586 MI.setOpcode(Mips::BNEZALC);
589 MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,
592 MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,
594 MI.addOperand(MCOperand::createImm(Imm));
596 return MCDisassembler::Success;
599 template <typename InsnType>
600 static DecodeStatus DecodeBlezlGroupBranch(MCInst &MI, InsnType insn,
602 const void *Decoder) {
603 // If we are called then we can assume that MIPS32r6/MIPS64r6 is enabled
604 // (otherwise we would have matched the BLEZL instruction from the earlier
608 // 0b010110 sssss ttttt iiiiiiiiiiiiiiii
609 // Invalid if rs == 0
610 // BLEZC if rs == 0 && rt != 0
611 // BGEZC if rs == rt && rt != 0
612 // BGEC if rs != rt && rs != 0 && rt != 0
614 InsnType Rs = fieldFromInstruction(insn, 21, 5);
615 InsnType Rt = fieldFromInstruction(insn, 16, 5);
616 InsnType Imm = SignExtend64(fieldFromInstruction(insn, 0, 16), 16) * 4;
620 return MCDisassembler::Fail;
622 MI.setOpcode(Mips::BLEZC);
624 MI.setOpcode(Mips::BGEZC);
627 MI.setOpcode(Mips::BGEC);
631 MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,
634 MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,
637 MI.addOperand(MCOperand::createImm(Imm));
639 return MCDisassembler::Success;
642 template <typename InsnType>
643 static DecodeStatus DecodeBgtzlGroupBranch(MCInst &MI, InsnType insn,
645 const void *Decoder) {
646 // If we are called then we can assume that MIPS32r6/MIPS64r6 is enabled
647 // (otherwise we would have matched the BGTZL instruction from the earlier
651 // 0b010111 sssss ttttt iiiiiiiiiiiiiiii
652 // Invalid if rs == 0
653 // BGTZC if rs == 0 && rt != 0
654 // BLTZC if rs == rt && rt != 0
655 // BLTC if rs != rt && rs != 0 && rt != 0
659 InsnType Rs = fieldFromInstruction(insn, 21, 5);
660 InsnType Rt = fieldFromInstruction(insn, 16, 5);
661 InsnType Imm = SignExtend64(fieldFromInstruction(insn, 0, 16), 16) * 4;
664 return MCDisassembler::Fail;
666 MI.setOpcode(Mips::BGTZC);
668 MI.setOpcode(Mips::BLTZC);
670 MI.setOpcode(Mips::BLTC);
675 MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,
678 MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,
681 MI.addOperand(MCOperand::createImm(Imm));
683 return MCDisassembler::Success;
686 template <typename InsnType>
687 static DecodeStatus DecodeBgtzGroupBranch(MCInst &MI, InsnType insn,
689 const void *Decoder) {
690 // If we are called then we can assume that MIPS32r6/MIPS64r6 is enabled
691 // (otherwise we would have matched the BGTZ instruction from the earlier
695 // 0b000111 sssss ttttt iiiiiiiiiiiiiiii
697 // BGTZALC if rs == 0 && rt != 0
698 // BLTZALC if rs != 0 && rs == rt
699 // BLTUC if rs != 0 && rs != rt
701 InsnType Rs = fieldFromInstruction(insn, 21, 5);
702 InsnType Rt = fieldFromInstruction(insn, 16, 5);
703 InsnType Imm = SignExtend64(fieldFromInstruction(insn, 0, 16), 16) * 4;
708 MI.setOpcode(Mips::BGTZ);
710 } else if (Rs == 0) {
711 MI.setOpcode(Mips::BGTZALC);
713 } else if (Rs == Rt) {
714 MI.setOpcode(Mips::BLTZALC);
717 MI.setOpcode(Mips::BLTUC);
723 MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,
727 MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,
730 MI.addOperand(MCOperand::createImm(Imm));
732 return MCDisassembler::Success;
735 template <typename InsnType>
736 static DecodeStatus DecodeBlezGroupBranch(MCInst &MI, InsnType insn,
738 const void *Decoder) {
739 // If we are called then we can assume that MIPS32r6/MIPS64r6 is enabled
740 // (otherwise we would have matched the BLEZL instruction from the earlier
744 // 0b000110 sssss ttttt iiiiiiiiiiiiiiii
745 // Invalid if rs == 0
746 // BLEZALC if rs == 0 && rt != 0
747 // BGEZALC if rs == rt && rt != 0
748 // BGEUC if rs != rt && rs != 0 && rt != 0
750 InsnType Rs = fieldFromInstruction(insn, 21, 5);
751 InsnType Rt = fieldFromInstruction(insn, 16, 5);
752 InsnType Imm = SignExtend64(fieldFromInstruction(insn, 0, 16), 16) * 4;
756 return MCDisassembler::Fail;
758 MI.setOpcode(Mips::BLEZALC);
760 MI.setOpcode(Mips::BGEZALC);
763 MI.setOpcode(Mips::BGEUC);
767 MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,
769 MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,
772 MI.addOperand(MCOperand::createImm(Imm));
774 return MCDisassembler::Success;
777 /// Read two bytes from the ArrayRef and return 16 bit halfword sorted
778 /// according to the given endianess.
779 static DecodeStatus readInstruction16(ArrayRef<uint8_t> Bytes, uint64_t Address,
780 uint64_t &Size, uint32_t &Insn,
782 // We want to read exactly 2 Bytes of data.
783 if (Bytes.size() < 2) {
785 return MCDisassembler::Fail;
789 Insn = (Bytes[0] << 8) | Bytes[1];
791 Insn = (Bytes[1] << 8) | Bytes[0];
794 return MCDisassembler::Success;
797 /// Read four bytes from the ArrayRef and return 32 bit word sorted
798 /// according to the given endianess
799 static DecodeStatus readInstruction32(ArrayRef<uint8_t> Bytes, uint64_t Address,
800 uint64_t &Size, uint32_t &Insn,
801 bool IsBigEndian, bool IsMicroMips) {
802 // We want to read exactly 4 Bytes of data.
803 if (Bytes.size() < 4) {
805 return MCDisassembler::Fail;
808 // High 16 bits of a 32-bit microMIPS instruction (where the opcode is)
809 // always precede the low 16 bits in the instruction stream (that is, they
810 // are placed at lower addresses in the instruction stream).
812 // microMIPS byte ordering:
813 // Big-endian: 0 | 1 | 2 | 3
814 // Little-endian: 1 | 0 | 3 | 2
817 // Encoded as a big-endian 32-bit word in the stream.
819 (Bytes[3] << 0) | (Bytes[2] << 8) | (Bytes[1] << 16) | (Bytes[0] << 24);
822 Insn = (Bytes[2] << 0) | (Bytes[3] << 8) | (Bytes[0] << 16) |
825 Insn = (Bytes[0] << 0) | (Bytes[1] << 8) | (Bytes[2] << 16) |
830 return MCDisassembler::Success;
833 DecodeStatus MipsDisassembler::getInstruction(MCInst &Instr, uint64_t &Size,
834 ArrayRef<uint8_t> Bytes,
836 raw_ostream &VStream,
837 raw_ostream &CStream) const {
842 Result = readInstruction16(Bytes, Address, Size, Insn, IsBigEndian);
845 DEBUG(dbgs() << "Trying MicroMipsR616 table (16-bit instructions):\n");
846 // Calling the auto-generated decoder function for microMIPS32R6
847 // (and microMIPS64R6) 16-bit instructions.
848 Result = decodeInstruction(DecoderTableMicroMipsR616, Instr, Insn,
850 if (Result != MCDisassembler::Fail) {
856 DEBUG(dbgs() << "Trying MicroMips16 table (16-bit instructions):\n");
857 // Calling the auto-generated decoder function for microMIPS 16-bit
859 Result = decodeInstruction(DecoderTableMicroMips16, Instr, Insn, Address,
861 if (Result != MCDisassembler::Fail) {
866 Result = readInstruction32(Bytes, Address, Size, Insn, IsBigEndian, true);
867 if (Result == MCDisassembler::Fail)
868 return MCDisassembler::Fail;
871 DEBUG(dbgs() << "Trying MicroMips32r632 table (32-bit instructions):\n");
872 // Calling the auto-generated decoder function.
873 Result = decodeInstruction(DecoderTableMicroMipsR632, Instr, Insn, Address,
875 if (Result != MCDisassembler::Fail) {
881 DEBUG(dbgs() << "Trying MicroMips32 table (32-bit instructions):\n");
882 // Calling the auto-generated decoder function.
883 Result = decodeInstruction(DecoderTableMicroMips32, Instr, Insn, Address,
885 if (Result != MCDisassembler::Fail) {
889 return MCDisassembler::Fail;
892 Result = readInstruction32(Bytes, Address, Size, Insn, IsBigEndian, false);
893 if (Result == MCDisassembler::Fail)
894 return MCDisassembler::Fail;
897 DEBUG(dbgs() << "Trying COP3_ table (32-bit opcodes):\n");
899 decodeInstruction(DecoderTableCOP3_32, Instr, Insn, Address, this, STI);
900 if (Result != MCDisassembler::Fail) {
906 if (hasMips32r6() && isGP64()) {
907 DEBUG(dbgs() << "Trying Mips32r6_64r6 (GPR64) table (32-bit opcodes):\n");
908 Result = decodeInstruction(DecoderTableMips32r6_64r6_GP6432, Instr, Insn,
910 if (Result != MCDisassembler::Fail) {
917 DEBUG(dbgs() << "Trying Mips32r6_64r6 table (32-bit opcodes):\n");
918 Result = decodeInstruction(DecoderTableMips32r6_64r632, Instr, Insn,
920 if (Result != MCDisassembler::Fail) {
927 DEBUG(dbgs() << "Trying CnMips table (32-bit opcodes):\n");
928 Result = decodeInstruction(DecoderTableCnMips32, Instr, Insn,
930 if (Result != MCDisassembler::Fail) {
937 DEBUG(dbgs() << "Trying Mips64 (GPR64) table (32-bit opcodes):\n");
938 Result = decodeInstruction(DecoderTableMips6432, Instr, Insn,
940 if (Result != MCDisassembler::Fail) {
946 DEBUG(dbgs() << "Trying Mips table (32-bit opcodes):\n");
947 // Calling the auto-generated decoder function.
949 decodeInstruction(DecoderTableMips32, Instr, Insn, Address, this, STI);
950 if (Result != MCDisassembler::Fail) {
955 return MCDisassembler::Fail;
958 static DecodeStatus DecodeCPU16RegsRegisterClass(MCInst &Inst,
961 const void *Decoder) {
963 return MCDisassembler::Fail;
967 static DecodeStatus DecodeGPR64RegisterClass(MCInst &Inst,
970 const void *Decoder) {
973 return MCDisassembler::Fail;
975 unsigned Reg = getReg(Decoder, Mips::GPR64RegClassID, RegNo);
976 Inst.addOperand(MCOperand::createReg(Reg));
977 return MCDisassembler::Success;
980 static DecodeStatus DecodeGPRMM16RegisterClass(MCInst &Inst,
983 const void *Decoder) {
985 return MCDisassembler::Fail;
986 unsigned Reg = getReg(Decoder, Mips::GPRMM16RegClassID, RegNo);
987 Inst.addOperand(MCOperand::createReg(Reg));
988 return MCDisassembler::Success;
991 static DecodeStatus DecodeGPRMM16ZeroRegisterClass(MCInst &Inst,
994 const void *Decoder) {
996 return MCDisassembler::Fail;
997 unsigned Reg = getReg(Decoder, Mips::GPRMM16ZeroRegClassID, RegNo);
998 Inst.addOperand(MCOperand::createReg(Reg));
999 return MCDisassembler::Success;
1002 static DecodeStatus DecodeGPRMM16MovePRegisterClass(MCInst &Inst,
1005 const void *Decoder) {
1007 return MCDisassembler::Fail;
1008 unsigned Reg = getReg(Decoder, Mips::GPRMM16MovePRegClassID, RegNo);
1009 Inst.addOperand(MCOperand::createReg(Reg));
1010 return MCDisassembler::Success;
1013 static DecodeStatus DecodeGPR32RegisterClass(MCInst &Inst,
1016 const void *Decoder) {
1018 return MCDisassembler::Fail;
1019 unsigned Reg = getReg(Decoder, Mips::GPR32RegClassID, RegNo);
1020 Inst.addOperand(MCOperand::createReg(Reg));
1021 return MCDisassembler::Success;
1024 static DecodeStatus DecodePtrRegisterClass(MCInst &Inst,
1027 const void *Decoder) {
1028 if (static_cast<const MipsDisassembler *>(Decoder)->isGP64())
1029 return DecodeGPR64RegisterClass(Inst, RegNo, Address, Decoder);
1031 return DecodeGPR32RegisterClass(Inst, RegNo, Address, Decoder);
1034 static DecodeStatus DecodeDSPRRegisterClass(MCInst &Inst,
1037 const void *Decoder) {
1038 return DecodeGPR32RegisterClass(Inst, RegNo, Address, Decoder);
1041 static DecodeStatus DecodeFGR64RegisterClass(MCInst &Inst,
1044 const void *Decoder) {
1046 return MCDisassembler::Fail;
1048 unsigned Reg = getReg(Decoder, Mips::FGR64RegClassID, RegNo);
1049 Inst.addOperand(MCOperand::createReg(Reg));
1050 return MCDisassembler::Success;
1053 static DecodeStatus DecodeFGR32RegisterClass(MCInst &Inst,
1056 const void *Decoder) {
1058 return MCDisassembler::Fail;
1060 unsigned Reg = getReg(Decoder, Mips::FGR32RegClassID, RegNo);
1061 Inst.addOperand(MCOperand::createReg(Reg));
1062 return MCDisassembler::Success;
1065 static DecodeStatus DecodeCCRRegisterClass(MCInst &Inst,
1068 const void *Decoder) {
1070 return MCDisassembler::Fail;
1071 unsigned Reg = getReg(Decoder, Mips::CCRRegClassID, RegNo);
1072 Inst.addOperand(MCOperand::createReg(Reg));
1073 return MCDisassembler::Success;
1076 static DecodeStatus DecodeFCCRegisterClass(MCInst &Inst,
1079 const void *Decoder) {
1081 return MCDisassembler::Fail;
1082 unsigned Reg = getReg(Decoder, Mips::FCCRegClassID, RegNo);
1083 Inst.addOperand(MCOperand::createReg(Reg));
1084 return MCDisassembler::Success;
1087 static DecodeStatus DecodeFGRCCRegisterClass(MCInst &Inst, unsigned RegNo,
1089 const void *Decoder) {
1091 return MCDisassembler::Fail;
1093 unsigned Reg = getReg(Decoder, Mips::FGRCCRegClassID, RegNo);
1094 Inst.addOperand(MCOperand::createReg(Reg));
1095 return MCDisassembler::Success;
1098 static DecodeStatus DecodeMem(MCInst &Inst,
1101 const void *Decoder) {
1102 int Offset = SignExtend32<16>(Insn & 0xffff);
1103 unsigned Reg = fieldFromInstruction(Insn, 16, 5);
1104 unsigned Base = fieldFromInstruction(Insn, 21, 5);
1106 Reg = getReg(Decoder, Mips::GPR32RegClassID, Reg);
1107 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
1109 if(Inst.getOpcode() == Mips::SC ||
1110 Inst.getOpcode() == Mips::SCD){
1111 Inst.addOperand(MCOperand::createReg(Reg));
1114 Inst.addOperand(MCOperand::createReg(Reg));
1115 Inst.addOperand(MCOperand::createReg(Base));
1116 Inst.addOperand(MCOperand::createImm(Offset));
1118 return MCDisassembler::Success;
1121 static DecodeStatus DecodeCacheOp(MCInst &Inst,
1124 const void *Decoder) {
1125 int Offset = SignExtend32<16>(Insn & 0xffff);
1126 unsigned Hint = fieldFromInstruction(Insn, 16, 5);
1127 unsigned Base = fieldFromInstruction(Insn, 21, 5);
1129 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
1131 Inst.addOperand(MCOperand::createReg(Base));
1132 Inst.addOperand(MCOperand::createImm(Offset));
1133 Inst.addOperand(MCOperand::createImm(Hint));
1135 return MCDisassembler::Success;
1138 static DecodeStatus DecodeCacheOpMM(MCInst &Inst,
1141 const void *Decoder) {
1142 int Offset = SignExtend32<12>(Insn & 0xfff);
1143 unsigned Base = fieldFromInstruction(Insn, 16, 5);
1144 unsigned Hint = fieldFromInstruction(Insn, 21, 5);
1146 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
1148 Inst.addOperand(MCOperand::createReg(Base));
1149 Inst.addOperand(MCOperand::createImm(Offset));
1150 Inst.addOperand(MCOperand::createImm(Hint));
1152 return MCDisassembler::Success;
1155 static DecodeStatus DecodeCacheOpR6(MCInst &Inst,
1158 const void *Decoder) {
1159 int Offset = fieldFromInstruction(Insn, 7, 9);
1160 unsigned Hint = fieldFromInstruction(Insn, 16, 5);
1161 unsigned Base = fieldFromInstruction(Insn, 21, 5);
1163 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
1165 Inst.addOperand(MCOperand::createReg(Base));
1166 Inst.addOperand(MCOperand::createImm(Offset));
1167 Inst.addOperand(MCOperand::createImm(Hint));
1169 return MCDisassembler::Success;
1172 static DecodeStatus DecodeStoreEvaOpMM(MCInst &Inst,
1175 const void *Decoder) {
1176 int Offset = SignExtend32<9>(Insn & 0x1ff);
1177 unsigned Reg = fieldFromInstruction(Insn, 21, 5);
1178 unsigned Base = fieldFromInstruction(Insn, 16, 5);
1180 Reg = getReg(Decoder, Mips::GPR32RegClassID, Reg);
1181 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
1183 Inst.addOperand(MCOperand::createReg(Reg));
1184 Inst.addOperand(MCOperand::createReg(Base));
1185 Inst.addOperand(MCOperand::createImm(Offset));
1187 return MCDisassembler::Success;
1190 static DecodeStatus DecodeSyncI(MCInst &Inst,
1193 const void *Decoder) {
1194 int Offset = SignExtend32<16>(Insn & 0xffff);
1195 unsigned Base = fieldFromInstruction(Insn, 21, 5);
1197 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
1199 Inst.addOperand(MCOperand::createReg(Base));
1200 Inst.addOperand(MCOperand::createImm(Offset));
1202 return MCDisassembler::Success;
1205 static DecodeStatus DecodeMSA128Mem(MCInst &Inst, unsigned Insn,
1206 uint64_t Address, const void *Decoder) {
1207 int Offset = SignExtend32<10>(fieldFromInstruction(Insn, 16, 10));
1208 unsigned Reg = fieldFromInstruction(Insn, 6, 5);
1209 unsigned Base = fieldFromInstruction(Insn, 11, 5);
1211 Reg = getReg(Decoder, Mips::MSA128BRegClassID, Reg);
1212 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
1214 Inst.addOperand(MCOperand::createReg(Reg));
1215 Inst.addOperand(MCOperand::createReg(Base));
1217 // The immediate field of an LD/ST instruction is scaled which means it must
1218 // be multiplied (when decoding) by the size (in bytes) of the instructions'
1224 switch(Inst.getOpcode())
1227 assert (0 && "Unexpected instruction");
1228 return MCDisassembler::Fail;
1232 Inst.addOperand(MCOperand::createImm(Offset));
1236 Inst.addOperand(MCOperand::createImm(Offset * 2));
1240 Inst.addOperand(MCOperand::createImm(Offset * 4));
1244 Inst.addOperand(MCOperand::createImm(Offset * 8));
1248 return MCDisassembler::Success;
1251 static DecodeStatus DecodeMemMMImm4(MCInst &Inst,
1254 const void *Decoder) {
1255 unsigned Offset = Insn & 0xf;
1256 unsigned Reg = fieldFromInstruction(Insn, 7, 3);
1257 unsigned Base = fieldFromInstruction(Insn, 4, 3);
1259 switch (Inst.getOpcode()) {
1260 case Mips::LBU16_MM:
1261 case Mips::LHU16_MM:
1263 if (DecodeGPRMM16RegisterClass(Inst, Reg, Address, Decoder)
1264 == MCDisassembler::Fail)
1265 return MCDisassembler::Fail;
1270 if (DecodeGPRMM16ZeroRegisterClass(Inst, Reg, Address, Decoder)
1271 == MCDisassembler::Fail)
1272 return MCDisassembler::Fail;
1276 if (DecodeGPRMM16RegisterClass(Inst, Base, Address, Decoder)
1277 == MCDisassembler::Fail)
1278 return MCDisassembler::Fail;
1280 switch (Inst.getOpcode()) {
1281 case Mips::LBU16_MM:
1283 Inst.addOperand(MCOperand::createImm(-1));
1285 Inst.addOperand(MCOperand::createImm(Offset));
1288 Inst.addOperand(MCOperand::createImm(Offset));
1290 case Mips::LHU16_MM:
1292 Inst.addOperand(MCOperand::createImm(Offset << 1));
1296 Inst.addOperand(MCOperand::createImm(Offset << 2));
1300 return MCDisassembler::Success;
1303 static DecodeStatus DecodeMemMMSPImm5Lsl2(MCInst &Inst,
1306 const void *Decoder) {
1307 unsigned Offset = Insn & 0x1F;
1308 unsigned Reg = fieldFromInstruction(Insn, 5, 5);
1310 Reg = getReg(Decoder, Mips::GPR32RegClassID, Reg);
1312 Inst.addOperand(MCOperand::createReg(Reg));
1313 Inst.addOperand(MCOperand::createReg(Mips::SP));
1314 Inst.addOperand(MCOperand::createImm(Offset << 2));
1316 return MCDisassembler::Success;
1319 static DecodeStatus DecodeMemMMGPImm7Lsl2(MCInst &Inst,
1322 const void *Decoder) {
1323 unsigned Offset = Insn & 0x7F;
1324 unsigned Reg = fieldFromInstruction(Insn, 7, 3);
1326 Reg = getReg(Decoder, Mips::GPR32RegClassID, Reg);
1328 Inst.addOperand(MCOperand::createReg(Reg));
1329 Inst.addOperand(MCOperand::createReg(Mips::GP));
1330 Inst.addOperand(MCOperand::createImm(Offset << 2));
1332 return MCDisassembler::Success;
1335 static DecodeStatus DecodeMemMMReglistImm4Lsl2(MCInst &Inst,
1338 const void *Decoder) {
1339 int Offset = SignExtend32<4>(Insn & 0xf);
1341 if (DecodeRegListOperand16(Inst, Insn, Address, Decoder)
1342 == MCDisassembler::Fail)
1343 return MCDisassembler::Fail;
1345 Inst.addOperand(MCOperand::createReg(Mips::SP));
1346 Inst.addOperand(MCOperand::createImm(Offset << 2));
1348 return MCDisassembler::Success;
1351 static DecodeStatus DecodeMemMMImm9(MCInst &Inst,
1354 const void *Decoder) {
1355 int Offset = SignExtend32<9>(Insn & 0x1ff);
1356 unsigned Reg = fieldFromInstruction(Insn, 21, 5);
1357 unsigned Base = fieldFromInstruction(Insn, 16, 5);
1359 Reg = getReg(Decoder, Mips::GPR32RegClassID, Reg);
1360 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
1362 Inst.addOperand(MCOperand::createReg(Reg));
1363 Inst.addOperand(MCOperand::createReg(Base));
1364 Inst.addOperand(MCOperand::createImm(Offset));
1366 return MCDisassembler::Success;
1369 static DecodeStatus DecodeMemMMImm12(MCInst &Inst,
1372 const void *Decoder) {
1373 int Offset = SignExtend32<12>(Insn & 0x0fff);
1374 unsigned Reg = fieldFromInstruction(Insn, 21, 5);
1375 unsigned Base = fieldFromInstruction(Insn, 16, 5);
1377 Reg = getReg(Decoder, Mips::GPR32RegClassID, Reg);
1378 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
1380 switch (Inst.getOpcode()) {
1381 case Mips::SWM32_MM:
1382 case Mips::LWM32_MM:
1383 if (DecodeRegListOperand(Inst, Insn, Address, Decoder)
1384 == MCDisassembler::Fail)
1385 return MCDisassembler::Fail;
1386 Inst.addOperand(MCOperand::createReg(Base));
1387 Inst.addOperand(MCOperand::createImm(Offset));
1390 Inst.addOperand(MCOperand::createReg(Reg));
1393 Inst.addOperand(MCOperand::createReg(Reg));
1394 if (Inst.getOpcode() == Mips::LWP_MM || Inst.getOpcode() == Mips::SWP_MM)
1395 Inst.addOperand(MCOperand::createReg(Reg+1));
1397 Inst.addOperand(MCOperand::createReg(Base));
1398 Inst.addOperand(MCOperand::createImm(Offset));
1401 return MCDisassembler::Success;
1404 static DecodeStatus DecodeMemMMImm16(MCInst &Inst,
1407 const void *Decoder) {
1408 int Offset = SignExtend32<16>(Insn & 0xffff);
1409 unsigned Reg = fieldFromInstruction(Insn, 21, 5);
1410 unsigned Base = fieldFromInstruction(Insn, 16, 5);
1412 Reg = getReg(Decoder, Mips::GPR32RegClassID, Reg);
1413 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
1415 Inst.addOperand(MCOperand::createReg(Reg));
1416 Inst.addOperand(MCOperand::createReg(Base));
1417 Inst.addOperand(MCOperand::createImm(Offset));
1419 return MCDisassembler::Success;
1422 static DecodeStatus DecodeFMem(MCInst &Inst,
1425 const void *Decoder) {
1426 int Offset = SignExtend32<16>(Insn & 0xffff);
1427 unsigned Reg = fieldFromInstruction(Insn, 16, 5);
1428 unsigned Base = fieldFromInstruction(Insn, 21, 5);
1430 Reg = getReg(Decoder, Mips::FGR64RegClassID, Reg);
1431 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
1433 Inst.addOperand(MCOperand::createReg(Reg));
1434 Inst.addOperand(MCOperand::createReg(Base));
1435 Inst.addOperand(MCOperand::createImm(Offset));
1437 return MCDisassembler::Success;
1440 static DecodeStatus DecodeFMem2(MCInst &Inst,
1443 const void *Decoder) {
1444 int Offset = SignExtend32<16>(Insn & 0xffff);
1445 unsigned Reg = fieldFromInstruction(Insn, 16, 5);
1446 unsigned Base = fieldFromInstruction(Insn, 21, 5);
1448 Reg = getReg(Decoder, Mips::COP2RegClassID, Reg);
1449 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
1451 Inst.addOperand(MCOperand::createReg(Reg));
1452 Inst.addOperand(MCOperand::createReg(Base));
1453 Inst.addOperand(MCOperand::createImm(Offset));
1455 return MCDisassembler::Success;
1458 static DecodeStatus DecodeFMem3(MCInst &Inst,
1461 const void *Decoder) {
1462 int Offset = SignExtend32<16>(Insn & 0xffff);
1463 unsigned Reg = fieldFromInstruction(Insn, 16, 5);
1464 unsigned Base = fieldFromInstruction(Insn, 21, 5);
1466 Reg = getReg(Decoder, Mips::COP3RegClassID, Reg);
1467 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
1469 Inst.addOperand(MCOperand::createReg(Reg));
1470 Inst.addOperand(MCOperand::createReg(Base));
1471 Inst.addOperand(MCOperand::createImm(Offset));
1473 return MCDisassembler::Success;
1476 static DecodeStatus DecodeFMemCop2R6(MCInst &Inst,
1479 const void *Decoder) {
1480 int Offset = SignExtend32<11>(Insn & 0x07ff);
1481 unsigned Reg = fieldFromInstruction(Insn, 16, 5);
1482 unsigned Base = fieldFromInstruction(Insn, 11, 5);
1484 Reg = getReg(Decoder, Mips::COP2RegClassID, Reg);
1485 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
1487 Inst.addOperand(MCOperand::createReg(Reg));
1488 Inst.addOperand(MCOperand::createReg(Base));
1489 Inst.addOperand(MCOperand::createImm(Offset));
1491 return MCDisassembler::Success;
1493 static DecodeStatus DecodeSpecial3LlSc(MCInst &Inst,
1496 const void *Decoder) {
1497 int64_t Offset = SignExtend64<9>((Insn >> 7) & 0x1ff);
1498 unsigned Rt = fieldFromInstruction(Insn, 16, 5);
1499 unsigned Base = fieldFromInstruction(Insn, 21, 5);
1501 Rt = getReg(Decoder, Mips::GPR32RegClassID, Rt);
1502 Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
1504 if(Inst.getOpcode() == Mips::SC_R6 || Inst.getOpcode() == Mips::SCD_R6){
1505 Inst.addOperand(MCOperand::createReg(Rt));
1508 Inst.addOperand(MCOperand::createReg(Rt));
1509 Inst.addOperand(MCOperand::createReg(Base));
1510 Inst.addOperand(MCOperand::createImm(Offset));
1512 return MCDisassembler::Success;
1515 static DecodeStatus DecodeHWRegsRegisterClass(MCInst &Inst,
1518 const void *Decoder) {
1519 // Currently only hardware register 29 is supported.
1521 return MCDisassembler::Fail;
1522 Inst.addOperand(MCOperand::createReg(Mips::HWR29));
1523 return MCDisassembler::Success;
1526 static DecodeStatus DecodeAFGR64RegisterClass(MCInst &Inst,
1529 const void *Decoder) {
1530 if (RegNo > 30 || RegNo %2)
1531 return MCDisassembler::Fail;
1534 unsigned Reg = getReg(Decoder, Mips::AFGR64RegClassID, RegNo /2);
1535 Inst.addOperand(MCOperand::createReg(Reg));
1536 return MCDisassembler::Success;
1539 static DecodeStatus DecodeACC64DSPRegisterClass(MCInst &Inst,
1542 const void *Decoder) {
1544 return MCDisassembler::Fail;
1546 unsigned Reg = getReg(Decoder, Mips::ACC64DSPRegClassID, RegNo);
1547 Inst.addOperand(MCOperand::createReg(Reg));
1548 return MCDisassembler::Success;
1551 static DecodeStatus DecodeHI32DSPRegisterClass(MCInst &Inst,
1554 const void *Decoder) {
1556 return MCDisassembler::Fail;
1558 unsigned Reg = getReg(Decoder, Mips::HI32DSPRegClassID, RegNo);
1559 Inst.addOperand(MCOperand::createReg(Reg));
1560 return MCDisassembler::Success;
1563 static DecodeStatus DecodeLO32DSPRegisterClass(MCInst &Inst,
1566 const void *Decoder) {
1568 return MCDisassembler::Fail;
1570 unsigned Reg = getReg(Decoder, Mips::LO32DSPRegClassID, RegNo);
1571 Inst.addOperand(MCOperand::createReg(Reg));
1572 return MCDisassembler::Success;
1575 static DecodeStatus DecodeMSA128BRegisterClass(MCInst &Inst,
1578 const void *Decoder) {
1580 return MCDisassembler::Fail;
1582 unsigned Reg = getReg(Decoder, Mips::MSA128BRegClassID, RegNo);
1583 Inst.addOperand(MCOperand::createReg(Reg));
1584 return MCDisassembler::Success;
1587 static DecodeStatus DecodeMSA128HRegisterClass(MCInst &Inst,
1590 const void *Decoder) {
1592 return MCDisassembler::Fail;
1594 unsigned Reg = getReg(Decoder, Mips::MSA128HRegClassID, RegNo);
1595 Inst.addOperand(MCOperand::createReg(Reg));
1596 return MCDisassembler::Success;
1599 static DecodeStatus DecodeMSA128WRegisterClass(MCInst &Inst,
1602 const void *Decoder) {
1604 return MCDisassembler::Fail;
1606 unsigned Reg = getReg(Decoder, Mips::MSA128WRegClassID, RegNo);
1607 Inst.addOperand(MCOperand::createReg(Reg));
1608 return MCDisassembler::Success;
1611 static DecodeStatus DecodeMSA128DRegisterClass(MCInst &Inst,
1614 const void *Decoder) {
1616 return MCDisassembler::Fail;
1618 unsigned Reg = getReg(Decoder, Mips::MSA128DRegClassID, RegNo);
1619 Inst.addOperand(MCOperand::createReg(Reg));
1620 return MCDisassembler::Success;
1623 static DecodeStatus DecodeMSACtrlRegisterClass(MCInst &Inst,
1626 const void *Decoder) {
1628 return MCDisassembler::Fail;
1630 unsigned Reg = getReg(Decoder, Mips::MSACtrlRegClassID, RegNo);
1631 Inst.addOperand(MCOperand::createReg(Reg));
1632 return MCDisassembler::Success;
1635 static DecodeStatus DecodeCOP0RegisterClass(MCInst &Inst,
1638 const void *Decoder) {
1640 return MCDisassembler::Fail;
1642 unsigned Reg = getReg(Decoder, Mips::COP0RegClassID, RegNo);
1643 Inst.addOperand(MCOperand::createReg(Reg));
1644 return MCDisassembler::Success;
1647 static DecodeStatus DecodeCOP2RegisterClass(MCInst &Inst,
1650 const void *Decoder) {
1652 return MCDisassembler::Fail;
1654 unsigned Reg = getReg(Decoder, Mips::COP2RegClassID, RegNo);
1655 Inst.addOperand(MCOperand::createReg(Reg));
1656 return MCDisassembler::Success;
1659 static DecodeStatus DecodeBranchTarget(MCInst &Inst,
1662 const void *Decoder) {
1663 int32_t BranchOffset = (SignExtend32<16>(Offset) * 4) + 4;
1664 Inst.addOperand(MCOperand::createImm(BranchOffset));
1665 return MCDisassembler::Success;
1668 static DecodeStatus DecodeJumpTarget(MCInst &Inst,
1671 const void *Decoder) {
1673 unsigned JumpOffset = fieldFromInstruction(Insn, 0, 26) << 2;
1674 Inst.addOperand(MCOperand::createImm(JumpOffset));
1675 return MCDisassembler::Success;
1678 static DecodeStatus DecodeBranchTarget21(MCInst &Inst,
1681 const void *Decoder) {
1682 int32_t BranchOffset = SignExtend32<21>(Offset) * 4;
1684 Inst.addOperand(MCOperand::createImm(BranchOffset));
1685 return MCDisassembler::Success;
1688 static DecodeStatus DecodeBranchTarget26(MCInst &Inst,
1691 const void *Decoder) {
1692 int32_t BranchOffset = SignExtend32<26>(Offset) * 4;
1694 Inst.addOperand(MCOperand::createImm(BranchOffset));
1695 return MCDisassembler::Success;
1698 static DecodeStatus DecodeBranchTarget7MM(MCInst &Inst,
1701 const void *Decoder) {
1702 int32_t BranchOffset = SignExtend32<7>(Offset) << 1;
1703 Inst.addOperand(MCOperand::createImm(BranchOffset));
1704 return MCDisassembler::Success;
1707 static DecodeStatus DecodeBranchTarget10MM(MCInst &Inst,
1710 const void *Decoder) {
1711 int32_t BranchOffset = SignExtend32<10>(Offset) << 1;
1712 Inst.addOperand(MCOperand::createImm(BranchOffset));
1713 return MCDisassembler::Success;
1716 static DecodeStatus DecodeBranchTargetMM(MCInst &Inst,
1719 const void *Decoder) {
1720 int32_t BranchOffset = SignExtend32<16>(Offset) * 2;
1721 Inst.addOperand(MCOperand::createImm(BranchOffset));
1722 return MCDisassembler::Success;
1725 static DecodeStatus DecodeJumpTargetMM(MCInst &Inst,
1728 const void *Decoder) {
1729 unsigned JumpOffset = fieldFromInstruction(Insn, 0, 26) << 1;
1730 Inst.addOperand(MCOperand::createImm(JumpOffset));
1731 return MCDisassembler::Success;
1734 static DecodeStatus DecodeAddiur2Simm7(MCInst &Inst,
1737 const void *Decoder) {
1739 Inst.addOperand(MCOperand::createImm(1));
1740 else if (Value == 0x7)
1741 Inst.addOperand(MCOperand::createImm(-1));
1743 Inst.addOperand(MCOperand::createImm(Value << 2));
1744 return MCDisassembler::Success;
1747 static DecodeStatus DecodeUImm6Lsl2(MCInst &Inst,
1750 const void *Decoder) {
1751 Inst.addOperand(MCOperand::createImm(Value << 2));
1752 return MCDisassembler::Success;
1755 static DecodeStatus DecodeLiSimm7(MCInst &Inst,
1758 const void *Decoder) {
1760 Inst.addOperand(MCOperand::createImm(-1));
1762 Inst.addOperand(MCOperand::createImm(Value));
1763 return MCDisassembler::Success;
1766 static DecodeStatus DecodeSimm4(MCInst &Inst,
1769 const void *Decoder) {
1770 Inst.addOperand(MCOperand::createImm(SignExtend32<4>(Value)));
1771 return MCDisassembler::Success;
1774 static DecodeStatus DecodeSimm16(MCInst &Inst,
1777 const void *Decoder) {
1778 Inst.addOperand(MCOperand::createImm(SignExtend32<16>(Insn)));
1779 return MCDisassembler::Success;
1782 static DecodeStatus DecodeLSAImm(MCInst &Inst,
1785 const void *Decoder) {
1786 // We add one to the immediate field as it was encoded as 'imm - 1'.
1787 Inst.addOperand(MCOperand::createImm(Insn + 1));
1788 return MCDisassembler::Success;
1791 static DecodeStatus DecodeInsSize(MCInst &Inst,
1794 const void *Decoder) {
1795 // First we need to grab the pos(lsb) from MCInst.
1796 int Pos = Inst.getOperand(2).getImm();
1797 int Size = (int) Insn - Pos + 1;
1798 Inst.addOperand(MCOperand::createImm(SignExtend32<16>(Size)));
1799 return MCDisassembler::Success;
1802 static DecodeStatus DecodeExtSize(MCInst &Inst,
1805 const void *Decoder) {
1806 int Size = (int) Insn + 1;
1807 Inst.addOperand(MCOperand::createImm(SignExtend32<16>(Size)));
1808 return MCDisassembler::Success;
1811 static DecodeStatus DecodeSimm19Lsl2(MCInst &Inst, unsigned Insn,
1812 uint64_t Address, const void *Decoder) {
1813 Inst.addOperand(MCOperand::createImm(SignExtend32<19>(Insn) * 4));
1814 return MCDisassembler::Success;
1817 static DecodeStatus DecodeSimm18Lsl3(MCInst &Inst, unsigned Insn,
1818 uint64_t Address, const void *Decoder) {
1819 Inst.addOperand(MCOperand::createImm(SignExtend32<18>(Insn) * 8));
1820 return MCDisassembler::Success;
1823 static DecodeStatus DecodeSimm9SP(MCInst &Inst, unsigned Insn,
1824 uint64_t Address, const void *Decoder) {
1825 int32_t DecodedValue;
1827 case 0: DecodedValue = 256; break;
1828 case 1: DecodedValue = 257; break;
1829 case 510: DecodedValue = -258; break;
1830 case 511: DecodedValue = -257; break;
1831 default: DecodedValue = SignExtend32<9>(Insn); break;
1833 Inst.addOperand(MCOperand::createImm(DecodedValue * 4));
1834 return MCDisassembler::Success;
1837 static DecodeStatus DecodeANDI16Imm(MCInst &Inst, unsigned Insn,
1838 uint64_t Address, const void *Decoder) {
1839 // Insn must be >= 0, since it is unsigned that condition is always true.
1841 int32_t DecodedValues[] = {128, 1, 2, 3, 4, 7, 8, 15, 16, 31, 32, 63, 64,
1843 Inst.addOperand(MCOperand::createImm(DecodedValues[Insn]));
1844 return MCDisassembler::Success;
1847 static DecodeStatus DecodeUImm5lsl2(MCInst &Inst, unsigned Insn,
1848 uint64_t Address, const void *Decoder) {
1849 Inst.addOperand(MCOperand::createImm(Insn << 2));
1850 return MCDisassembler::Success;
1853 static DecodeStatus DecodeRegListOperand(MCInst &Inst,
1856 const void *Decoder) {
1857 unsigned Regs[] = {Mips::S0, Mips::S1, Mips::S2, Mips::S3, Mips::S4, Mips::S5,
1858 Mips::S6, Mips::FP};
1861 unsigned RegLst = fieldFromInstruction(Insn, 21, 5);
1862 // Empty register lists are not allowed.
1864 return MCDisassembler::Fail;
1866 RegNum = RegLst & 0xf;
1867 for (unsigned i = 0; i < RegNum; i++)
1868 Inst.addOperand(MCOperand::createReg(Regs[i]));
1871 Inst.addOperand(MCOperand::createReg(Mips::RA));
1873 return MCDisassembler::Success;
1876 static DecodeStatus DecodeRegListOperand16(MCInst &Inst, unsigned Insn,
1878 const void *Decoder) {
1879 unsigned Regs[] = {Mips::S0, Mips::S1, Mips::S2, Mips::S3};
1880 unsigned RegLst = fieldFromInstruction(Insn, 4, 2);
1881 unsigned RegNum = RegLst & 0x3;
1883 for (unsigned i = 0; i <= RegNum; i++)
1884 Inst.addOperand(MCOperand::createReg(Regs[i]));
1886 Inst.addOperand(MCOperand::createReg(Mips::RA));
1888 return MCDisassembler::Success;
1891 static DecodeStatus DecodeMovePRegPair(MCInst &Inst, unsigned Insn,
1892 uint64_t Address, const void *Decoder) {
1894 unsigned RegPair = fieldFromInstruction(Insn, 7, 3);
1898 return MCDisassembler::Fail;
1900 Inst.addOperand(MCOperand::createReg(Mips::A1));
1901 Inst.addOperand(MCOperand::createReg(Mips::A2));
1904 Inst.addOperand(MCOperand::createReg(Mips::A1));
1905 Inst.addOperand(MCOperand::createReg(Mips::A3));
1908 Inst.addOperand(MCOperand::createReg(Mips::A2));
1909 Inst.addOperand(MCOperand::createReg(Mips::A3));
1912 Inst.addOperand(MCOperand::createReg(Mips::A0));
1913 Inst.addOperand(MCOperand::createReg(Mips::S5));
1916 Inst.addOperand(MCOperand::createReg(Mips::A0));
1917 Inst.addOperand(MCOperand::createReg(Mips::S6));
1920 Inst.addOperand(MCOperand::createReg(Mips::A0));
1921 Inst.addOperand(MCOperand::createReg(Mips::A1));
1924 Inst.addOperand(MCOperand::createReg(Mips::A0));
1925 Inst.addOperand(MCOperand::createReg(Mips::A2));
1928 Inst.addOperand(MCOperand::createReg(Mips::A0));
1929 Inst.addOperand(MCOperand::createReg(Mips::A3));
1933 return MCDisassembler::Success;
1936 static DecodeStatus DecodeSimm23Lsl2(MCInst &Inst, unsigned Insn,
1937 uint64_t Address, const void *Decoder) {
1938 Inst.addOperand(MCOperand::createImm(SignExtend32<25>(Insn << 2)));
1939 return MCDisassembler::Success;