Home | History | Annotate | Download | only in Disassembler
      1 //===- MipsDisassembler.cpp - Disassembler for Mips -------------*- C++ -*-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 // This file is part of the Mips Disassembler.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #include "Mips.h"
     15 #include "MipsRegisterInfo.h"
     16 #include "MipsSubtarget.h"
     17 #include "llvm/MC/MCContext.h"
     18 #include "llvm/MC/MCDisassembler/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"
     24 
     25 using namespace llvm;
     26 
     27 #define DEBUG_TYPE "mips-disassembler"
     28 
     29 typedef MCDisassembler::DecodeStatus DecodeStatus;
     30 
     31 namespace {
     32 
     33 class MipsDisassembler : public MCDisassembler {
     34   bool IsMicroMips;
     35   bool IsBigEndian;
     36 public:
     37   MipsDisassembler(const MCSubtargetInfo &STI, MCContext &Ctx, bool IsBigEndian)
     38       : MCDisassembler(STI, Ctx),
     39         IsMicroMips(STI.getFeatureBits()[Mips::FeatureMicroMips]),
     40         IsBigEndian(IsBigEndian) {}
     41 
     42   bool hasMips2() const { return STI.getFeatureBits()[Mips::FeatureMips2]; }
     43   bool hasMips3() const { return STI.getFeatureBits()[Mips::FeatureMips3]; }
     44   bool hasMips32() const { return STI.getFeatureBits()[Mips::FeatureMips32]; }
     45   bool hasMips32r6() const {
     46     return STI.getFeatureBits()[Mips::FeatureMips32r6];
     47   }
     48   bool isFP64() const { return STI.getFeatureBits()[Mips::FeatureFP64Bit]; }
     49 
     50   bool isGP64() const { return STI.getFeatureBits()[Mips::FeatureGP64Bit]; }
     51 
     52   bool isPTR64() const { return STI.getFeatureBits()[Mips::FeaturePTR64Bit]; }
     53 
     54   bool hasCnMips() const { return STI.getFeatureBits()[Mips::FeatureCnMips]; }
     55 
     56   bool hasCOP3() const {
     57     // Only present in MIPS-I and MIPS-II
     58     return !hasMips32() && !hasMips3();
     59   }
     60 
     61   DecodeStatus getInstruction(MCInst &Instr, uint64_t &Size,
     62                               ArrayRef<uint8_t> Bytes, uint64_t Address,
     63                               raw_ostream &VStream,
     64                               raw_ostream &CStream) const override;
     65 };
     66 
     67 } // end anonymous namespace
     68 
     69 // Forward declare these because the autogenerated code will reference them.
     70 // Definitions are further down.
     71 static DecodeStatus DecodeGPR64RegisterClass(MCInst &Inst,
     72                                              unsigned RegNo,
     73                                              uint64_t Address,
     74                                              const void *Decoder);
     75 
     76 static DecodeStatus DecodeCPU16RegsRegisterClass(MCInst &Inst,
     77                                                  unsigned RegNo,
     78                                                  uint64_t Address,
     79                                                  const void *Decoder);
     80 
     81 static DecodeStatus DecodeGPRMM16RegisterClass(MCInst &Inst,
     82                                                unsigned RegNo,
     83                                                uint64_t Address,
     84                                                const void *Decoder);
     85 
     86 static DecodeStatus DecodeGPRMM16ZeroRegisterClass(MCInst &Inst,
     87                                                    unsigned RegNo,
     88                                                    uint64_t Address,
     89                                                    const void *Decoder);
     90 
     91 static DecodeStatus DecodeGPRMM16MovePRegisterClass(MCInst &Inst,
     92                                                     unsigned RegNo,
     93                                                     uint64_t Address,
     94                                                     const void *Decoder);
     95 
     96 static DecodeStatus DecodeGPR32RegisterClass(MCInst &Inst,
     97                                              unsigned RegNo,
     98                                              uint64_t Address,
     99                                              const void *Decoder);
    100 
    101 static DecodeStatus DecodePtrRegisterClass(MCInst &Inst,
    102                                            unsigned Insn,
    103                                            uint64_t Address,
    104                                            const void *Decoder);
    105 
    106 static DecodeStatus DecodeDSPRRegisterClass(MCInst &Inst,
    107                                             unsigned RegNo,
    108                                             uint64_t Address,
    109                                             const void *Decoder);
    110 
    111 static DecodeStatus DecodeFGR64RegisterClass(MCInst &Inst,
    112                                              unsigned RegNo,
    113                                              uint64_t Address,
    114                                              const void *Decoder);
    115 
    116 static DecodeStatus DecodeFGR32RegisterClass(MCInst &Inst,
    117                                              unsigned RegNo,
    118                                              uint64_t Address,
    119                                              const void *Decoder);
    120 
    121 static DecodeStatus DecodeCCRRegisterClass(MCInst &Inst,
    122                                            unsigned RegNo,
    123                                            uint64_t Address,
    124                                            const void *Decoder);
    125 
    126 static DecodeStatus DecodeFCCRegisterClass(MCInst &Inst,
    127                                            unsigned RegNo,
    128                                            uint64_t Address,
    129                                            const void *Decoder);
    130 
    131 static DecodeStatus DecodeFGRCCRegisterClass(MCInst &Inst, unsigned RegNo,
    132                                              uint64_t Address,
    133                                              const void *Decoder);
    134 
    135 static DecodeStatus DecodeHWRegsRegisterClass(MCInst &Inst,
    136                                               unsigned Insn,
    137                                               uint64_t Address,
    138                                               const void *Decoder);
    139 
    140 static DecodeStatus DecodeAFGR64RegisterClass(MCInst &Inst,
    141                                               unsigned RegNo,
    142                                               uint64_t Address,
    143                                               const void *Decoder);
    144 
    145 static DecodeStatus DecodeACC64DSPRegisterClass(MCInst &Inst,
    146                                                 unsigned RegNo,
    147                                                 uint64_t Address,
    148                                                 const void *Decoder);
    149 
    150 static DecodeStatus DecodeHI32DSPRegisterClass(MCInst &Inst,
    151                                                unsigned RegNo,
    152                                                uint64_t Address,
    153                                                const void *Decoder);
    154 
    155 static DecodeStatus DecodeLO32DSPRegisterClass(MCInst &Inst,
    156                                                unsigned RegNo,
    157                                                uint64_t Address,
    158                                                const void *Decoder);
    159 
    160 static DecodeStatus DecodeMSA128BRegisterClass(MCInst &Inst,
    161                                                unsigned RegNo,
    162                                                uint64_t Address,
    163                                                const void *Decoder);
    164 
    165 static DecodeStatus DecodeMSA128HRegisterClass(MCInst &Inst,
    166                                                unsigned RegNo,
    167                                                uint64_t Address,
    168                                                const void *Decoder);
    169 
    170 static DecodeStatus DecodeMSA128WRegisterClass(MCInst &Inst,
    171                                                unsigned RegNo,
    172                                                uint64_t Address,
    173                                                const void *Decoder);
    174 
    175 static DecodeStatus DecodeMSA128DRegisterClass(MCInst &Inst,
    176                                                unsigned RegNo,
    177                                                uint64_t Address,
    178                                                const void *Decoder);
    179 
    180 static DecodeStatus DecodeMSACtrlRegisterClass(MCInst &Inst,
    181                                                unsigned RegNo,
    182                                                uint64_t Address,
    183                                                const void *Decoder);
    184 
    185 static DecodeStatus DecodeCOP0RegisterClass(MCInst &Inst,
    186                                             unsigned RegNo,
    187                                             uint64_t Address,
    188                                             const void *Decoder);
    189 
    190 static DecodeStatus DecodeCOP2RegisterClass(MCInst &Inst,
    191                                             unsigned RegNo,
    192                                             uint64_t Address,
    193                                             const void *Decoder);
    194 
    195 static DecodeStatus DecodeBranchTarget(MCInst &Inst,
    196                                        unsigned Offset,
    197                                        uint64_t Address,
    198                                        const void *Decoder);
    199 
    200 static DecodeStatus DecodeBranchTarget1SImm16(MCInst &Inst,
    201                                               unsigned Offset,
    202                                               uint64_t Address,
    203                                               const void *Decoder);
    204 
    205 static DecodeStatus DecodeJumpTarget(MCInst &Inst,
    206                                      unsigned Insn,
    207                                      uint64_t Address,
    208                                      const void *Decoder);
    209 
    210 static DecodeStatus DecodeBranchTarget21(MCInst &Inst,
    211                                          unsigned Offset,
    212                                          uint64_t Address,
    213                                          const void *Decoder);
    214 
    215 static DecodeStatus DecodeBranchTarget21MM(MCInst &Inst,
    216                                            unsigned Offset,
    217                                            uint64_t Address,
    218                                            const void *Decoder);
    219 
    220 static DecodeStatus DecodeBranchTarget26(MCInst &Inst,
    221                                          unsigned Offset,
    222                                          uint64_t Address,
    223                                          const void *Decoder);
    224 
    225 // DecodeBranchTarget7MM - Decode microMIPS branch offset, which is
    226 // shifted left by 1 bit.
    227 static DecodeStatus DecodeBranchTarget7MM(MCInst &Inst,
    228                                           unsigned Offset,
    229                                           uint64_t Address,
    230                                           const void *Decoder);
    231 
    232 // DecodeBranchTarget10MM - Decode microMIPS branch offset, which is
    233 // shifted left by 1 bit.
    234 static DecodeStatus DecodeBranchTarget10MM(MCInst &Inst,
    235                                            unsigned Offset,
    236                                            uint64_t Address,
    237                                            const void *Decoder);
    238 
    239 // DecodeBranchTargetMM - Decode microMIPS branch offset, which is
    240 // shifted left by 1 bit.
    241 static DecodeStatus DecodeBranchTargetMM(MCInst &Inst,
    242                                          unsigned Offset,
    243                                          uint64_t Address,
    244                                          const void *Decoder);
    245 
    246 // DecodeBranchTarget26MM - Decode microMIPS branch offset, which is
    247 // shifted left by 1 bit.
    248 static DecodeStatus DecodeBranchTarget26MM(MCInst &Inst,
    249                                            unsigned Offset,
    250                                            uint64_t Address,
    251                                            const void *Decoder);
    252 
    253 // DecodeJumpTargetMM - Decode microMIPS jump target, which is
    254 // shifted left by 1 bit.
    255 static DecodeStatus DecodeJumpTargetMM(MCInst &Inst,
    256                                        unsigned Insn,
    257                                        uint64_t Address,
    258                                        const void *Decoder);
    259 
    260 static DecodeStatus DecodeMem(MCInst &Inst,
    261                               unsigned Insn,
    262                               uint64_t Address,
    263                               const void *Decoder);
    264 
    265 static DecodeStatus DecodeMemEVA(MCInst &Inst,
    266                                  unsigned Insn,
    267                                  uint64_t Address,
    268                                  const void *Decoder);
    269 
    270 static DecodeStatus DecodeLoadByte9(MCInst &Inst,
    271                                     unsigned Insn,
    272                                     uint64_t Address,
    273                                     const void *Decoder);
    274 
    275 static DecodeStatus DecodeLoadByte15(MCInst &Inst,
    276                                      unsigned Insn,
    277                                      uint64_t Address,
    278                                      const void *Decoder);
    279 
    280 static DecodeStatus DecodeCacheOp(MCInst &Inst,
    281                               unsigned Insn,
    282                               uint64_t Address,
    283                               const void *Decoder);
    284 
    285 static DecodeStatus DecodeCacheeOp_CacheOpR6(MCInst &Inst,
    286                                              unsigned Insn,
    287                                              uint64_t Address,
    288                                              const void *Decoder);
    289 
    290 static DecodeStatus DecodeCacheOpMM(MCInst &Inst,
    291                                     unsigned Insn,
    292                                     uint64_t Address,
    293                                     const void *Decoder);
    294 
    295 static DecodeStatus DecodeStoreEvaOpMM(MCInst &Inst,
    296                                        unsigned Insn,
    297                                        uint64_t Address,
    298                                        const void *Decoder);
    299 
    300 static DecodeStatus DecodePrefeOpMM(MCInst &Inst,
    301                                     unsigned Insn,
    302                                     uint64_t Address,
    303                                     const void *Decoder);
    304 
    305 static DecodeStatus DecodeSyncI(MCInst &Inst,
    306                                 unsigned Insn,
    307                                 uint64_t Address,
    308                                 const void *Decoder);
    309 
    310 static DecodeStatus DecodeSynciR6(MCInst &Inst,
    311                                   unsigned Insn,
    312                                   uint64_t Address,
    313                                   const void *Decoder);
    314 
    315 static DecodeStatus DecodeMSA128Mem(MCInst &Inst, unsigned Insn,
    316                                     uint64_t Address, const void *Decoder);
    317 
    318 static DecodeStatus DecodeMemMMImm4(MCInst &Inst,
    319                                     unsigned Insn,
    320                                     uint64_t Address,
    321                                     const void *Decoder);
    322 
    323 static DecodeStatus DecodeMemMMSPImm5Lsl2(MCInst &Inst,
    324                                           unsigned Insn,
    325                                           uint64_t Address,
    326                                           const void *Decoder);
    327 
    328 static DecodeStatus DecodeMemMMGPImm7Lsl2(MCInst &Inst,
    329                                           unsigned Insn,
    330                                           uint64_t Address,
    331                                           const void *Decoder);
    332 
    333 static DecodeStatus DecodeMemMMReglistImm4Lsl2(MCInst &Inst,
    334                                                unsigned Insn,
    335                                                uint64_t Address,
    336                                                const void *Decoder);
    337 
    338 static DecodeStatus DecodeMemMMImm9(MCInst &Inst,
    339                                     unsigned Insn,
    340                                     uint64_t Address,
    341                                     const void *Decoder);
    342 
    343 static DecodeStatus DecodeMemMMImm12(MCInst &Inst,
    344                                      unsigned Insn,
    345                                      uint64_t Address,
    346                                      const void *Decoder);
    347 
    348 static DecodeStatus DecodeMemMMImm16(MCInst &Inst,
    349                                      unsigned Insn,
    350                                      uint64_t Address,
    351                                      const void *Decoder);
    352 
    353 static DecodeStatus DecodeFMem(MCInst &Inst, unsigned Insn,
    354                                uint64_t Address,
    355                                const void *Decoder);
    356 
    357 static DecodeStatus DecodeFMemMMR2(MCInst &Inst, unsigned Insn,
    358                                    uint64_t Address,
    359                                    const void *Decoder);
    360 
    361 static DecodeStatus DecodeFMem2(MCInst &Inst, unsigned Insn,
    362                                uint64_t Address,
    363                                const void *Decoder);
    364 
    365 static DecodeStatus DecodeFMem3(MCInst &Inst, unsigned Insn,
    366                                uint64_t Address,
    367                                const void *Decoder);
    368 
    369 static DecodeStatus DecodeFMemCop2R6(MCInst &Inst, unsigned Insn,
    370                                uint64_t Address,
    371                                const void *Decoder);
    372 
    373 static DecodeStatus DecodeFMemCop2MMR6(MCInst &Inst, unsigned Insn,
    374                                        uint64_t Address,
    375                                        const void *Decoder);
    376 
    377 static DecodeStatus DecodeSpecial3LlSc(MCInst &Inst,
    378                                        unsigned Insn,
    379                                        uint64_t Address,
    380                                        const void *Decoder);
    381 
    382 static DecodeStatus DecodeAddiur2Simm7(MCInst &Inst,
    383                                        unsigned Value,
    384                                        uint64_t Address,
    385                                        const void *Decoder);
    386 
    387 static DecodeStatus DecodeLi16Imm(MCInst &Inst,
    388                                   unsigned Value,
    389                                   uint64_t Address,
    390                                   const void *Decoder);
    391 
    392 static DecodeStatus DecodePOOL16BEncodedField(MCInst &Inst,
    393                                               unsigned Value,
    394                                               uint64_t Address,
    395                                               const void *Decoder);
    396 
    397 template <unsigned Bits, int Offset, int Scale>
    398 static DecodeStatus DecodeUImmWithOffsetAndScale(MCInst &Inst, unsigned Value,
    399                                                  uint64_t Address,
    400                                                  const void *Decoder);
    401 
    402 template <unsigned Bits, int Offset>
    403 static DecodeStatus DecodeUImmWithOffset(MCInst &Inst, unsigned Value,
    404                                          uint64_t Address,
    405                                          const void *Decoder) {
    406   return DecodeUImmWithOffsetAndScale<Bits, Offset, 1>(Inst, Value, Address,
    407                                                        Decoder);
    408 }
    409 
    410 template <unsigned Bits, int Offset = 0, int ScaleBy = 1>
    411 static DecodeStatus DecodeSImmWithOffsetAndScale(MCInst &Inst, unsigned Value,
    412                                                  uint64_t Address,
    413                                                  const void *Decoder);
    414 
    415 static DecodeStatus DecodeInsSize(MCInst &Inst,
    416                                   unsigned Insn,
    417                                   uint64_t Address,
    418                                   const void *Decoder);
    419 
    420 static DecodeStatus DecodeSimm19Lsl2(MCInst &Inst, unsigned Insn,
    421                                      uint64_t Address, const void *Decoder);
    422 
    423 static DecodeStatus DecodeSimm18Lsl3(MCInst &Inst, unsigned Insn,
    424                                      uint64_t Address, const void *Decoder);
    425 
    426 static DecodeStatus DecodeSimm9SP(MCInst &Inst, unsigned Insn,
    427                                   uint64_t Address, const void *Decoder);
    428 
    429 static DecodeStatus DecodeANDI16Imm(MCInst &Inst, unsigned Insn,
    430                                     uint64_t Address, const void *Decoder);
    431 
    432 static DecodeStatus DecodeSimm23Lsl2(MCInst &Inst, unsigned Insn,
    433                                      uint64_t Address, const void *Decoder);
    434 
    435 /// INSVE_[BHWD] have an implicit operand that the generated decoder doesn't
    436 /// handle.
    437 template <typename InsnType>
    438 static DecodeStatus DecodeINSVE_DF(MCInst &MI, InsnType insn, uint64_t Address,
    439                                    const void *Decoder);
    440 
    441 template <typename InsnType>
    442 static DecodeStatus
    443 DecodeAddiGroupBranch(MCInst &MI, InsnType insn, uint64_t Address,
    444                       const void *Decoder);
    445 
    446 template <typename InsnType>
    447 static DecodeStatus
    448 DecodePOP35GroupBranchMMR6(MCInst &MI, InsnType insn, uint64_t Address,
    449                            const void *Decoder);
    450 
    451 template <typename InsnType>
    452 static DecodeStatus
    453 DecodeDaddiGroupBranch(MCInst &MI, InsnType insn, uint64_t Address,
    454                        const void *Decoder);
    455 
    456 template <typename InsnType>
    457 static DecodeStatus
    458 DecodePOP37GroupBranchMMR6(MCInst &MI, InsnType insn, uint64_t Address,
    459                            const void *Decoder);
    460 
    461 template <typename InsnType>
    462 static DecodeStatus
    463 DecodeBlezlGroupBranch(MCInst &MI, InsnType insn, uint64_t Address,
    464                        const void *Decoder);
    465 
    466 template <typename InsnType>
    467 static DecodeStatus
    468 DecodeBgtzlGroupBranch(MCInst &MI, InsnType insn, uint64_t Address,
    469                        const void *Decoder);
    470 
    471 template <typename InsnType>
    472 static DecodeStatus
    473 DecodeBgtzGroupBranch(MCInst &MI, InsnType insn, uint64_t Address,
    474                       const void *Decoder);
    475 
    476 template <typename InsnType>
    477 static DecodeStatus
    478 DecodeBlezGroupBranch(MCInst &MI, InsnType insn, uint64_t Address,
    479                        const void *Decoder);
    480 
    481 template <typename InsnType>
    482 static DecodeStatus
    483 DecodeBgtzGroupBranchMMR6(MCInst &MI, InsnType insn, uint64_t Address,
    484                           const void *Decoder);
    485 
    486 template <typename InsnType>
    487 static DecodeStatus
    488 DecodeBlezGroupBranchMMR6(MCInst &MI, InsnType insn, uint64_t Address,
    489                           const void *Decoder);
    490 
    491 static DecodeStatus DecodeRegListOperand(MCInst &Inst, unsigned Insn,
    492                                          uint64_t Address,
    493                                          const void *Decoder);
    494 
    495 static DecodeStatus DecodeRegListOperand16(MCInst &Inst, unsigned Insn,
    496                                            uint64_t Address,
    497                                            const void *Decoder);
    498 
    499 static DecodeStatus DecodeMovePRegPair(MCInst &Inst, unsigned Insn,
    500                                        uint64_t Address,
    501                                        const void *Decoder);
    502 
    503 namespace llvm {
    504 extern Target TheMipselTarget, TheMipsTarget, TheMips64Target,
    505               TheMips64elTarget;
    506 }
    507 
    508 static MCDisassembler *createMipsDisassembler(
    509                        const Target &T,
    510                        const MCSubtargetInfo &STI,
    511                        MCContext &Ctx) {
    512   return new MipsDisassembler(STI, Ctx, true);
    513 }
    514 
    515 static MCDisassembler *createMipselDisassembler(
    516                        const Target &T,
    517                        const MCSubtargetInfo &STI,
    518                        MCContext &Ctx) {
    519   return new MipsDisassembler(STI, Ctx, false);
    520 }
    521 
    522 extern "C" void LLVMInitializeMipsDisassembler() {
    523   // Register the disassembler.
    524   TargetRegistry::RegisterMCDisassembler(TheMipsTarget,
    525                                          createMipsDisassembler);
    526   TargetRegistry::RegisterMCDisassembler(TheMipselTarget,
    527                                          createMipselDisassembler);
    528   TargetRegistry::RegisterMCDisassembler(TheMips64Target,
    529                                          createMipsDisassembler);
    530   TargetRegistry::RegisterMCDisassembler(TheMips64elTarget,
    531                                          createMipselDisassembler);
    532 }
    533 
    534 #include "MipsGenDisassemblerTables.inc"
    535 
    536 static unsigned getReg(const void *D, unsigned RC, unsigned RegNo) {
    537   const MipsDisassembler *Dis = static_cast<const MipsDisassembler*>(D);
    538   const MCRegisterInfo *RegInfo = Dis->getContext().getRegisterInfo();
    539   return *(RegInfo->getRegClass(RC).begin() + RegNo);
    540 }
    541 
    542 template <typename InsnType>
    543 static DecodeStatus DecodeINSVE_DF(MCInst &MI, InsnType insn, uint64_t Address,
    544                                    const void *Decoder) {
    545   typedef DecodeStatus (*DecodeFN)(MCInst &, unsigned, uint64_t, const void *);
    546   // The size of the n field depends on the element size
    547   // The register class also depends on this.
    548   InsnType tmp = fieldFromInstruction(insn, 17, 5);
    549   unsigned NSize = 0;
    550   DecodeFN RegDecoder = nullptr;
    551   if ((tmp & 0x18) == 0x00) { // INSVE_B
    552     NSize = 4;
    553     RegDecoder = DecodeMSA128BRegisterClass;
    554   } else if ((tmp & 0x1c) == 0x10) { // INSVE_H
    555     NSize = 3;
    556     RegDecoder = DecodeMSA128HRegisterClass;
    557   } else if ((tmp & 0x1e) == 0x18) { // INSVE_W
    558     NSize = 2;
    559     RegDecoder = DecodeMSA128WRegisterClass;
    560   } else if ((tmp & 0x1f) == 0x1c) { // INSVE_D
    561     NSize = 1;
    562     RegDecoder = DecodeMSA128DRegisterClass;
    563   } else
    564     llvm_unreachable("Invalid encoding");
    565 
    566   assert(NSize != 0 && RegDecoder != nullptr);
    567 
    568   // $wd
    569   tmp = fieldFromInstruction(insn, 6, 5);
    570   if (RegDecoder(MI, tmp, Address, Decoder) == MCDisassembler::Fail)
    571     return MCDisassembler::Fail;
    572   // $wd_in
    573   if (RegDecoder(MI, tmp, Address, Decoder) == MCDisassembler::Fail)
    574     return MCDisassembler::Fail;
    575   // $n
    576   tmp = fieldFromInstruction(insn, 16, NSize);
    577   MI.addOperand(MCOperand::createImm(tmp));
    578   // $ws
    579   tmp = fieldFromInstruction(insn, 11, 5);
    580   if (RegDecoder(MI, tmp, Address, Decoder) == MCDisassembler::Fail)
    581     return MCDisassembler::Fail;
    582   // $n2
    583   MI.addOperand(MCOperand::createImm(0));
    584 
    585   return MCDisassembler::Success;
    586 }
    587 
    588 template <typename InsnType>
    589 static DecodeStatus DecodeAddiGroupBranch(MCInst &MI, InsnType insn,
    590                                           uint64_t Address,
    591                                           const void *Decoder) {
    592   // If we are called then we can assume that MIPS32r6/MIPS64r6 is enabled
    593   // (otherwise we would have matched the ADDI instruction from the earlier
    594   // ISA's instead).
    595   //
    596   // We have:
    597   //    0b001000 sssss ttttt iiiiiiiiiiiiiiii
    598   //      BOVC if rs >= rt
    599   //      BEQZALC if rs == 0 && rt != 0
    600   //      BEQC if rs < rt && rs != 0
    601 
    602   InsnType Rs = fieldFromInstruction(insn, 21, 5);
    603   InsnType Rt = fieldFromInstruction(insn, 16, 5);
    604   int64_t Imm = SignExtend64(fieldFromInstruction(insn, 0, 16), 16) * 4 + 4;
    605   bool HasRs = false;
    606 
    607   if (Rs >= Rt) {
    608     MI.setOpcode(Mips::BOVC);
    609     HasRs = true;
    610   } else if (Rs != 0 && Rs < Rt) {
    611     MI.setOpcode(Mips::BEQC);
    612     HasRs = true;
    613   } else
    614     MI.setOpcode(Mips::BEQZALC);
    615 
    616   if (HasRs)
    617     MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,
    618                                        Rs)));
    619 
    620   MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,
    621                                      Rt)));
    622   MI.addOperand(MCOperand::createImm(Imm));
    623 
    624   return MCDisassembler::Success;
    625 }
    626 
    627 template <typename InsnType>
    628 static DecodeStatus DecodePOP35GroupBranchMMR6(MCInst &MI, InsnType insn,
    629                                                uint64_t Address,
    630                                                const void *Decoder) {
    631   InsnType Rt = fieldFromInstruction(insn, 21, 5);
    632   InsnType Rs = fieldFromInstruction(insn, 16, 5);
    633   InsnType Imm = SignExtend64(fieldFromInstruction(insn, 0, 16), 16) * 2;
    634 
    635   if (Rs >= Rt) {
    636     MI.setOpcode(Mips::BOVC_MMR6);
    637     MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,
    638                                        Rt)));
    639     MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,
    640                                        Rs)));
    641   } else if (Rs != 0 && Rs < Rt) {
    642     MI.setOpcode(Mips::BEQC_MMR6);
    643     MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,
    644                                        Rs)));
    645     MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,
    646                                        Rt)));
    647   } else {
    648     MI.setOpcode(Mips::BEQZALC_MMR6);
    649     MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,
    650                                        Rt)));
    651   }
    652 
    653   MI.addOperand(MCOperand::createImm(Imm));
    654 
    655   return MCDisassembler::Success;
    656 }
    657 
    658 template <typename InsnType>
    659 static DecodeStatus DecodeDaddiGroupBranch(MCInst &MI, InsnType insn,
    660                                            uint64_t Address,
    661                                            const void *Decoder) {
    662   // If we are called then we can assume that MIPS32r6/MIPS64r6 is enabled
    663   // (otherwise we would have matched the ADDI instruction from the earlier
    664   // ISA's instead).
    665   //
    666   // We have:
    667   //    0b011000 sssss ttttt iiiiiiiiiiiiiiii
    668   //      BNVC if rs >= rt
    669   //      BNEZALC if rs == 0 && rt != 0
    670   //      BNEC if rs < rt && rs != 0
    671 
    672   InsnType Rs = fieldFromInstruction(insn, 21, 5);
    673   InsnType Rt = fieldFromInstruction(insn, 16, 5);
    674   int64_t  Imm = SignExtend64(fieldFromInstruction(insn, 0, 16), 16) * 4 + 4;
    675   bool HasRs = false;
    676 
    677   if (Rs >= Rt) {
    678     MI.setOpcode(Mips::BNVC);
    679     HasRs = true;
    680   } else if (Rs != 0 && Rs < Rt) {
    681     MI.setOpcode(Mips::BNEC);
    682     HasRs = true;
    683   } else
    684     MI.setOpcode(Mips::BNEZALC);
    685 
    686   if (HasRs)
    687     MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,
    688                                        Rs)));
    689 
    690   MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,
    691                                      Rt)));
    692   MI.addOperand(MCOperand::createImm(Imm));
    693 
    694   return MCDisassembler::Success;
    695 }
    696 
    697 template <typename InsnType>
    698 static DecodeStatus DecodePOP37GroupBranchMMR6(MCInst &MI, InsnType insn,
    699                                                uint64_t Address,
    700                                                const void *Decoder) {
    701   InsnType Rt = fieldFromInstruction(insn, 21, 5);
    702   InsnType Rs = fieldFromInstruction(insn, 16, 5);
    703   InsnType Imm = SignExtend64(fieldFromInstruction(insn, 0, 16), 16) * 2;
    704 
    705   if (Rs >= Rt) {
    706     MI.setOpcode(Mips::BNVC_MMR6);
    707     MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,
    708                                        Rt)));
    709     MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,
    710                                        Rs)));
    711   } else if (Rs != 0 && Rs < Rt) {
    712     MI.setOpcode(Mips::BNEC_MMR6);
    713     MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,
    714                                        Rs)));
    715     MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,
    716                                        Rt)));
    717   } else {
    718     MI.setOpcode(Mips::BNEZALC_MMR6);
    719     MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,
    720                                        Rt)));
    721   }
    722 
    723   MI.addOperand(MCOperand::createImm(Imm));
    724 
    725   return MCDisassembler::Success;
    726 }
    727 
    728 template <typename InsnType>
    729 static DecodeStatus DecodeBlezlGroupBranch(MCInst &MI, InsnType insn,
    730                                            uint64_t Address,
    731                                            const void *Decoder) {
    732   // If we are called then we can assume that MIPS32r6/MIPS64r6 is enabled
    733   // (otherwise we would have matched the BLEZL instruction from the earlier
    734   // ISA's instead).
    735   //
    736   // We have:
    737   //    0b010110 sssss ttttt iiiiiiiiiiiiiiii
    738   //      Invalid if rs == 0
    739   //      BLEZC   if rs == 0  && rt != 0
    740   //      BGEZC   if rs == rt && rt != 0
    741   //      BGEC    if rs != rt && rs != 0  && rt != 0
    742 
    743   InsnType Rs = fieldFromInstruction(insn, 21, 5);
    744   InsnType Rt = fieldFromInstruction(insn, 16, 5);
    745   int64_t Imm = SignExtend64(fieldFromInstruction(insn, 0, 16), 16) * 4 + 4;
    746   bool HasRs = false;
    747 
    748   if (Rt == 0)
    749     return MCDisassembler::Fail;
    750   else if (Rs == 0)
    751     MI.setOpcode(Mips::BLEZC);
    752   else if (Rs == Rt)
    753     MI.setOpcode(Mips::BGEZC);
    754   else {
    755     HasRs = true;
    756     MI.setOpcode(Mips::BGEC);
    757   }
    758 
    759   if (HasRs)
    760     MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,
    761                                        Rs)));
    762 
    763   MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,
    764                                      Rt)));
    765 
    766   MI.addOperand(MCOperand::createImm(Imm));
    767 
    768   return MCDisassembler::Success;
    769 }
    770 
    771 template <typename InsnType>
    772 static DecodeStatus DecodeBgtzlGroupBranch(MCInst &MI, InsnType insn,
    773                                            uint64_t Address,
    774                                            const void *Decoder) {
    775   // If we are called then we can assume that MIPS32r6/MIPS64r6 is enabled
    776   // (otherwise we would have matched the BGTZL instruction from the earlier
    777   // ISA's instead).
    778   //
    779   // We have:
    780   //    0b010111 sssss ttttt iiiiiiiiiiiiiiii
    781   //      Invalid if rs == 0
    782   //      BGTZC   if rs == 0  && rt != 0
    783   //      BLTZC   if rs == rt && rt != 0
    784   //      BLTC    if rs != rt && rs != 0  && rt != 0
    785 
    786   bool HasRs = false;
    787 
    788   InsnType Rs = fieldFromInstruction(insn, 21, 5);
    789   InsnType Rt = fieldFromInstruction(insn, 16, 5);
    790   int64_t Imm = SignExtend64(fieldFromInstruction(insn, 0, 16), 16) * 4 + 4;
    791 
    792   if (Rt == 0)
    793     return MCDisassembler::Fail;
    794   else if (Rs == 0)
    795     MI.setOpcode(Mips::BGTZC);
    796   else if (Rs == Rt)
    797     MI.setOpcode(Mips::BLTZC);
    798   else {
    799     MI.setOpcode(Mips::BLTC);
    800     HasRs = true;
    801   }
    802 
    803   if (HasRs)
    804     MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,
    805                                               Rs)));
    806 
    807   MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,
    808                                      Rt)));
    809 
    810   MI.addOperand(MCOperand::createImm(Imm));
    811 
    812   return MCDisassembler::Success;
    813 }
    814 
    815 template <typename InsnType>
    816 static DecodeStatus DecodeBgtzGroupBranch(MCInst &MI, InsnType insn,
    817                                           uint64_t Address,
    818                                           const void *Decoder) {
    819   // If we are called then we can assume that MIPS32r6/MIPS64r6 is enabled
    820   // (otherwise we would have matched the BGTZ instruction from the earlier
    821   // ISA's instead).
    822   //
    823   // We have:
    824   //    0b000111 sssss ttttt iiiiiiiiiiiiiiii
    825   //      BGTZ    if rt == 0
    826   //      BGTZALC if rs == 0 && rt != 0
    827   //      BLTZALC if rs != 0 && rs == rt
    828   //      BLTUC   if rs != 0 && rs != rt
    829 
    830   InsnType Rs = fieldFromInstruction(insn, 21, 5);
    831   InsnType Rt = fieldFromInstruction(insn, 16, 5);
    832   int64_t Imm = SignExtend64(fieldFromInstruction(insn, 0, 16), 16) * 4 + 4;
    833   bool HasRs = false;
    834   bool HasRt = false;
    835 
    836   if (Rt == 0) {
    837     MI.setOpcode(Mips::BGTZ);
    838     HasRs = true;
    839   } else if (Rs == 0) {
    840     MI.setOpcode(Mips::BGTZALC);
    841     HasRt = true;
    842   } else if (Rs == Rt) {
    843     MI.setOpcode(Mips::BLTZALC);
    844     HasRs = true;
    845   } else {
    846     MI.setOpcode(Mips::BLTUC);
    847     HasRs = true;
    848     HasRt = true;
    849   }
    850 
    851   if (HasRs)
    852     MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,
    853                                        Rs)));
    854 
    855   if (HasRt)
    856     MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,
    857                                        Rt)));
    858 
    859   MI.addOperand(MCOperand::createImm(Imm));
    860 
    861   return MCDisassembler::Success;
    862 }
    863 
    864 template <typename InsnType>
    865 static DecodeStatus DecodeBlezGroupBranch(MCInst &MI, InsnType insn,
    866                                            uint64_t Address,
    867                                            const void *Decoder) {
    868   // If we are called then we can assume that MIPS32r6/MIPS64r6 is enabled
    869   // (otherwise we would have matched the BLEZL instruction from the earlier
    870   // ISA's instead).
    871   //
    872   // We have:
    873   //    0b000110 sssss ttttt iiiiiiiiiiiiiiii
    874   //      Invalid   if rs == 0
    875   //      BLEZALC   if rs == 0  && rt != 0
    876   //      BGEZALC   if rs == rt && rt != 0
    877   //      BGEUC     if rs != rt && rs != 0  && rt != 0
    878 
    879   InsnType Rs = fieldFromInstruction(insn, 21, 5);
    880   InsnType Rt = fieldFromInstruction(insn, 16, 5);
    881   int64_t Imm = SignExtend64(fieldFromInstruction(insn, 0, 16), 16) * 4 + 4;
    882   bool HasRs = false;
    883 
    884   if (Rt == 0)
    885     return MCDisassembler::Fail;
    886   else if (Rs == 0)
    887     MI.setOpcode(Mips::BLEZALC);
    888   else if (Rs == Rt)
    889     MI.setOpcode(Mips::BGEZALC);
    890   else {
    891     HasRs = true;
    892     MI.setOpcode(Mips::BGEUC);
    893   }
    894 
    895   if (HasRs)
    896     MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,
    897                                        Rs)));
    898   MI.addOperand(MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID,
    899                                      Rt)));
    900 
    901   MI.addOperand(MCOperand::createImm(Imm));
    902 
    903   return MCDisassembler::Success;
    904 }
    905 
    906 /// Read two bytes from the ArrayRef and return 16 bit halfword sorted
    907 /// according to the given endianess.
    908 static DecodeStatus readInstruction16(ArrayRef<uint8_t> Bytes, uint64_t Address,
    909                                       uint64_t &Size, uint32_t &Insn,
    910                                       bool IsBigEndian) {
    911   // We want to read exactly 2 Bytes of data.
    912   if (Bytes.size() < 2) {
    913     Size = 0;
    914     return MCDisassembler::Fail;
    915   }
    916 
    917   if (IsBigEndian) {
    918     Insn = (Bytes[0] << 8) | Bytes[1];
    919   } else {
    920     Insn = (Bytes[1] << 8) | Bytes[0];
    921   }
    922 
    923   return MCDisassembler::Success;
    924 }
    925 
    926 /// Read four bytes from the ArrayRef and return 32 bit word sorted
    927 /// according to the given endianess
    928 static DecodeStatus readInstruction32(ArrayRef<uint8_t> Bytes, uint64_t Address,
    929                                       uint64_t &Size, uint32_t &Insn,
    930                                       bool IsBigEndian, bool IsMicroMips) {
    931   // We want to read exactly 4 Bytes of data.
    932   if (Bytes.size() < 4) {
    933     Size = 0;
    934     return MCDisassembler::Fail;
    935   }
    936 
    937   // High 16 bits of a 32-bit microMIPS instruction (where the opcode is)
    938   // always precede the low 16 bits in the instruction stream (that is, they
    939   // are placed at lower addresses in the instruction stream).
    940   //
    941   // microMIPS byte ordering:
    942   //   Big-endian:    0 | 1 | 2 | 3
    943   //   Little-endian: 1 | 0 | 3 | 2
    944 
    945   if (IsBigEndian) {
    946     // Encoded as a big-endian 32-bit word in the stream.
    947     Insn =
    948         (Bytes[3] << 0) | (Bytes[2] << 8) | (Bytes[1] << 16) | (Bytes[0] << 24);
    949   } else {
    950     if (IsMicroMips) {
    951       Insn = (Bytes[2] << 0) | (Bytes[3] << 8) | (Bytes[0] << 16) |
    952              (Bytes[1] << 24);
    953     } else {
    954       Insn = (Bytes[0] << 0) | (Bytes[1] << 8) | (Bytes[2] << 16) |
    955              (Bytes[3] << 24);
    956     }
    957   }
    958 
    959   return MCDisassembler::Success;
    960 }
    961 
    962 DecodeStatus MipsDisassembler::getInstruction(MCInst &Instr, uint64_t &Size,
    963                                               ArrayRef<uint8_t> Bytes,
    964                                               uint64_t Address,
    965                                               raw_ostream &VStream,
    966                                               raw_ostream &CStream) const {
    967   uint32_t Insn;
    968   DecodeStatus Result;
    969 
    970   if (IsMicroMips) {
    971     Result = readInstruction16(Bytes, Address, Size, Insn, IsBigEndian);
    972     if (Result == MCDisassembler::Fail)
    973       return MCDisassembler::Fail;
    974 
    975     if (hasMips32r6()) {
    976       DEBUG(dbgs() << "Trying MicroMipsR616 table (16-bit instructions):\n");
    977       // Calling the auto-generated decoder function for microMIPS32R6
    978       // (and microMIPS64R6) 16-bit instructions.
    979       Result = decodeInstruction(DecoderTableMicroMipsR616, Instr, Insn,
    980                                  Address, this, STI);
    981       if (Result != MCDisassembler::Fail) {
    982         Size = 2;
    983         return Result;
    984       }
    985     }
    986 
    987     DEBUG(dbgs() << "Trying MicroMips16 table (16-bit instructions):\n");
    988     // Calling the auto-generated decoder function for microMIPS 16-bit
    989     // instructions.
    990     Result = decodeInstruction(DecoderTableMicroMips16, Instr, Insn, Address,
    991                                this, STI);
    992     if (Result != MCDisassembler::Fail) {
    993       Size = 2;
    994       return Result;
    995     }
    996 
    997     Result = readInstruction32(Bytes, Address, Size, Insn, IsBigEndian, true);
    998     if (Result == MCDisassembler::Fail)
    999       return MCDisassembler::Fail;
   1000 
   1001     if (hasMips32r6()) {
   1002       DEBUG(dbgs() << "Trying MicroMips32r632 table (32-bit instructions):\n");
   1003       // Calling the auto-generated decoder function.
   1004       Result = decodeInstruction(DecoderTableMicroMipsR632, Instr, Insn, Address,
   1005                                  this, STI);
   1006       if (Result != MCDisassembler::Fail) {
   1007         Size = 4;
   1008         return Result;
   1009       }
   1010     }
   1011 
   1012     DEBUG(dbgs() << "Trying MicroMips32 table (32-bit instructions):\n");
   1013     // Calling the auto-generated decoder function.
   1014     Result = decodeInstruction(DecoderTableMicroMips32, Instr, Insn, Address,
   1015                                this, STI);
   1016     if (Result != MCDisassembler::Fail) {
   1017       Size = 4;
   1018       return Result;
   1019     }
   1020 
   1021     if (hasMips32r6() && isFP64()) {
   1022       DEBUG(dbgs() << "Trying MicroMips32r6FP64 table (32-bit opcodes):\n");
   1023       Result = decodeInstruction(DecoderTableMicroMips32r6FP6432, Instr, Insn,
   1024                                  Address, this, STI);
   1025       if (Result != MCDisassembler::Fail) {
   1026         Size = 4;
   1027         return Result;
   1028       }
   1029     }
   1030 
   1031     // This is an invalid instruction. Let the disassembler move forward by the
   1032     // minimum instruction size.
   1033     Size = 2;
   1034     return MCDisassembler::Fail;
   1035   }
   1036 
   1037   Result = readInstruction32(Bytes, Address, Size, Insn, IsBigEndian, false);
   1038   if (Result == MCDisassembler::Fail) {
   1039     Size = 4;
   1040     return MCDisassembler::Fail;
   1041   }
   1042 
   1043   if (hasCOP3()) {
   1044     DEBUG(dbgs() << "Trying COP3_ table (32-bit opcodes):\n");
   1045     Result =
   1046         decodeInstruction(DecoderTableCOP3_32, Instr, Insn, Address, this, STI);
   1047     if (Result != MCDisassembler::Fail) {
   1048       Size = 4;
   1049       return Result;
   1050     }
   1051   }
   1052 
   1053   if (hasMips32r6() && isGP64()) {
   1054     DEBUG(dbgs() << "Trying Mips32r6_64r6 (GPR64) table (32-bit opcodes):\n");
   1055     Result = decodeInstruction(DecoderTableMips32r6_64r6_GP6432, Instr, Insn,
   1056                                Address, this, STI);
   1057     if (Result != MCDisassembler::Fail) {
   1058       Size = 4;
   1059       return Result;
   1060     }
   1061   }
   1062 
   1063   if (hasMips32r6() && isPTR64()) {
   1064     DEBUG(dbgs() << "Trying Mips32r6_64r6 (PTR64) table (32-bit opcodes):\n");
   1065     Result = decodeInstruction(DecoderTableMips32r6_64r6_PTR6432, Instr, Insn,
   1066                                Address, this, STI);
   1067     if (Result != MCDisassembler::Fail) {
   1068       Size = 4;
   1069       return Result;
   1070     }
   1071   }
   1072 
   1073   if (hasMips32r6()) {
   1074     DEBUG(dbgs() << "Trying Mips32r6_64r6 table (32-bit opcodes):\n");
   1075     Result = decodeInstruction(DecoderTableMips32r6_64r632, Instr, Insn,
   1076                                Address, this, STI);
   1077     if (Result != MCDisassembler::Fail) {
   1078       Size = 4;
   1079       return Result;
   1080     }
   1081   }
   1082 
   1083   if (hasMips2() && isPTR64()) {
   1084     DEBUG(dbgs() << "Trying Mips32r6_64r6 (PTR64) table (32-bit opcodes):\n");
   1085     Result = decodeInstruction(DecoderTableMips32_64_PTR6432, Instr, Insn,
   1086                                Address, this, STI);
   1087     if (Result != MCDisassembler::Fail) {
   1088       Size = 4;
   1089       return Result;
   1090     }
   1091   }
   1092 
   1093   if (hasCnMips()) {
   1094     DEBUG(dbgs() << "Trying CnMips table (32-bit opcodes):\n");
   1095     Result = decodeInstruction(DecoderTableCnMips32, Instr, Insn,
   1096                                Address, this, STI);
   1097     if (Result != MCDisassembler::Fail) {
   1098       Size = 4;
   1099       return Result;
   1100     }
   1101   }
   1102 
   1103   if (isGP64()) {
   1104     DEBUG(dbgs() << "Trying Mips64 (GPR64) table (32-bit opcodes):\n");
   1105     Result = decodeInstruction(DecoderTableMips6432, Instr, Insn,
   1106                                Address, this, STI);
   1107     if (Result != MCDisassembler::Fail) {
   1108       Size = 4;
   1109       return Result;
   1110     }
   1111   }
   1112 
   1113   DEBUG(dbgs() << "Trying Mips table (32-bit opcodes):\n");
   1114   // Calling the auto-generated decoder function.
   1115   Result =
   1116       decodeInstruction(DecoderTableMips32, Instr, Insn, Address, this, STI);
   1117   if (Result != MCDisassembler::Fail) {
   1118     Size = 4;
   1119     return Result;
   1120   }
   1121 
   1122   Size = 4;
   1123   return MCDisassembler::Fail;
   1124 }
   1125 
   1126 static DecodeStatus DecodeCPU16RegsRegisterClass(MCInst &Inst,
   1127                                                  unsigned RegNo,
   1128                                                  uint64_t Address,
   1129                                                  const void *Decoder) {
   1130 
   1131   return MCDisassembler::Fail;
   1132 
   1133 }
   1134 
   1135 static DecodeStatus DecodeGPR64RegisterClass(MCInst &Inst,
   1136                                              unsigned RegNo,
   1137                                              uint64_t Address,
   1138                                              const void *Decoder) {
   1139 
   1140   if (RegNo > 31)
   1141     return MCDisassembler::Fail;
   1142 
   1143   unsigned Reg = getReg(Decoder, Mips::GPR64RegClassID, RegNo);
   1144   Inst.addOperand(MCOperand::createReg(Reg));
   1145   return MCDisassembler::Success;
   1146 }
   1147 
   1148 static DecodeStatus DecodeGPRMM16RegisterClass(MCInst &Inst,
   1149                                                unsigned RegNo,
   1150                                                uint64_t Address,
   1151                                                const void *Decoder) {
   1152   if (RegNo > 7)
   1153     return MCDisassembler::Fail;
   1154   unsigned Reg = getReg(Decoder, Mips::GPRMM16RegClassID, RegNo);
   1155   Inst.addOperand(MCOperand::createReg(Reg));
   1156   return MCDisassembler::Success;
   1157 }
   1158 
   1159 static DecodeStatus DecodeGPRMM16ZeroRegisterClass(MCInst &Inst,
   1160                                                    unsigned RegNo,
   1161                                                    uint64_t Address,
   1162                                                    const void *Decoder) {
   1163   if (RegNo > 7)
   1164     return MCDisassembler::Fail;
   1165   unsigned Reg = getReg(Decoder, Mips::GPRMM16ZeroRegClassID, RegNo);
   1166   Inst.addOperand(MCOperand::createReg(Reg));
   1167   return MCDisassembler::Success;
   1168 }
   1169 
   1170 static DecodeStatus DecodeGPRMM16MovePRegisterClass(MCInst &Inst,
   1171                                                     unsigned RegNo,
   1172                                                     uint64_t Address,
   1173                                                     const void *Decoder) {
   1174   if (RegNo > 7)
   1175     return MCDisassembler::Fail;
   1176   unsigned Reg = getReg(Decoder, Mips::GPRMM16MovePRegClassID, RegNo);
   1177   Inst.addOperand(MCOperand::createReg(Reg));
   1178   return MCDisassembler::Success;
   1179 }
   1180 
   1181 static DecodeStatus DecodeGPR32RegisterClass(MCInst &Inst,
   1182                                              unsigned RegNo,
   1183                                              uint64_t Address,
   1184                                              const void *Decoder) {
   1185   if (RegNo > 31)
   1186     return MCDisassembler::Fail;
   1187   unsigned Reg = getReg(Decoder, Mips::GPR32RegClassID, RegNo);
   1188   Inst.addOperand(MCOperand::createReg(Reg));
   1189   return MCDisassembler::Success;
   1190 }
   1191 
   1192 static DecodeStatus DecodePtrRegisterClass(MCInst &Inst,
   1193                                            unsigned RegNo,
   1194                                            uint64_t Address,
   1195                                            const void *Decoder) {
   1196   if (static_cast<const MipsDisassembler *>(Decoder)->isGP64())
   1197     return DecodeGPR64RegisterClass(Inst, RegNo, Address, Decoder);
   1198 
   1199   return DecodeGPR32RegisterClass(Inst, RegNo, Address, Decoder);
   1200 }
   1201 
   1202 static DecodeStatus DecodeDSPRRegisterClass(MCInst &Inst,
   1203                                             unsigned RegNo,
   1204                                             uint64_t Address,
   1205                                             const void *Decoder) {
   1206   return DecodeGPR32RegisterClass(Inst, RegNo, Address, Decoder);
   1207 }
   1208 
   1209 static DecodeStatus DecodeFGR64RegisterClass(MCInst &Inst,
   1210                                              unsigned RegNo,
   1211                                              uint64_t Address,
   1212                                              const void *Decoder) {
   1213   if (RegNo > 31)
   1214     return MCDisassembler::Fail;
   1215 
   1216   unsigned Reg = getReg(Decoder, Mips::FGR64RegClassID, RegNo);
   1217   Inst.addOperand(MCOperand::createReg(Reg));
   1218   return MCDisassembler::Success;
   1219 }
   1220 
   1221 static DecodeStatus DecodeFGR32RegisterClass(MCInst &Inst,
   1222                                              unsigned RegNo,
   1223                                              uint64_t Address,
   1224                                              const void *Decoder) {
   1225   if (RegNo > 31)
   1226     return MCDisassembler::Fail;
   1227 
   1228   unsigned Reg = getReg(Decoder, Mips::FGR32RegClassID, RegNo);
   1229   Inst.addOperand(MCOperand::createReg(Reg));
   1230   return MCDisassembler::Success;
   1231 }
   1232 
   1233 static DecodeStatus DecodeCCRRegisterClass(MCInst &Inst,
   1234                                            unsigned RegNo,
   1235                                            uint64_t Address,
   1236                                            const void *Decoder) {
   1237   if (RegNo > 31)
   1238     return MCDisassembler::Fail;
   1239   unsigned Reg = getReg(Decoder, Mips::CCRRegClassID, RegNo);
   1240   Inst.addOperand(MCOperand::createReg(Reg));
   1241   return MCDisassembler::Success;
   1242 }
   1243 
   1244 static DecodeStatus DecodeFCCRegisterClass(MCInst &Inst,
   1245                                            unsigned RegNo,
   1246                                            uint64_t Address,
   1247                                            const void *Decoder) {
   1248   if (RegNo > 7)
   1249     return MCDisassembler::Fail;
   1250   unsigned Reg = getReg(Decoder, Mips::FCCRegClassID, RegNo);
   1251   Inst.addOperand(MCOperand::createReg(Reg));
   1252   return MCDisassembler::Success;
   1253 }
   1254 
   1255 static DecodeStatus DecodeFGRCCRegisterClass(MCInst &Inst, unsigned RegNo,
   1256                                              uint64_t Address,
   1257                                              const void *Decoder) {
   1258   if (RegNo > 31)
   1259     return MCDisassembler::Fail;
   1260 
   1261   unsigned Reg = getReg(Decoder, Mips::FGRCCRegClassID, RegNo);
   1262   Inst.addOperand(MCOperand::createReg(Reg));
   1263   return MCDisassembler::Success;
   1264 }
   1265 
   1266 static DecodeStatus DecodeMem(MCInst &Inst,
   1267                               unsigned Insn,
   1268                               uint64_t Address,
   1269                               const void *Decoder) {
   1270   int Offset = SignExtend32<16>(Insn & 0xffff);
   1271   unsigned Reg = fieldFromInstruction(Insn, 16, 5);
   1272   unsigned Base = fieldFromInstruction(Insn, 21, 5);
   1273 
   1274   Reg = getReg(Decoder, Mips::GPR32RegClassID, Reg);
   1275   Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
   1276 
   1277   if (Inst.getOpcode() == Mips::SC ||
   1278       Inst.getOpcode() == Mips::SCD)
   1279     Inst.addOperand(MCOperand::createReg(Reg));
   1280 
   1281   Inst.addOperand(MCOperand::createReg(Reg));
   1282   Inst.addOperand(MCOperand::createReg(Base));
   1283   Inst.addOperand(MCOperand::createImm(Offset));
   1284 
   1285   return MCDisassembler::Success;
   1286 }
   1287 
   1288 static DecodeStatus DecodeMemEVA(MCInst &Inst,
   1289                                  unsigned Insn,
   1290                                  uint64_t Address,
   1291                                  const void *Decoder) {
   1292   int Offset = SignExtend32<9>(Insn >> 7);
   1293   unsigned Reg = fieldFromInstruction(Insn, 16, 5);
   1294   unsigned Base = fieldFromInstruction(Insn, 21, 5);
   1295 
   1296   Reg = getReg(Decoder, Mips::GPR32RegClassID, Reg);
   1297   Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
   1298 
   1299    if (Inst.getOpcode() == Mips::SCE)
   1300      Inst.addOperand(MCOperand::createReg(Reg));
   1301 
   1302   Inst.addOperand(MCOperand::createReg(Reg));
   1303   Inst.addOperand(MCOperand::createReg(Base));
   1304   Inst.addOperand(MCOperand::createImm(Offset));
   1305 
   1306   return MCDisassembler::Success;
   1307 }
   1308 
   1309 static DecodeStatus DecodeLoadByte9(MCInst &Inst,
   1310                                     unsigned Insn,
   1311                                     uint64_t Address,
   1312                                     const void *Decoder) {
   1313   int Offset = SignExtend32<9>(Insn & 0x1ff);
   1314   unsigned Base = fieldFromInstruction(Insn, 16, 5);
   1315   unsigned Reg = fieldFromInstruction(Insn, 21, 5);
   1316 
   1317   Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
   1318   Reg = getReg(Decoder, Mips::GPR32RegClassID, Reg);
   1319 
   1320   Inst.addOperand(MCOperand::createReg(Reg));
   1321   Inst.addOperand(MCOperand::createReg(Base));
   1322   Inst.addOperand(MCOperand::createImm(Offset));
   1323 
   1324   return MCDisassembler::Success;
   1325 }
   1326 
   1327 static DecodeStatus DecodeLoadByte15(MCInst &Inst,
   1328                                      unsigned Insn,
   1329                                      uint64_t Address,
   1330                                      const void *Decoder) {
   1331   int Offset = SignExtend32<16>(Insn & 0xffff);
   1332   unsigned Base = fieldFromInstruction(Insn, 16, 5);
   1333   unsigned Reg = fieldFromInstruction(Insn, 21, 5);
   1334 
   1335   Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
   1336   Reg = getReg(Decoder, Mips::GPR32RegClassID, Reg);
   1337 
   1338   Inst.addOperand(MCOperand::createReg(Reg));
   1339   Inst.addOperand(MCOperand::createReg(Base));
   1340   Inst.addOperand(MCOperand::createImm(Offset));
   1341 
   1342   return MCDisassembler::Success;
   1343 }
   1344 
   1345 static DecodeStatus DecodeCacheOp(MCInst &Inst,
   1346                               unsigned Insn,
   1347                               uint64_t Address,
   1348                               const void *Decoder) {
   1349   int Offset = SignExtend32<16>(Insn & 0xffff);
   1350   unsigned Hint = fieldFromInstruction(Insn, 16, 5);
   1351   unsigned Base = fieldFromInstruction(Insn, 21, 5);
   1352 
   1353   Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
   1354 
   1355   Inst.addOperand(MCOperand::createReg(Base));
   1356   Inst.addOperand(MCOperand::createImm(Offset));
   1357   Inst.addOperand(MCOperand::createImm(Hint));
   1358 
   1359   return MCDisassembler::Success;
   1360 }
   1361 
   1362 static DecodeStatus DecodeCacheOpMM(MCInst &Inst,
   1363                                     unsigned Insn,
   1364                                     uint64_t Address,
   1365                                     const void *Decoder) {
   1366   int Offset = SignExtend32<12>(Insn & 0xfff);
   1367   unsigned Base = fieldFromInstruction(Insn, 16, 5);
   1368   unsigned Hint = fieldFromInstruction(Insn, 21, 5);
   1369 
   1370   Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
   1371 
   1372   Inst.addOperand(MCOperand::createReg(Base));
   1373   Inst.addOperand(MCOperand::createImm(Offset));
   1374   Inst.addOperand(MCOperand::createImm(Hint));
   1375 
   1376   return MCDisassembler::Success;
   1377 }
   1378 
   1379 static DecodeStatus DecodePrefeOpMM(MCInst &Inst,
   1380                                     unsigned Insn,
   1381                                     uint64_t Address,
   1382                                     const void *Decoder) {
   1383   int Offset = SignExtend32<9>(Insn & 0x1ff);
   1384   unsigned Base = fieldFromInstruction(Insn, 16, 5);
   1385   unsigned Hint = fieldFromInstruction(Insn, 21, 5);
   1386 
   1387   Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
   1388 
   1389   Inst.addOperand(MCOperand::createReg(Base));
   1390   Inst.addOperand(MCOperand::createImm(Offset));
   1391   Inst.addOperand(MCOperand::createImm(Hint));
   1392 
   1393   return MCDisassembler::Success;
   1394 }
   1395 
   1396 static DecodeStatus DecodeCacheeOp_CacheOpR6(MCInst &Inst,
   1397                                              unsigned Insn,
   1398                                              uint64_t Address,
   1399                                              const void *Decoder) {
   1400   int Offset = SignExtend32<9>(Insn >> 7);
   1401   unsigned Hint = fieldFromInstruction(Insn, 16, 5);
   1402   unsigned Base = fieldFromInstruction(Insn, 21, 5);
   1403 
   1404   Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
   1405 
   1406   Inst.addOperand(MCOperand::createReg(Base));
   1407   Inst.addOperand(MCOperand::createImm(Offset));
   1408   Inst.addOperand(MCOperand::createImm(Hint));
   1409 
   1410   return MCDisassembler::Success;
   1411 }
   1412 
   1413 static DecodeStatus DecodeStoreEvaOpMM(MCInst &Inst,
   1414                                        unsigned Insn,
   1415                                        uint64_t Address,
   1416                                        const void *Decoder) {
   1417   int Offset = SignExtend32<9>(Insn & 0x1ff);
   1418   unsigned Reg = fieldFromInstruction(Insn, 21, 5);
   1419   unsigned Base = fieldFromInstruction(Insn, 16, 5);
   1420 
   1421   Reg = getReg(Decoder, Mips::GPR32RegClassID, Reg);
   1422   Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
   1423 
   1424   Inst.addOperand(MCOperand::createReg(Reg));
   1425   Inst.addOperand(MCOperand::createReg(Base));
   1426   Inst.addOperand(MCOperand::createImm(Offset));
   1427 
   1428   return MCDisassembler::Success;
   1429 }
   1430 
   1431 static DecodeStatus DecodeSyncI(MCInst &Inst,
   1432                               unsigned Insn,
   1433                               uint64_t Address,
   1434                               const void *Decoder) {
   1435   int Offset = SignExtend32<16>(Insn & 0xffff);
   1436   unsigned Base = fieldFromInstruction(Insn, 21, 5);
   1437 
   1438   Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
   1439 
   1440   Inst.addOperand(MCOperand::createReg(Base));
   1441   Inst.addOperand(MCOperand::createImm(Offset));
   1442 
   1443   return MCDisassembler::Success;
   1444 }
   1445 
   1446 static DecodeStatus DecodeSynciR6(MCInst &Inst,
   1447                                   unsigned Insn,
   1448                                   uint64_t Address,
   1449                                   const void *Decoder) {
   1450   int Immediate = SignExtend32<16>(Insn & 0xffff);
   1451   unsigned Base = fieldFromInstruction(Insn, 16, 5);
   1452 
   1453   Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
   1454 
   1455   Inst.addOperand(MCOperand::createReg(Base));
   1456   Inst.addOperand(MCOperand::createImm(Immediate));
   1457 
   1458   return MCDisassembler::Success;
   1459 }
   1460 
   1461 static DecodeStatus DecodeMSA128Mem(MCInst &Inst, unsigned Insn,
   1462                                     uint64_t Address, const void *Decoder) {
   1463   int Offset = SignExtend32<10>(fieldFromInstruction(Insn, 16, 10));
   1464   unsigned Reg = fieldFromInstruction(Insn, 6, 5);
   1465   unsigned Base = fieldFromInstruction(Insn, 11, 5);
   1466 
   1467   Reg = getReg(Decoder, Mips::MSA128BRegClassID, Reg);
   1468   Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
   1469 
   1470   Inst.addOperand(MCOperand::createReg(Reg));
   1471   Inst.addOperand(MCOperand::createReg(Base));
   1472 
   1473   // The immediate field of an LD/ST instruction is scaled which means it must
   1474   // be multiplied (when decoding) by the size (in bytes) of the instructions'
   1475   // data format.
   1476   // .b - 1 byte
   1477   // .h - 2 bytes
   1478   // .w - 4 bytes
   1479   // .d - 8 bytes
   1480   switch(Inst.getOpcode())
   1481   {
   1482   default:
   1483     assert (0 && "Unexpected instruction");
   1484     return MCDisassembler::Fail;
   1485     break;
   1486   case Mips::LD_B:
   1487   case Mips::ST_B:
   1488     Inst.addOperand(MCOperand::createImm(Offset));
   1489     break;
   1490   case Mips::LD_H:
   1491   case Mips::ST_H:
   1492     Inst.addOperand(MCOperand::createImm(Offset * 2));
   1493     break;
   1494   case Mips::LD_W:
   1495   case Mips::ST_W:
   1496     Inst.addOperand(MCOperand::createImm(Offset * 4));
   1497     break;
   1498   case Mips::LD_D:
   1499   case Mips::ST_D:
   1500     Inst.addOperand(MCOperand::createImm(Offset * 8));
   1501     break;
   1502   }
   1503 
   1504   return MCDisassembler::Success;
   1505 }
   1506 
   1507 static DecodeStatus DecodeMemMMImm4(MCInst &Inst,
   1508                                     unsigned Insn,
   1509                                     uint64_t Address,
   1510                                     const void *Decoder) {
   1511   unsigned Offset = Insn & 0xf;
   1512   unsigned Reg = fieldFromInstruction(Insn, 7, 3);
   1513   unsigned Base = fieldFromInstruction(Insn, 4, 3);
   1514 
   1515   switch (Inst.getOpcode()) {
   1516     case Mips::LBU16_MM:
   1517     case Mips::LHU16_MM:
   1518     case Mips::LW16_MM:
   1519       if (DecodeGPRMM16RegisterClass(Inst, Reg, Address, Decoder)
   1520             == MCDisassembler::Fail)
   1521         return MCDisassembler::Fail;
   1522       break;
   1523     case Mips::SB16_MM:
   1524     case Mips::SB16_MMR6:
   1525     case Mips::SH16_MM:
   1526     case Mips::SH16_MMR6:
   1527     case Mips::SW16_MM:
   1528     case Mips::SW16_MMR6:
   1529       if (DecodeGPRMM16ZeroRegisterClass(Inst, Reg, Address, Decoder)
   1530             == MCDisassembler::Fail)
   1531         return MCDisassembler::Fail;
   1532       break;
   1533   }
   1534 
   1535   if (DecodeGPRMM16RegisterClass(Inst, Base, Address, Decoder)
   1536         == MCDisassembler::Fail)
   1537     return MCDisassembler::Fail;
   1538 
   1539   switch (Inst.getOpcode()) {
   1540     case Mips::LBU16_MM:
   1541       if (Offset == 0xf)
   1542         Inst.addOperand(MCOperand::createImm(-1));
   1543       else
   1544         Inst.addOperand(MCOperand::createImm(Offset));
   1545       break;
   1546     case Mips::SB16_MM:
   1547     case Mips::SB16_MMR6:
   1548       Inst.addOperand(MCOperand::createImm(Offset));
   1549       break;
   1550     case Mips::LHU16_MM:
   1551     case Mips::SH16_MM:
   1552     case Mips::SH16_MMR6:
   1553       Inst.addOperand(MCOperand::createImm(Offset << 1));
   1554       break;
   1555     case Mips::LW16_MM:
   1556     case Mips::SW16_MM:
   1557     case Mips::SW16_MMR6:
   1558       Inst.addOperand(MCOperand::createImm(Offset << 2));
   1559       break;
   1560   }
   1561 
   1562   return MCDisassembler::Success;
   1563 }
   1564 
   1565 static DecodeStatus DecodeMemMMSPImm5Lsl2(MCInst &Inst,
   1566                                           unsigned Insn,
   1567                                           uint64_t Address,
   1568                                           const void *Decoder) {
   1569   unsigned Offset = Insn & 0x1F;
   1570   unsigned Reg = fieldFromInstruction(Insn, 5, 5);
   1571 
   1572   Reg = getReg(Decoder, Mips::GPR32RegClassID, Reg);
   1573 
   1574   Inst.addOperand(MCOperand::createReg(Reg));
   1575   Inst.addOperand(MCOperand::createReg(Mips::SP));
   1576   Inst.addOperand(MCOperand::createImm(Offset << 2));
   1577 
   1578   return MCDisassembler::Success;
   1579 }
   1580 
   1581 static DecodeStatus DecodeMemMMGPImm7Lsl2(MCInst &Inst,
   1582                                           unsigned Insn,
   1583                                           uint64_t Address,
   1584                                           const void *Decoder) {
   1585   unsigned Offset = Insn & 0x7F;
   1586   unsigned Reg = fieldFromInstruction(Insn, 7, 3);
   1587 
   1588   Reg = getReg(Decoder, Mips::GPR32RegClassID, Reg);
   1589 
   1590   Inst.addOperand(MCOperand::createReg(Reg));
   1591   Inst.addOperand(MCOperand::createReg(Mips::GP));
   1592   Inst.addOperand(MCOperand::createImm(Offset << 2));
   1593 
   1594   return MCDisassembler::Success;
   1595 }
   1596 
   1597 static DecodeStatus DecodeMemMMReglistImm4Lsl2(MCInst &Inst,
   1598                                                unsigned Insn,
   1599                                                uint64_t Address,
   1600                                                const void *Decoder) {
   1601   int Offset;
   1602   switch (Inst.getOpcode()) {
   1603   case Mips::LWM16_MMR6:
   1604   case Mips::SWM16_MMR6:
   1605     Offset = fieldFromInstruction(Insn, 4, 4);
   1606     break;
   1607   default:
   1608     Offset = SignExtend32<4>(Insn & 0xf);
   1609     break;
   1610   }
   1611 
   1612   if (DecodeRegListOperand16(Inst, Insn, Address, Decoder)
   1613       == MCDisassembler::Fail)
   1614     return MCDisassembler::Fail;
   1615 
   1616   Inst.addOperand(MCOperand::createReg(Mips::SP));
   1617   Inst.addOperand(MCOperand::createImm(Offset << 2));
   1618 
   1619   return MCDisassembler::Success;
   1620 }
   1621 
   1622 static DecodeStatus DecodeMemMMImm9(MCInst &Inst,
   1623                                     unsigned Insn,
   1624                                     uint64_t Address,
   1625                                     const void *Decoder) {
   1626   int Offset = SignExtend32<9>(Insn & 0x1ff);
   1627   unsigned Reg = fieldFromInstruction(Insn, 21, 5);
   1628   unsigned Base = fieldFromInstruction(Insn, 16, 5);
   1629 
   1630   Reg = getReg(Decoder, Mips::GPR32RegClassID, Reg);
   1631   Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
   1632 
   1633   if (Inst.getOpcode() == Mips::SCE_MM)
   1634     Inst.addOperand(MCOperand::createReg(Reg));
   1635 
   1636   Inst.addOperand(MCOperand::createReg(Reg));
   1637   Inst.addOperand(MCOperand::createReg(Base));
   1638   Inst.addOperand(MCOperand::createImm(Offset));
   1639 
   1640   return MCDisassembler::Success;
   1641 }
   1642 
   1643 static DecodeStatus DecodeMemMMImm12(MCInst &Inst,
   1644                                      unsigned Insn,
   1645                                      uint64_t Address,
   1646                                      const void *Decoder) {
   1647   int Offset = SignExtend32<12>(Insn & 0x0fff);
   1648   unsigned Reg = fieldFromInstruction(Insn, 21, 5);
   1649   unsigned Base = fieldFromInstruction(Insn, 16, 5);
   1650 
   1651   Reg = getReg(Decoder, Mips::GPR32RegClassID, Reg);
   1652   Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
   1653 
   1654   switch (Inst.getOpcode()) {
   1655   case Mips::SWM32_MM:
   1656   case Mips::LWM32_MM:
   1657     if (DecodeRegListOperand(Inst, Insn, Address, Decoder)
   1658         == MCDisassembler::Fail)
   1659       return MCDisassembler::Fail;
   1660     Inst.addOperand(MCOperand::createReg(Base));
   1661     Inst.addOperand(MCOperand::createImm(Offset));
   1662     break;
   1663   case Mips::SC_MM:
   1664     Inst.addOperand(MCOperand::createReg(Reg));
   1665     // fallthrough
   1666   default:
   1667     Inst.addOperand(MCOperand::createReg(Reg));
   1668     if (Inst.getOpcode() == Mips::LWP_MM || Inst.getOpcode() == Mips::SWP_MM ||
   1669         Inst.getOpcode() == Mips::LWP_MMR6 || Inst.getOpcode() == Mips::SWP_MMR6)
   1670       Inst.addOperand(MCOperand::createReg(Reg+1));
   1671 
   1672     Inst.addOperand(MCOperand::createReg(Base));
   1673     Inst.addOperand(MCOperand::createImm(Offset));
   1674   }
   1675 
   1676   return MCDisassembler::Success;
   1677 }
   1678 
   1679 static DecodeStatus DecodeMemMMImm16(MCInst &Inst,
   1680                                      unsigned Insn,
   1681                                      uint64_t Address,
   1682                                      const void *Decoder) {
   1683   int Offset = SignExtend32<16>(Insn & 0xffff);
   1684   unsigned Reg = fieldFromInstruction(Insn, 21, 5);
   1685   unsigned Base = fieldFromInstruction(Insn, 16, 5);
   1686 
   1687   Reg = getReg(Decoder, Mips::GPR32RegClassID, Reg);
   1688   Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
   1689 
   1690   Inst.addOperand(MCOperand::createReg(Reg));
   1691   Inst.addOperand(MCOperand::createReg(Base));
   1692   Inst.addOperand(MCOperand::createImm(Offset));
   1693 
   1694   return MCDisassembler::Success;
   1695 }
   1696 
   1697 static DecodeStatus DecodeFMem(MCInst &Inst,
   1698                                unsigned Insn,
   1699                                uint64_t Address,
   1700                                const void *Decoder) {
   1701   int Offset = SignExtend32<16>(Insn & 0xffff);
   1702   unsigned Reg = fieldFromInstruction(Insn, 16, 5);
   1703   unsigned Base = fieldFromInstruction(Insn, 21, 5);
   1704 
   1705   Reg = getReg(Decoder, Mips::FGR64RegClassID, Reg);
   1706   Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
   1707 
   1708   Inst.addOperand(MCOperand::createReg(Reg));
   1709   Inst.addOperand(MCOperand::createReg(Base));
   1710   Inst.addOperand(MCOperand::createImm(Offset));
   1711 
   1712   return MCDisassembler::Success;
   1713 }
   1714 
   1715 static DecodeStatus DecodeFMemMMR2(MCInst &Inst, unsigned Insn,
   1716                                    uint64_t Address, const void *Decoder) {
   1717   // This function is the same as DecodeFMem but with the Reg and Base fields
   1718   // swapped according to microMIPS spec.
   1719   int Offset = SignExtend32<16>(Insn & 0xffff);
   1720   unsigned Base = fieldFromInstruction(Insn, 16, 5);
   1721   unsigned Reg = fieldFromInstruction(Insn, 21, 5);
   1722 
   1723   Reg = getReg(Decoder, Mips::FGR64RegClassID, Reg);
   1724   Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
   1725 
   1726   Inst.addOperand(MCOperand::createReg(Reg));
   1727   Inst.addOperand(MCOperand::createReg(Base));
   1728   Inst.addOperand(MCOperand::createImm(Offset));
   1729 
   1730   return MCDisassembler::Success;
   1731 }
   1732 
   1733 static DecodeStatus DecodeFMem2(MCInst &Inst,
   1734                                unsigned Insn,
   1735                                uint64_t Address,
   1736                                const void *Decoder) {
   1737   int Offset = SignExtend32<16>(Insn & 0xffff);
   1738   unsigned Reg = fieldFromInstruction(Insn, 16, 5);
   1739   unsigned Base = fieldFromInstruction(Insn, 21, 5);
   1740 
   1741   Reg = getReg(Decoder, Mips::COP2RegClassID, Reg);
   1742   Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
   1743 
   1744   Inst.addOperand(MCOperand::createReg(Reg));
   1745   Inst.addOperand(MCOperand::createReg(Base));
   1746   Inst.addOperand(MCOperand::createImm(Offset));
   1747 
   1748   return MCDisassembler::Success;
   1749 }
   1750 
   1751 static DecodeStatus DecodeFMem3(MCInst &Inst,
   1752                                unsigned Insn,
   1753                                uint64_t Address,
   1754                                const void *Decoder) {
   1755   int Offset = SignExtend32<16>(Insn & 0xffff);
   1756   unsigned Reg = fieldFromInstruction(Insn, 16, 5);
   1757   unsigned Base = fieldFromInstruction(Insn, 21, 5);
   1758 
   1759   Reg = getReg(Decoder, Mips::COP3RegClassID, Reg);
   1760   Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
   1761 
   1762   Inst.addOperand(MCOperand::createReg(Reg));
   1763   Inst.addOperand(MCOperand::createReg(Base));
   1764   Inst.addOperand(MCOperand::createImm(Offset));
   1765 
   1766   return MCDisassembler::Success;
   1767 }
   1768 
   1769 static DecodeStatus DecodeFMemCop2R6(MCInst &Inst,
   1770                                     unsigned Insn,
   1771                                     uint64_t Address,
   1772                                     const void *Decoder) {
   1773   int Offset = SignExtend32<11>(Insn & 0x07ff);
   1774   unsigned Reg = fieldFromInstruction(Insn, 16, 5);
   1775   unsigned Base = fieldFromInstruction(Insn, 11, 5);
   1776 
   1777   Reg = getReg(Decoder, Mips::COP2RegClassID, Reg);
   1778   Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
   1779 
   1780   Inst.addOperand(MCOperand::createReg(Reg));
   1781   Inst.addOperand(MCOperand::createReg(Base));
   1782   Inst.addOperand(MCOperand::createImm(Offset));
   1783 
   1784   return MCDisassembler::Success;
   1785 }
   1786 
   1787 static DecodeStatus DecodeFMemCop2MMR6(MCInst &Inst, unsigned Insn,
   1788                                        uint64_t Address, const void *Decoder) {
   1789   int Offset = SignExtend32<11>(Insn & 0x07ff);
   1790   unsigned Reg = fieldFromInstruction(Insn, 21, 5);
   1791   unsigned Base = fieldFromInstruction(Insn, 16, 5);
   1792 
   1793   Reg = getReg(Decoder, Mips::COP2RegClassID, Reg);
   1794   Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
   1795 
   1796   Inst.addOperand(MCOperand::createReg(Reg));
   1797   Inst.addOperand(MCOperand::createReg(Base));
   1798   Inst.addOperand(MCOperand::createImm(Offset));
   1799 
   1800   return MCDisassembler::Success;
   1801 }
   1802 
   1803 static DecodeStatus DecodeSpecial3LlSc(MCInst &Inst,
   1804                                        unsigned Insn,
   1805                                        uint64_t Address,
   1806                                        const void *Decoder) {
   1807   int64_t Offset = SignExtend64<9>((Insn >> 7) & 0x1ff);
   1808   unsigned Rt = fieldFromInstruction(Insn, 16, 5);
   1809   unsigned Base = fieldFromInstruction(Insn, 21, 5);
   1810 
   1811   Rt = getReg(Decoder, Mips::GPR32RegClassID, Rt);
   1812   Base = getReg(Decoder, Mips::GPR32RegClassID, Base);
   1813 
   1814   if(Inst.getOpcode() == Mips::SC_R6 || Inst.getOpcode() == Mips::SCD_R6){
   1815     Inst.addOperand(MCOperand::createReg(Rt));
   1816   }
   1817 
   1818   Inst.addOperand(MCOperand::createReg(Rt));
   1819   Inst.addOperand(MCOperand::createReg(Base));
   1820   Inst.addOperand(MCOperand::createImm(Offset));
   1821 
   1822   return MCDisassembler::Success;
   1823 }
   1824 
   1825 static DecodeStatus DecodeHWRegsRegisterClass(MCInst &Inst,
   1826                                               unsigned RegNo,
   1827                                               uint64_t Address,
   1828                                               const void *Decoder) {
   1829   // Currently only hardware register 29 is supported.
   1830   if (RegNo != 29)
   1831     return  MCDisassembler::Fail;
   1832   Inst.addOperand(MCOperand::createReg(Mips::HWR29));
   1833   return MCDisassembler::Success;
   1834 }
   1835 
   1836 static DecodeStatus DecodeAFGR64RegisterClass(MCInst &Inst,
   1837                                               unsigned RegNo,
   1838                                               uint64_t Address,
   1839                                               const void *Decoder) {
   1840   if (RegNo > 30 || RegNo %2)
   1841     return MCDisassembler::Fail;
   1842 
   1843   ;
   1844   unsigned Reg = getReg(Decoder, Mips::AFGR64RegClassID, RegNo /2);
   1845   Inst.addOperand(MCOperand::createReg(Reg));
   1846   return MCDisassembler::Success;
   1847 }
   1848 
   1849 static DecodeStatus DecodeACC64DSPRegisterClass(MCInst &Inst,
   1850                                                 unsigned RegNo,
   1851                                                 uint64_t Address,
   1852                                                 const void *Decoder) {
   1853   if (RegNo >= 4)
   1854     return MCDisassembler::Fail;
   1855 
   1856   unsigned Reg = getReg(Decoder, Mips::ACC64DSPRegClassID, RegNo);
   1857   Inst.addOperand(MCOperand::createReg(Reg));
   1858   return MCDisassembler::Success;
   1859 }
   1860 
   1861 static DecodeStatus DecodeHI32DSPRegisterClass(MCInst &Inst,
   1862                                                unsigned RegNo,
   1863                                                uint64_t Address,
   1864                                                const void *Decoder) {
   1865   if (RegNo >= 4)
   1866     return MCDisassembler::Fail;
   1867 
   1868   unsigned Reg = getReg(Decoder, Mips::HI32DSPRegClassID, RegNo);
   1869   Inst.addOperand(MCOperand::createReg(Reg));
   1870   return MCDisassembler::Success;
   1871 }
   1872 
   1873 static DecodeStatus DecodeLO32DSPRegisterClass(MCInst &Inst,
   1874                                                unsigned RegNo,
   1875                                                uint64_t Address,
   1876                                                const void *Decoder) {
   1877   if (RegNo >= 4)
   1878     return MCDisassembler::Fail;
   1879 
   1880   unsigned Reg = getReg(Decoder, Mips::LO32DSPRegClassID, RegNo);
   1881   Inst.addOperand(MCOperand::createReg(Reg));
   1882   return MCDisassembler::Success;
   1883 }
   1884 
   1885 static DecodeStatus DecodeMSA128BRegisterClass(MCInst &Inst,
   1886                                                unsigned RegNo,
   1887                                                uint64_t Address,
   1888                                                const void *Decoder) {
   1889   if (RegNo > 31)
   1890     return MCDisassembler::Fail;
   1891 
   1892   unsigned Reg = getReg(Decoder, Mips::MSA128BRegClassID, RegNo);
   1893   Inst.addOperand(MCOperand::createReg(Reg));
   1894   return MCDisassembler::Success;
   1895 }
   1896 
   1897 static DecodeStatus DecodeMSA128HRegisterClass(MCInst &Inst,
   1898                                                unsigned RegNo,
   1899                                                uint64_t Address,
   1900                                                const void *Decoder) {
   1901   if (RegNo > 31)
   1902     return MCDisassembler::Fail;
   1903 
   1904   unsigned Reg = getReg(Decoder, Mips::MSA128HRegClassID, RegNo);
   1905   Inst.addOperand(MCOperand::createReg(Reg));
   1906   return MCDisassembler::Success;
   1907 }
   1908 
   1909 static DecodeStatus DecodeMSA128WRegisterClass(MCInst &Inst,
   1910                                                unsigned RegNo,
   1911                                                uint64_t Address,
   1912                                                const void *Decoder) {
   1913   if (RegNo > 31)
   1914     return MCDisassembler::Fail;
   1915 
   1916   unsigned Reg = getReg(Decoder, Mips::MSA128WRegClassID, RegNo);
   1917   Inst.addOperand(MCOperand::createReg(Reg));
   1918   return MCDisassembler::Success;
   1919 }
   1920 
   1921 static DecodeStatus DecodeMSA128DRegisterClass(MCInst &Inst,
   1922                                                unsigned RegNo,
   1923                                                uint64_t Address,
   1924                                                const void *Decoder) {
   1925   if (RegNo > 31)
   1926     return MCDisassembler::Fail;
   1927 
   1928   unsigned Reg = getReg(Decoder, Mips::MSA128DRegClassID, RegNo);
   1929   Inst.addOperand(MCOperand::createReg(Reg));
   1930   return MCDisassembler::Success;
   1931 }
   1932 
   1933 static DecodeStatus DecodeMSACtrlRegisterClass(MCInst &Inst,
   1934                                                unsigned RegNo,
   1935                                                uint64_t Address,
   1936                                                const void *Decoder) {
   1937   if (RegNo > 7)
   1938     return MCDisassembler::Fail;
   1939 
   1940   unsigned Reg = getReg(Decoder, Mips::MSACtrlRegClassID, RegNo);
   1941   Inst.addOperand(MCOperand::createReg(Reg));
   1942   return MCDisassembler::Success;
   1943 }
   1944 
   1945 static DecodeStatus DecodeCOP0RegisterClass(MCInst &Inst,
   1946                                             unsigned RegNo,
   1947                                             uint64_t Address,
   1948                                             const void *Decoder) {
   1949   if (RegNo > 31)
   1950     return MCDisassembler::Fail;
   1951 
   1952   unsigned Reg = getReg(Decoder, Mips::COP0RegClassID, RegNo);
   1953   Inst.addOperand(MCOperand::createReg(Reg));
   1954   return MCDisassembler::Success;
   1955 }
   1956 
   1957 static DecodeStatus DecodeCOP2RegisterClass(MCInst &Inst,
   1958                                             unsigned RegNo,
   1959                                             uint64_t Address,
   1960                                             const void *Decoder) {
   1961   if (RegNo > 31)
   1962     return MCDisassembler::Fail;
   1963 
   1964   unsigned Reg = getReg(Decoder, Mips::COP2RegClassID, RegNo);
   1965   Inst.addOperand(MCOperand::createReg(Reg));
   1966   return MCDisassembler::Success;
   1967 }
   1968 
   1969 static DecodeStatus DecodeBranchTarget(MCInst &Inst,
   1970                                        unsigned Offset,
   1971                                        uint64_t Address,
   1972                                        const void *Decoder) {
   1973   int32_t BranchOffset = (SignExtend32<16>(Offset) * 4) + 4;
   1974   Inst.addOperand(MCOperand::createImm(BranchOffset));
   1975   return MCDisassembler::Success;
   1976 }
   1977 
   1978 static DecodeStatus DecodeBranchTarget1SImm16(MCInst &Inst,
   1979                                               unsigned Offset,
   1980                                               uint64_t Address,
   1981                                               const void *Decoder) {
   1982   int32_t BranchOffset = (SignExtend32<16>(Offset) * 2);
   1983   Inst.addOperand(MCOperand::createImm(BranchOffset));
   1984   return MCDisassembler::Success;
   1985 }
   1986 
   1987 static DecodeStatus DecodeJumpTarget(MCInst &Inst,
   1988                                      unsigned Insn,
   1989                                      uint64_t Address,
   1990                                      const void *Decoder) {
   1991 
   1992   unsigned JumpOffset = fieldFromInstruction(Insn, 0, 26) << 2;
   1993   Inst.addOperand(MCOperand::createImm(JumpOffset));
   1994   return MCDisassembler::Success;
   1995 }
   1996 
   1997 static DecodeStatus DecodeBranchTarget21(MCInst &Inst,
   1998                                          unsigned Offset,
   1999                                          uint64_t Address,
   2000                                          const void *Decoder) {
   2001   int32_t BranchOffset = SignExtend32<21>(Offset) * 4 + 4;
   2002 
   2003   Inst.addOperand(MCOperand::createImm(BranchOffset));
   2004   return MCDisassembler::Success;
   2005 }
   2006 
   2007 static DecodeStatus DecodeBranchTarget21MM(MCInst &Inst,
   2008                                            unsigned Offset,
   2009                                            uint64_t Address,
   2010                                            const void *Decoder) {
   2011   int32_t BranchOffset = SignExtend32<21>(Offset) << 1;
   2012 
   2013   Inst.addOperand(MCOperand::createImm(BranchOffset));
   2014   return MCDisassembler::Success;
   2015 }
   2016 
   2017 static DecodeStatus DecodeBranchTarget26(MCInst &Inst,
   2018                                          unsigned Offset,
   2019                                          uint64_t Address,
   2020                                          const void *Decoder) {
   2021   int32_t BranchOffset = SignExtend32<26>(Offset) * 4 + 4;
   2022 
   2023   Inst.addOperand(MCOperand::createImm(BranchOffset));
   2024   return MCDisassembler::Success;
   2025 }
   2026 
   2027 static DecodeStatus DecodeBranchTarget7MM(MCInst &Inst,
   2028                                           unsigned Offset,
   2029                                           uint64_t Address,
   2030                                           const void *Decoder) {
   2031   int32_t BranchOffset = SignExtend32<7>(Offset) << 1;
   2032   Inst.addOperand(MCOperand::createImm(BranchOffset));
   2033   return MCDisassembler::Success;
   2034 }
   2035 
   2036 static DecodeStatus DecodeBranchTarget10MM(MCInst &Inst,
   2037                                            unsigned Offset,
   2038                                            uint64_t Address,
   2039                                            const void *Decoder) {
   2040   int32_t BranchOffset = SignExtend32<10>(Offset) << 1;
   2041   Inst.addOperand(MCOperand::createImm(BranchOffset));
   2042   return MCDisassembler::Success;
   2043 }
   2044 
   2045 static DecodeStatus DecodeBranchTargetMM(MCInst &Inst,
   2046                                          unsigned Offset,
   2047                                          uint64_t Address,
   2048                                          const void *Decoder) {
   2049   int32_t BranchOffset = SignExtend32<16>(Offset) * 2;
   2050   Inst.addOperand(MCOperand::createImm(BranchOffset));
   2051   return MCDisassembler::Success;
   2052 }
   2053 
   2054 static DecodeStatus DecodeBranchTarget26MM(MCInst &Inst,
   2055   unsigned Offset,
   2056   uint64_t Address,
   2057   const void *Decoder) {
   2058   int32_t BranchOffset = SignExtend32<26>(Offset) << 1;
   2059 
   2060   Inst.addOperand(MCOperand::createImm(BranchOffset));
   2061   return MCDisassembler::Success;
   2062 }
   2063 
   2064 static DecodeStatus DecodeJumpTargetMM(MCInst &Inst,
   2065                                        unsigned Insn,
   2066                                        uint64_t Address,
   2067                                        const void *Decoder) {
   2068   unsigned JumpOffset = fieldFromInstruction(Insn, 0, 26) << 1;
   2069   Inst.addOperand(MCOperand::createImm(JumpOffset));
   2070   return MCDisassembler::Success;
   2071 }
   2072 
   2073 static DecodeStatus DecodeAddiur2Simm7(MCInst &Inst,
   2074                                        unsigned Value,
   2075                                        uint64_t Address,
   2076                                        const void *Decoder) {
   2077   if (Value == 0)
   2078     Inst.addOperand(MCOperand::createImm(1));
   2079   else if (Value == 0x7)
   2080     Inst.addOperand(MCOperand::createImm(-1));
   2081   else
   2082     Inst.addOperand(MCOperand::createImm(Value << 2));
   2083   return MCDisassembler::Success;
   2084 }
   2085 
   2086 static DecodeStatus DecodeLi16Imm(MCInst &Inst,
   2087                                   unsigned Value,
   2088                                   uint64_t Address,
   2089                                   const void *Decoder) {
   2090   if (Value == 0x7F)
   2091     Inst.addOperand(MCOperand::createImm(-1));
   2092   else
   2093     Inst.addOperand(MCOperand::createImm(Value));
   2094   return MCDisassembler::Success;
   2095 }
   2096 
   2097 static DecodeStatus DecodePOOL16BEncodedField(MCInst &Inst,
   2098                                               unsigned Value,
   2099                                               uint64_t Address,
   2100                                               const void *Decoder) {
   2101   Inst.addOperand(MCOperand::createImm(Value == 0x0 ? 8 : Value));
   2102   return MCDisassembler::Success;
   2103 }
   2104 
   2105 template <unsigned Bits, int Offset, int Scale>
   2106 static DecodeStatus DecodeUImmWithOffsetAndScale(MCInst &Inst, unsigned Value,
   2107                                                  uint64_t Address,
   2108                                                  const void *Decoder) {
   2109   Value &= ((1 << Bits) - 1);
   2110   Value *= Scale;
   2111   Inst.addOperand(MCOperand::createImm(Value + Offset));
   2112   return MCDisassembler::Success;
   2113 }
   2114 
   2115 template <unsigned Bits, int Offset, int ScaleBy>
   2116 static DecodeStatus DecodeSImmWithOffsetAndScale(MCInst &Inst, unsigned Value,
   2117                                                  uint64_t Address,
   2118                                                  const void *Decoder) {
   2119   int32_t Imm = SignExtend32<Bits>(Value) * ScaleBy;
   2120   Inst.addOperand(MCOperand::createImm(Imm + Offset));
   2121   return MCDisassembler::Success;
   2122 }
   2123 
   2124 static DecodeStatus DecodeInsSize(MCInst &Inst,
   2125                                   unsigned Insn,
   2126                                   uint64_t Address,
   2127                                   const void *Decoder) {
   2128   // First we need to grab the pos(lsb) from MCInst.
   2129   int Pos = Inst.getOperand(2).getImm();
   2130   int Size = (int) Insn - Pos + 1;
   2131   Inst.addOperand(MCOperand::createImm(SignExtend32<16>(Size)));
   2132   return MCDisassembler::Success;
   2133 }
   2134 
   2135 static DecodeStatus DecodeSimm19Lsl2(MCInst &Inst, unsigned Insn,
   2136                                      uint64_t Address, const void *Decoder) {
   2137   Inst.addOperand(MCOperand::createImm(SignExtend32<19>(Insn) * 4));
   2138   return MCDisassembler::Success;
   2139 }
   2140 
   2141 static DecodeStatus DecodeSimm18Lsl3(MCInst &Inst, unsigned Insn,
   2142                                      uint64_t Address, const void *Decoder) {
   2143   Inst.addOperand(MCOperand::createImm(SignExtend32<18>(Insn) * 8));
   2144   return MCDisassembler::Success;
   2145 }
   2146 
   2147 static DecodeStatus DecodeSimm9SP(MCInst &Inst, unsigned Insn,
   2148                                   uint64_t Address, const void *Decoder) {
   2149   int32_t DecodedValue;
   2150   switch (Insn) {
   2151   case 0: DecodedValue = 256; break;
   2152   case 1: DecodedValue = 257; break;
   2153   case 510: DecodedValue = -258; break;
   2154   case 511: DecodedValue = -257; break;
   2155   default: DecodedValue = SignExtend32<9>(Insn); break;
   2156   }
   2157   Inst.addOperand(MCOperand::createImm(DecodedValue * 4));
   2158   return MCDisassembler::Success;
   2159 }
   2160 
   2161 static DecodeStatus DecodeANDI16Imm(MCInst &Inst, unsigned Insn,
   2162                                     uint64_t Address, const void *Decoder) {
   2163   // Insn must be >= 0, since it is unsigned that condition is always true.
   2164   assert(Insn < 16);
   2165   int32_t DecodedValues[] = {128, 1, 2, 3, 4, 7, 8, 15, 16, 31, 32, 63, 64,
   2166                              255, 32768, 65535};
   2167   Inst.addOperand(MCOperand::createImm(DecodedValues[Insn]));
   2168   return MCDisassembler::Success;
   2169 }
   2170 
   2171 static DecodeStatus DecodeRegListOperand(MCInst &Inst,
   2172                                          unsigned Insn,
   2173                                          uint64_t Address,
   2174                                          const void *Decoder) {
   2175   unsigned Regs[] = {Mips::S0, Mips::S1, Mips::S2, Mips::S3, Mips::S4, Mips::S5,
   2176                      Mips::S6, Mips::S7, Mips::FP};
   2177   unsigned RegNum;
   2178 
   2179   unsigned RegLst = fieldFromInstruction(Insn, 21, 5);
   2180 
   2181   // Empty register lists are not allowed.
   2182   if (RegLst == 0)
   2183     return MCDisassembler::Fail;
   2184 
   2185   RegNum = RegLst & 0xf;
   2186 
   2187   // RegLst values 10-15, and 26-31 are reserved.
   2188   if (RegNum > 9)
   2189     return MCDisassembler::Fail;
   2190 
   2191   for (unsigned i = 0; i < RegNum; i++)
   2192     Inst.addOperand(MCOperand::createReg(Regs[i]));
   2193 
   2194   if (RegLst & 0x10)
   2195     Inst.addOperand(MCOperand::createReg(Mips::RA));
   2196 
   2197   return MCDisassembler::Success;
   2198 }
   2199 
   2200 static DecodeStatus DecodeRegListOperand16(MCInst &Inst, unsigned Insn,
   2201                                            uint64_t Address,
   2202                                            const void *Decoder) {
   2203   unsigned Regs[] = {Mips::S0, Mips::S1, Mips::S2, Mips::S3};
   2204   unsigned RegLst;
   2205   switch(Inst.getOpcode()) {
   2206   default:
   2207     RegLst = fieldFromInstruction(Insn, 4, 2);
   2208     break;
   2209   case Mips::LWM16_MMR6:
   2210   case Mips::SWM16_MMR6:
   2211     RegLst = fieldFromInstruction(Insn, 8, 2);
   2212     break;
   2213   }
   2214   unsigned RegNum = RegLst & 0x3;
   2215 
   2216   for (unsigned i = 0; i <= RegNum; i++)
   2217     Inst.addOperand(MCOperand::createReg(Regs[i]));
   2218 
   2219   Inst.addOperand(MCOperand::createReg(Mips::RA));
   2220 
   2221   return MCDisassembler::Success;
   2222 }
   2223 
   2224 static DecodeStatus DecodeMovePRegPair(MCInst &Inst, unsigned Insn,
   2225                                        uint64_t Address, const void *Decoder) {
   2226 
   2227   unsigned RegPair = fieldFromInstruction(Insn, 7, 3);
   2228 
   2229   switch (RegPair) {
   2230   default:
   2231     return MCDisassembler::Fail;
   2232   case 0:
   2233     Inst.addOperand(MCOperand::createReg(Mips::A1));
   2234     Inst.addOperand(MCOperand::createReg(Mips::A2));
   2235     break;
   2236   case 1:
   2237     Inst.addOperand(MCOperand::createReg(Mips::A1));
   2238     Inst.addOperand(MCOperand::createReg(Mips::A3));
   2239     break;
   2240   case 2:
   2241     Inst.addOperand(MCOperand::createReg(Mips::A2));
   2242     Inst.addOperand(MCOperand::createReg(Mips::A3));
   2243     break;
   2244   case 3:
   2245     Inst.addOperand(MCOperand::createReg(Mips::A0));
   2246     Inst.addOperand(MCOperand::createReg(Mips::S5));
   2247     break;
   2248   case 4:
   2249     Inst.addOperand(MCOperand::createReg(Mips::A0));
   2250     Inst.addOperand(MCOperand::createReg(Mips::S6));
   2251     break;
   2252   case 5:
   2253     Inst.addOperand(MCOperand::createReg(Mips::A0));
   2254     Inst.addOperand(MCOperand::createReg(Mips::A1));
   2255     break;
   2256   case 6:
   2257     Inst.addOperand(MCOperand::createReg(Mips::A0));
   2258     Inst.addOperand(MCOperand::createReg(Mips::A2));
   2259     break;
   2260   case 7:
   2261     Inst.addOperand(MCOperand::createReg(Mips::A0));
   2262     Inst.addOperand(MCOperand::createReg(Mips::A3));
   2263     break;
   2264   }
   2265 
   2266   return MCDisassembler::Success;
   2267 }
   2268 
   2269 static DecodeStatus DecodeSimm23Lsl2(MCInst &Inst, unsigned Insn,
   2270                                      uint64_t Address, const void *Decoder) {
   2271   Inst.addOperand(MCOperand::createImm(SignExtend32<25>(Insn << 2)));
   2272   return MCDisassembler::Success;
   2273 }
   2274 
   2275 template <typename InsnType>
   2276 static DecodeStatus DecodeBgtzGroupBranchMMR6(MCInst &MI, InsnType insn,
   2277   uint64_t Address,
   2278   const void *Decoder) {
   2279   // We have:
   2280   //    0b000111 ttttt sssss iiiiiiiiiiiiiiii
   2281   //      Invalid      if rt == 0
   2282   //      BGTZALC_MMR6 if rs == 0 && rt != 0
   2283   //      BLTZALC_MMR6 if rs != 0 && rs == rt
   2284   //      BLTUC_MMR6   if rs != 0 && rs != rt
   2285 
   2286   InsnType Rt = fieldFromInstruction(insn, 21, 5);
   2287   InsnType Rs = fieldFromInstruction(insn, 16, 5);
   2288   InsnType Imm = SignExtend64(fieldFromInstruction(insn, 0, 16), 16) * 2;
   2289   bool HasRs = false;
   2290   bool HasRt = false;
   2291 
   2292   if (Rt == 0)
   2293     return MCDisassembler::Fail;
   2294   else if (Rs == 0) {
   2295     MI.setOpcode(Mips::BGTZALC_MMR6);
   2296     HasRt = true;
   2297   }
   2298   else if (Rs == Rt) {
   2299     MI.setOpcode(Mips::BLTZALC_MMR6);
   2300     HasRs = true;
   2301   }
   2302   else {
   2303     MI.setOpcode(Mips::BLTUC_MMR6);
   2304     HasRs = true;
   2305     HasRt = true;
   2306   }
   2307 
   2308   if (HasRs)
   2309     MI.addOperand(
   2310     MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID, Rs)));
   2311 
   2312   if (HasRt)
   2313     MI.addOperand(
   2314     MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID, Rt)));
   2315 
   2316   MI.addOperand(MCOperand::createImm(Imm));
   2317 
   2318   return MCDisassembler::Success;
   2319 }
   2320 
   2321 template <typename InsnType>
   2322 static DecodeStatus DecodeBlezGroupBranchMMR6(MCInst &MI, InsnType insn,
   2323   uint64_t Address,
   2324   const void *Decoder) {
   2325   // We have:
   2326   //    0b000110 ttttt sssss iiiiiiiiiiiiiiii
   2327   //      Invalid        if rs == 0
   2328   //      BLEZALC_MMR6   if rs == 0  && rt != 0
   2329   //      BGEZALC_MMR6   if rs == rt && rt != 0
   2330   //      BGEUC_MMR6     if rs != rt && rs != 0  && rt != 0
   2331 
   2332   InsnType Rt = fieldFromInstruction(insn, 21, 5);
   2333   InsnType Rs = fieldFromInstruction(insn, 16, 5);
   2334   InsnType Imm = SignExtend64(fieldFromInstruction(insn, 0, 16), 16) * 2;
   2335   bool HasRs = false;
   2336 
   2337   if (Rt == 0)
   2338     return MCDisassembler::Fail;
   2339   else if (Rs == 0)
   2340     MI.setOpcode(Mips::BLEZALC_MMR6);
   2341   else if (Rs == Rt)
   2342     MI.setOpcode(Mips::BGEZALC_MMR6);
   2343   else {
   2344     HasRs = true;
   2345     MI.setOpcode(Mips::BGEUC_MMR6);
   2346   }
   2347 
   2348   if (HasRs)
   2349     MI.addOperand(
   2350     MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID, Rs)));
   2351   MI.addOperand(
   2352     MCOperand::createReg(getReg(Decoder, Mips::GPR32RegClassID, Rt)));
   2353 
   2354   MI.addOperand(MCOperand::createImm(Imm));
   2355 
   2356   return MCDisassembler::Success;
   2357 }
   2358