Home | History | Annotate | Download | only in Disassembler
      1 //===- SparcDisassembler.cpp - Disassembler for Sparc -----------*- 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 Sparc Disassembler.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #include "Sparc.h"
     15 #include "SparcRegisterInfo.h"
     16 #include "SparcSubtarget.h"
     17 #include "llvm/MC/MCAsmInfo.h"
     18 #include "llvm/MC/MCContext.h"
     19 #include "llvm/MC/MCDisassembler/MCDisassembler.h"
     20 #include "llvm/MC/MCFixedLenDisassembler.h"
     21 #include "llvm/MC/MCInst.h"
     22 #include "llvm/Support/TargetRegistry.h"
     23 
     24 using namespace llvm;
     25 
     26 #define DEBUG_TYPE "sparc-disassembler"
     27 
     28 typedef MCDisassembler::DecodeStatus DecodeStatus;
     29 
     30 namespace {
     31 
     32 /// A disassembler class for Sparc.
     33 class SparcDisassembler : public MCDisassembler {
     34 public:
     35   SparcDisassembler(const MCSubtargetInfo &STI, MCContext &Ctx)
     36       : MCDisassembler(STI, Ctx) {}
     37   virtual ~SparcDisassembler() {}
     38 
     39   DecodeStatus getInstruction(MCInst &Instr, uint64_t &Size,
     40                               ArrayRef<uint8_t> Bytes, uint64_t Address,
     41                               raw_ostream &VStream,
     42                               raw_ostream &CStream) const override;
     43 };
     44 }
     45 
     46 namespace llvm {
     47 Target &getTheSparcTarget();
     48 Target &getTheSparcV9Target();
     49 Target &getTheSparcelTarget();
     50 }
     51 
     52 static MCDisassembler *createSparcDisassembler(const Target &T,
     53                                                const MCSubtargetInfo &STI,
     54                                                MCContext &Ctx) {
     55   return new SparcDisassembler(STI, Ctx);
     56 }
     57 
     58 
     59 extern "C" void LLVMInitializeSparcDisassembler() {
     60   // Register the disassembler.
     61   TargetRegistry::RegisterMCDisassembler(getTheSparcTarget(),
     62                                          createSparcDisassembler);
     63   TargetRegistry::RegisterMCDisassembler(getTheSparcV9Target(),
     64                                          createSparcDisassembler);
     65   TargetRegistry::RegisterMCDisassembler(getTheSparcelTarget(),
     66                                          createSparcDisassembler);
     67 }
     68 
     69 static const unsigned IntRegDecoderTable[] = {
     70   SP::G0,  SP::G1,  SP::G2,  SP::G3,
     71   SP::G4,  SP::G5,  SP::G6,  SP::G7,
     72   SP::O0,  SP::O1,  SP::O2,  SP::O3,
     73   SP::O4,  SP::O5,  SP::O6,  SP::O7,
     74   SP::L0,  SP::L1,  SP::L2,  SP::L3,
     75   SP::L4,  SP::L5,  SP::L6,  SP::L7,
     76   SP::I0,  SP::I1,  SP::I2,  SP::I3,
     77   SP::I4,  SP::I5,  SP::I6,  SP::I7 };
     78 
     79 static const unsigned FPRegDecoderTable[] = {
     80   SP::F0,   SP::F1,   SP::F2,   SP::F3,
     81   SP::F4,   SP::F5,   SP::F6,   SP::F7,
     82   SP::F8,   SP::F9,   SP::F10,  SP::F11,
     83   SP::F12,  SP::F13,  SP::F14,  SP::F15,
     84   SP::F16,  SP::F17,  SP::F18,  SP::F19,
     85   SP::F20,  SP::F21,  SP::F22,  SP::F23,
     86   SP::F24,  SP::F25,  SP::F26,  SP::F27,
     87   SP::F28,  SP::F29,  SP::F30,  SP::F31 };
     88 
     89 static const unsigned DFPRegDecoderTable[] = {
     90   SP::D0,   SP::D16,  SP::D1,   SP::D17,
     91   SP::D2,   SP::D18,  SP::D3,   SP::D19,
     92   SP::D4,   SP::D20,  SP::D5,   SP::D21,
     93   SP::D6,   SP::D22,  SP::D7,   SP::D23,
     94   SP::D8,   SP::D24,  SP::D9,   SP::D25,
     95   SP::D10,  SP::D26,  SP::D11,  SP::D27,
     96   SP::D12,  SP::D28,  SP::D13,  SP::D29,
     97   SP::D14,  SP::D30,  SP::D15,  SP::D31 };
     98 
     99 static const unsigned QFPRegDecoderTable[] = {
    100   SP::Q0,  SP::Q8,   ~0U,  ~0U,
    101   SP::Q1,  SP::Q9,   ~0U,  ~0U,
    102   SP::Q2,  SP::Q10,  ~0U,  ~0U,
    103   SP::Q3,  SP::Q11,  ~0U,  ~0U,
    104   SP::Q4,  SP::Q12,  ~0U,  ~0U,
    105   SP::Q5,  SP::Q13,  ~0U,  ~0U,
    106   SP::Q6,  SP::Q14,  ~0U,  ~0U,
    107   SP::Q7,  SP::Q15,  ~0U,  ~0U } ;
    108 
    109 static const unsigned FCCRegDecoderTable[] = {
    110   SP::FCC0, SP::FCC1, SP::FCC2, SP::FCC3 };
    111 
    112 static const unsigned ASRRegDecoderTable[] = {
    113   SP::Y,     SP::ASR1,  SP::ASR2,  SP::ASR3,
    114   SP::ASR4,  SP::ASR5,  SP::ASR6,  SP::ASR7,
    115   SP::ASR8,  SP::ASR9,  SP::ASR10, SP::ASR11,
    116   SP::ASR12, SP::ASR13, SP::ASR14, SP::ASR15,
    117   SP::ASR16, SP::ASR17, SP::ASR18, SP::ASR19,
    118   SP::ASR20, SP::ASR21, SP::ASR22, SP::ASR23,
    119   SP::ASR24, SP::ASR25, SP::ASR26, SP::ASR27,
    120   SP::ASR28, SP::ASR29, SP::ASR30, SP::ASR31};
    121 
    122 static const unsigned PRRegDecoderTable[] = {
    123   SP::TPC, SP::TNPC, SP::TSTATE, SP::TT, SP::TICK, SP::TBA, SP::PSTATE,
    124   SP::TL, SP::PIL, SP::CWP, SP::CANSAVE, SP::CANRESTORE, SP::CLEANWIN,
    125   SP::OTHERWIN, SP::WSTATE
    126 };
    127 
    128 static const uint16_t IntPairDecoderTable[] = {
    129   SP::G0_G1, SP::G2_G3, SP::G4_G5, SP::G6_G7,
    130   SP::O0_O1, SP::O2_O3, SP::O4_O5, SP::O6_O7,
    131   SP::L0_L1, SP::L2_L3, SP::L4_L5, SP::L6_L7,
    132   SP::I0_I1, SP::I2_I3, SP::I4_I5, SP::I6_I7,
    133 };
    134 
    135 static const unsigned CPRegDecoderTable[] = {
    136   SP::C0,  SP::C1,  SP::C2,  SP::C3,
    137   SP::C4,  SP::C5,  SP::C6,  SP::C7,
    138   SP::C8,  SP::C9,  SP::C10, SP::C11,
    139   SP::C12, SP::C13, SP::C14, SP::C15,
    140   SP::C16, SP::C17, SP::C18, SP::C19,
    141   SP::C20, SP::C21, SP::C22, SP::C23,
    142   SP::C24, SP::C25, SP::C26, SP::C27,
    143   SP::C28, SP::C29, SP::C30, SP::C31
    144 };
    145 
    146 
    147 static const uint16_t CPPairDecoderTable[] = {
    148   SP::C0_C1,   SP::C2_C3,   SP::C4_C5,   SP::C6_C7,
    149   SP::C8_C9,   SP::C10_C11, SP::C12_C13, SP::C14_C15,
    150   SP::C16_C17, SP::C18_C19, SP::C20_C21, SP::C22_C23,
    151   SP::C24_C25, SP::C26_C27, SP::C28_C29, SP::C30_C31
    152 };
    153 
    154 static DecodeStatus DecodeIntRegsRegisterClass(MCInst &Inst,
    155                                                unsigned RegNo,
    156                                                uint64_t Address,
    157                                                const void *Decoder) {
    158   if (RegNo > 31)
    159     return MCDisassembler::Fail;
    160   unsigned Reg = IntRegDecoderTable[RegNo];
    161   Inst.addOperand(MCOperand::createReg(Reg));
    162   return MCDisassembler::Success;
    163 }
    164 
    165 static DecodeStatus DecodeI64RegsRegisterClass(MCInst &Inst,
    166                                                unsigned RegNo,
    167                                                uint64_t Address,
    168                                                const void *Decoder) {
    169   if (RegNo > 31)
    170     return MCDisassembler::Fail;
    171   unsigned Reg = IntRegDecoderTable[RegNo];
    172   Inst.addOperand(MCOperand::createReg(Reg));
    173   return MCDisassembler::Success;
    174 }
    175 
    176 
    177 static DecodeStatus DecodeFPRegsRegisterClass(MCInst &Inst,
    178                                               unsigned RegNo,
    179                                               uint64_t Address,
    180                                               const void *Decoder) {
    181   if (RegNo > 31)
    182     return MCDisassembler::Fail;
    183   unsigned Reg = FPRegDecoderTable[RegNo];
    184   Inst.addOperand(MCOperand::createReg(Reg));
    185   return MCDisassembler::Success;
    186 }
    187 
    188 
    189 static DecodeStatus DecodeDFPRegsRegisterClass(MCInst &Inst,
    190                                                unsigned RegNo,
    191                                                uint64_t Address,
    192                                                const void *Decoder) {
    193   if (RegNo > 31)
    194     return MCDisassembler::Fail;
    195   unsigned Reg = DFPRegDecoderTable[RegNo];
    196   Inst.addOperand(MCOperand::createReg(Reg));
    197   return MCDisassembler::Success;
    198 }
    199 
    200 
    201 static DecodeStatus DecodeQFPRegsRegisterClass(MCInst &Inst,
    202                                                unsigned RegNo,
    203                                                uint64_t Address,
    204                                                const void *Decoder) {
    205   if (RegNo > 31)
    206     return MCDisassembler::Fail;
    207 
    208   unsigned Reg = QFPRegDecoderTable[RegNo];
    209   if (Reg == ~0U)
    210     return MCDisassembler::Fail;
    211   Inst.addOperand(MCOperand::createReg(Reg));
    212   return MCDisassembler::Success;
    213 }
    214 
    215 static DecodeStatus DecodeCPRegsRegisterClass(MCInst &Inst,
    216                                                unsigned RegNo,
    217                                                uint64_t Address,
    218                                                const void *Decoder) {
    219   if (RegNo > 31)
    220     return MCDisassembler::Fail;
    221   unsigned Reg = CPRegDecoderTable[RegNo];
    222   Inst.addOperand(MCOperand::createReg(Reg));
    223   return MCDisassembler::Success;
    224 }
    225 
    226 static DecodeStatus DecodeFCCRegsRegisterClass(MCInst &Inst, unsigned RegNo,
    227                                                uint64_t Address,
    228                                                const void *Decoder) {
    229   if (RegNo > 3)
    230     return MCDisassembler::Fail;
    231   Inst.addOperand(MCOperand::createReg(FCCRegDecoderTable[RegNo]));
    232   return MCDisassembler::Success;
    233 }
    234 
    235 static DecodeStatus DecodeASRRegsRegisterClass(MCInst &Inst, unsigned RegNo,
    236                                                uint64_t Address,
    237                                                const void *Decoder) {
    238   if (RegNo > 31)
    239     return MCDisassembler::Fail;
    240   Inst.addOperand(MCOperand::createReg(ASRRegDecoderTable[RegNo]));
    241   return MCDisassembler::Success;
    242 }
    243 
    244 static DecodeStatus DecodePRRegsRegisterClass(MCInst &Inst, unsigned RegNo,
    245                                                uint64_t Address,
    246                                                const void *Decoder) {
    247   if (RegNo >= array_lengthof(PRRegDecoderTable))
    248     return MCDisassembler::Fail;
    249   Inst.addOperand(MCOperand::createReg(PRRegDecoderTable[RegNo]));
    250   return MCDisassembler::Success;
    251 }
    252 
    253 static DecodeStatus DecodeIntPairRegisterClass(MCInst &Inst, unsigned RegNo,
    254                                    uint64_t Address, const void *Decoder) {
    255   DecodeStatus S = MCDisassembler::Success;
    256 
    257   if (RegNo > 31)
    258     return MCDisassembler::Fail;
    259 
    260   if ((RegNo & 1))
    261     S = MCDisassembler::SoftFail;
    262 
    263   unsigned RegisterPair = IntPairDecoderTable[RegNo/2];
    264   Inst.addOperand(MCOperand::createReg(RegisterPair));
    265   return S;
    266 }
    267 
    268 static DecodeStatus DecodeCPPairRegisterClass(MCInst &Inst, unsigned RegNo,
    269                                    uint64_t Address, const void *Decoder) {
    270   if (RegNo > 31)
    271     return MCDisassembler::Fail;
    272 
    273   unsigned RegisterPair = CPPairDecoderTable[RegNo/2];
    274   Inst.addOperand(MCOperand::createReg(RegisterPair));
    275   return MCDisassembler::Success;
    276 }
    277 
    278 static DecodeStatus DecodeLoadInt(MCInst &Inst, unsigned insn, uint64_t Address,
    279                                   const void *Decoder);
    280 static DecodeStatus DecodeLoadIntPair(MCInst &Inst, unsigned insn, uint64_t Address,
    281                                   const void *Decoder);
    282 static DecodeStatus DecodeLoadFP(MCInst &Inst, unsigned insn, uint64_t Address,
    283                                  const void *Decoder);
    284 static DecodeStatus DecodeLoadDFP(MCInst &Inst, unsigned insn, uint64_t Address,
    285                                   const void *Decoder);
    286 static DecodeStatus DecodeLoadQFP(MCInst &Inst, unsigned insn, uint64_t Address,
    287                                   const void *Decoder);
    288 static DecodeStatus DecodeLoadCP(MCInst &Inst, unsigned insn, uint64_t Address,
    289                                   const void *Decoder);
    290 static DecodeStatus DecodeLoadCPPair(MCInst &Inst, unsigned insn, uint64_t Address,
    291                                   const void *Decoder);
    292 static DecodeStatus DecodeStoreInt(MCInst &Inst, unsigned insn,
    293                                    uint64_t Address, const void *Decoder);
    294 static DecodeStatus DecodeStoreIntPair(MCInst &Inst, unsigned insn,
    295                                    uint64_t Address, const void *Decoder);
    296 static DecodeStatus DecodeStoreFP(MCInst &Inst, unsigned insn,
    297                                   uint64_t Address, const void *Decoder);
    298 static DecodeStatus DecodeStoreDFP(MCInst &Inst, unsigned insn,
    299                                    uint64_t Address, const void *Decoder);
    300 static DecodeStatus DecodeStoreQFP(MCInst &Inst, unsigned insn,
    301                                    uint64_t Address, const void *Decoder);
    302 static DecodeStatus DecodeStoreCP(MCInst &Inst, unsigned insn,
    303                                    uint64_t Address, const void *Decoder);
    304 static DecodeStatus DecodeStoreCPPair(MCInst &Inst, unsigned insn,
    305                                    uint64_t Address, const void *Decoder);
    306 static DecodeStatus DecodeCall(MCInst &Inst, unsigned insn,
    307                                uint64_t Address, const void *Decoder);
    308 static DecodeStatus DecodeSIMM13(MCInst &Inst, unsigned insn,
    309                                  uint64_t Address, const void *Decoder);
    310 static DecodeStatus DecodeJMPL(MCInst &Inst, unsigned insn, uint64_t Address,
    311                                const void *Decoder);
    312 static DecodeStatus DecodeReturn(MCInst &MI, unsigned insn, uint64_t Address,
    313                                  const void *Decoder);
    314 static DecodeStatus DecodeSWAP(MCInst &Inst, unsigned insn, uint64_t Address,
    315                                const void *Decoder);
    316 static DecodeStatus DecodeTRAP(MCInst &Inst, unsigned insn, uint64_t Address,
    317                                const void *Decoder);
    318 
    319 #include "SparcGenDisassemblerTables.inc"
    320 
    321 /// Read four bytes from the ArrayRef and return 32 bit word.
    322 static DecodeStatus readInstruction32(ArrayRef<uint8_t> Bytes, uint64_t Address,
    323                                       uint64_t &Size, uint32_t &Insn,
    324                                       bool IsLittleEndian) {
    325   // We want to read exactly 4 Bytes of data.
    326   if (Bytes.size() < 4) {
    327     Size = 0;
    328     return MCDisassembler::Fail;
    329   }
    330 
    331   Insn = IsLittleEndian
    332              ? (Bytes[0] << 0) | (Bytes[1] << 8) | (Bytes[2] << 16) |
    333                    (Bytes[3] << 24)
    334              : (Bytes[3] << 0) | (Bytes[2] << 8) | (Bytes[1] << 16) |
    335                    (Bytes[0] << 24);
    336 
    337   return MCDisassembler::Success;
    338 }
    339 
    340 DecodeStatus SparcDisassembler::getInstruction(MCInst &Instr, uint64_t &Size,
    341                                                ArrayRef<uint8_t> Bytes,
    342                                                uint64_t Address,
    343                                                raw_ostream &VStream,
    344                                                raw_ostream &CStream) const {
    345   uint32_t Insn;
    346   bool isLittleEndian = getContext().getAsmInfo()->isLittleEndian();
    347   DecodeStatus Result =
    348       readInstruction32(Bytes, Address, Size, Insn, isLittleEndian);
    349   if (Result == MCDisassembler::Fail)
    350     return MCDisassembler::Fail;
    351 
    352   // Calling the auto-generated decoder function.
    353 
    354   if (STI.getFeatureBits()[Sparc::FeatureV9])
    355   {
    356     Result = decodeInstruction(DecoderTableSparcV932, Instr, Insn, Address, this, STI);
    357   }
    358   else
    359   {
    360     Result = decodeInstruction(DecoderTableSparcV832, Instr, Insn, Address, this, STI);
    361   }
    362   if (Result != MCDisassembler::Fail)
    363     return Result;
    364 
    365   Result =
    366       decodeInstruction(DecoderTableSparc32, Instr, Insn, Address, this, STI);
    367 
    368   if (Result != MCDisassembler::Fail) {
    369     Size = 4;
    370     return Result;
    371   }
    372 
    373   return MCDisassembler::Fail;
    374 }
    375 
    376 
    377 typedef DecodeStatus (*DecodeFunc)(MCInst &MI, unsigned insn, uint64_t Address,
    378                                    const void *Decoder);
    379 
    380 static DecodeStatus DecodeMem(MCInst &MI, unsigned insn, uint64_t Address,
    381                               const void *Decoder,
    382                               bool isLoad, DecodeFunc DecodeRD) {
    383   unsigned rd = fieldFromInstruction(insn, 25, 5);
    384   unsigned rs1 = fieldFromInstruction(insn, 14, 5);
    385   bool isImm = fieldFromInstruction(insn, 13, 1);
    386   bool hasAsi = fieldFromInstruction(insn, 23, 1); // (in op3 field)
    387   unsigned asi = fieldFromInstruction(insn, 5, 8);
    388   unsigned rs2 = 0;
    389   unsigned simm13 = 0;
    390   if (isImm)
    391     simm13 = SignExtend32<13>(fieldFromInstruction(insn, 0, 13));
    392   else
    393     rs2 = fieldFromInstruction(insn, 0, 5);
    394 
    395   DecodeStatus status;
    396   if (isLoad) {
    397     status = DecodeRD(MI, rd, Address, Decoder);
    398     if (status != MCDisassembler::Success)
    399       return status;
    400   }
    401 
    402   // Decode rs1.
    403   status = DecodeIntRegsRegisterClass(MI, rs1, Address, Decoder);
    404   if (status != MCDisassembler::Success)
    405     return status;
    406 
    407   // Decode imm|rs2.
    408   if (isImm)
    409     MI.addOperand(MCOperand::createImm(simm13));
    410   else {
    411     status = DecodeIntRegsRegisterClass(MI, rs2, Address, Decoder);
    412     if (status != MCDisassembler::Success)
    413       return status;
    414   }
    415 
    416   if (hasAsi)
    417     MI.addOperand(MCOperand::createImm(asi));
    418 
    419   if (!isLoad) {
    420     status = DecodeRD(MI, rd, Address, Decoder);
    421     if (status != MCDisassembler::Success)
    422       return status;
    423   }
    424   return MCDisassembler::Success;
    425 }
    426 
    427 static DecodeStatus DecodeLoadInt(MCInst &Inst, unsigned insn, uint64_t Address,
    428                                   const void *Decoder) {
    429   return DecodeMem(Inst, insn, Address, Decoder, true,
    430                    DecodeIntRegsRegisterClass);
    431 }
    432 
    433 static DecodeStatus DecodeLoadIntPair(MCInst &Inst, unsigned insn, uint64_t Address,
    434                                   const void *Decoder) {
    435   return DecodeMem(Inst, insn, Address, Decoder, true,
    436                    DecodeIntPairRegisterClass);
    437 }
    438 
    439 static DecodeStatus DecodeLoadFP(MCInst &Inst, unsigned insn, uint64_t Address,
    440                                  const void *Decoder) {
    441   return DecodeMem(Inst, insn, Address, Decoder, true,
    442                    DecodeFPRegsRegisterClass);
    443 }
    444 
    445 static DecodeStatus DecodeLoadDFP(MCInst &Inst, unsigned insn, uint64_t Address,
    446                                   const void *Decoder) {
    447   return DecodeMem(Inst, insn, Address, Decoder, true,
    448                    DecodeDFPRegsRegisterClass);
    449 }
    450 
    451 static DecodeStatus DecodeLoadQFP(MCInst &Inst, unsigned insn, uint64_t Address,
    452                                   const void *Decoder) {
    453   return DecodeMem(Inst, insn, Address, Decoder, true,
    454                    DecodeQFPRegsRegisterClass);
    455 }
    456 
    457 static DecodeStatus DecodeLoadCP(MCInst &Inst, unsigned insn, uint64_t Address,
    458                                   const void *Decoder) {
    459   return DecodeMem(Inst, insn, Address, Decoder, true,
    460                    DecodeCPRegsRegisterClass);
    461 }
    462 
    463 static DecodeStatus DecodeLoadCPPair(MCInst &Inst, unsigned insn, uint64_t Address,
    464                                   const void *Decoder) {
    465   return DecodeMem(Inst, insn, Address, Decoder, true,
    466                    DecodeCPPairRegisterClass);
    467 }
    468 
    469 static DecodeStatus DecodeStoreInt(MCInst &Inst, unsigned insn,
    470                                    uint64_t Address, const void *Decoder) {
    471   return DecodeMem(Inst, insn, Address, Decoder, false,
    472                    DecodeIntRegsRegisterClass);
    473 }
    474 
    475 static DecodeStatus DecodeStoreIntPair(MCInst &Inst, unsigned insn,
    476                                    uint64_t Address, const void *Decoder) {
    477   return DecodeMem(Inst, insn, Address, Decoder, false,
    478                    DecodeIntPairRegisterClass);
    479 }
    480 
    481 static DecodeStatus DecodeStoreFP(MCInst &Inst, unsigned insn, uint64_t Address,
    482                                   const void *Decoder) {
    483   return DecodeMem(Inst, insn, Address, Decoder, false,
    484                    DecodeFPRegsRegisterClass);
    485 }
    486 
    487 static DecodeStatus DecodeStoreDFP(MCInst &Inst, unsigned insn,
    488                                    uint64_t Address, const void *Decoder) {
    489   return DecodeMem(Inst, insn, Address, Decoder, false,
    490                    DecodeDFPRegsRegisterClass);
    491 }
    492 
    493 static DecodeStatus DecodeStoreQFP(MCInst &Inst, unsigned insn,
    494                                    uint64_t Address, const void *Decoder) {
    495   return DecodeMem(Inst, insn, Address, Decoder, false,
    496                    DecodeQFPRegsRegisterClass);
    497 }
    498 
    499 static DecodeStatus DecodeStoreCP(MCInst &Inst, unsigned insn,
    500                                    uint64_t Address, const void *Decoder) {
    501   return DecodeMem(Inst, insn, Address, Decoder, false,
    502                    DecodeCPRegsRegisterClass);
    503 }
    504 
    505 static DecodeStatus DecodeStoreCPPair(MCInst &Inst, unsigned insn,
    506                                    uint64_t Address, const void *Decoder) {
    507   return DecodeMem(Inst, insn, Address, Decoder, false,
    508                    DecodeCPPairRegisterClass);
    509 }
    510 
    511 static bool tryAddingSymbolicOperand(int64_t Value,  bool isBranch,
    512                                      uint64_t Address, uint64_t Offset,
    513                                      uint64_t Width, MCInst &MI,
    514                                      const void *Decoder) {
    515   const MCDisassembler *Dis = static_cast<const MCDisassembler*>(Decoder);
    516   return Dis->tryAddingSymbolicOperand(MI, Value, Address, isBranch,
    517                                        Offset, Width);
    518 }
    519 
    520 static DecodeStatus DecodeCall(MCInst &MI, unsigned insn,
    521                                uint64_t Address, const void *Decoder) {
    522   unsigned tgt = fieldFromInstruction(insn, 0, 30);
    523   tgt <<= 2;
    524   if (!tryAddingSymbolicOperand(tgt+Address, false, Address,
    525                                 0, 30, MI, Decoder))
    526     MI.addOperand(MCOperand::createImm(tgt));
    527   return MCDisassembler::Success;
    528 }
    529 
    530 static DecodeStatus DecodeSIMM13(MCInst &MI, unsigned insn,
    531                                  uint64_t Address, const void *Decoder) {
    532   unsigned tgt = SignExtend32<13>(fieldFromInstruction(insn, 0, 13));
    533   MI.addOperand(MCOperand::createImm(tgt));
    534   return MCDisassembler::Success;
    535 }
    536 
    537 static DecodeStatus DecodeJMPL(MCInst &MI, unsigned insn, uint64_t Address,
    538                                const void *Decoder) {
    539 
    540   unsigned rd = fieldFromInstruction(insn, 25, 5);
    541   unsigned rs1 = fieldFromInstruction(insn, 14, 5);
    542   unsigned isImm = fieldFromInstruction(insn, 13, 1);
    543   unsigned rs2 = 0;
    544   unsigned simm13 = 0;
    545   if (isImm)
    546     simm13 = SignExtend32<13>(fieldFromInstruction(insn, 0, 13));
    547   else
    548     rs2 = fieldFromInstruction(insn, 0, 5);
    549 
    550   // Decode RD.
    551   DecodeStatus status = DecodeIntRegsRegisterClass(MI, rd, Address, Decoder);
    552   if (status != MCDisassembler::Success)
    553     return status;
    554 
    555   // Decode RS1.
    556   status = DecodeIntRegsRegisterClass(MI, rs1, Address, Decoder);
    557   if (status != MCDisassembler::Success)
    558     return status;
    559 
    560   // Decode RS1 | SIMM13.
    561   if (isImm)
    562     MI.addOperand(MCOperand::createImm(simm13));
    563   else {
    564     status = DecodeIntRegsRegisterClass(MI, rs2, Address, Decoder);
    565     if (status != MCDisassembler::Success)
    566       return status;
    567   }
    568   return MCDisassembler::Success;
    569 }
    570 
    571 static DecodeStatus DecodeReturn(MCInst &MI, unsigned insn, uint64_t Address,
    572                                  const void *Decoder) {
    573 
    574   unsigned rs1 = fieldFromInstruction(insn, 14, 5);
    575   unsigned isImm = fieldFromInstruction(insn, 13, 1);
    576   unsigned rs2 = 0;
    577   unsigned simm13 = 0;
    578   if (isImm)
    579     simm13 = SignExtend32<13>(fieldFromInstruction(insn, 0, 13));
    580   else
    581     rs2 = fieldFromInstruction(insn, 0, 5);
    582 
    583   // Decode RS1.
    584   DecodeStatus status = DecodeIntRegsRegisterClass(MI, rs1, Address, Decoder);
    585   if (status != MCDisassembler::Success)
    586     return status;
    587 
    588   // Decode RS2 | SIMM13.
    589   if (isImm)
    590     MI.addOperand(MCOperand::createImm(simm13));
    591   else {
    592     status = DecodeIntRegsRegisterClass(MI, rs2, Address, Decoder);
    593     if (status != MCDisassembler::Success)
    594       return status;
    595   }
    596   return MCDisassembler::Success;
    597 }
    598 
    599 static DecodeStatus DecodeSWAP(MCInst &MI, unsigned insn, uint64_t Address,
    600                                const void *Decoder) {
    601 
    602   unsigned rd = fieldFromInstruction(insn, 25, 5);
    603   unsigned rs1 = fieldFromInstruction(insn, 14, 5);
    604   unsigned isImm = fieldFromInstruction(insn, 13, 1);
    605   bool hasAsi = fieldFromInstruction(insn, 23, 1); // (in op3 field)
    606   unsigned asi = fieldFromInstruction(insn, 5, 8);
    607   unsigned rs2 = 0;
    608   unsigned simm13 = 0;
    609   if (isImm)
    610     simm13 = SignExtend32<13>(fieldFromInstruction(insn, 0, 13));
    611   else
    612     rs2 = fieldFromInstruction(insn, 0, 5);
    613 
    614   // Decode RD.
    615   DecodeStatus status = DecodeIntRegsRegisterClass(MI, rd, Address, Decoder);
    616   if (status != MCDisassembler::Success)
    617     return status;
    618 
    619   // Decode RS1.
    620   status = DecodeIntRegsRegisterClass(MI, rs1, Address, Decoder);
    621   if (status != MCDisassembler::Success)
    622     return status;
    623 
    624   // Decode RS1 | SIMM13.
    625   if (isImm)
    626     MI.addOperand(MCOperand::createImm(simm13));
    627   else {
    628     status = DecodeIntRegsRegisterClass(MI, rs2, Address, Decoder);
    629     if (status != MCDisassembler::Success)
    630       return status;
    631   }
    632 
    633   if (hasAsi)
    634     MI.addOperand(MCOperand::createImm(asi));
    635 
    636   return MCDisassembler::Success;
    637 }
    638 
    639 static DecodeStatus DecodeTRAP(MCInst &MI, unsigned insn, uint64_t Address,
    640                                const void *Decoder) {
    641 
    642   unsigned rs1 = fieldFromInstruction(insn, 14, 5);
    643   unsigned isImm = fieldFromInstruction(insn, 13, 1);
    644   unsigned cc =fieldFromInstruction(insn, 25, 4);
    645   unsigned rs2 = 0;
    646   unsigned imm7 = 0;
    647   if (isImm)
    648     imm7 = fieldFromInstruction(insn, 0, 7);
    649   else
    650     rs2 = fieldFromInstruction(insn, 0, 5);
    651 
    652   // Decode RS1.
    653   DecodeStatus status = DecodeIntRegsRegisterClass(MI, rs1, Address, Decoder);
    654   if (status != MCDisassembler::Success)
    655     return status;
    656 
    657   // Decode RS1 | IMM7.
    658   if (isImm)
    659     MI.addOperand(MCOperand::createImm(imm7));
    660   else {
    661     status = DecodeIntRegsRegisterClass(MI, rs2, Address, Decoder);
    662     if (status != MCDisassembler::Success)
    663       return status;
    664   }
    665 
    666   // Decode CC
    667   MI.addOperand(MCOperand::createImm(cc));
    668 
    669   return MCDisassembler::Success;
    670 }
    671