12345347eSHal Finkel //===------ PPCDisassembler.cpp - Disassembler for PowerPC ------*- C++ -*-===// 22345347eSHal Finkel // 3*2946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*2946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 5*2946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 62345347eSHal Finkel // 72345347eSHal Finkel //===----------------------------------------------------------------------===// 82345347eSHal Finkel 927c769d2SBenjamin Kramer #include "MCTargetDesc/PPCMCTargetDesc.h" 10f57c1977SBenjamin Kramer #include "llvm/MC/MCDisassembler/MCDisassembler.h" 112345347eSHal Finkel #include "llvm/MC/MCFixedLenDisassembler.h" 122345347eSHal Finkel #include "llvm/MC/MCInst.h" 132345347eSHal Finkel #include "llvm/MC/MCSubtargetInfo.h" 14c11fd3e7SBenjamin Kramer #include "llvm/Support/Endian.h" 152345347eSHal Finkel #include "llvm/Support/TargetRegistry.h" 162345347eSHal Finkel 172345347eSHal Finkel using namespace llvm; 182345347eSHal Finkel 190dad994aSNemanja Ivanovic DEFINE_PPC_REGCLASSES; 200dad994aSNemanja Ivanovic 21e96dd897SChandler Carruth #define DEBUG_TYPE "ppc-disassembler" 22e96dd897SChandler Carruth 232345347eSHal Finkel typedef MCDisassembler::DecodeStatus DecodeStatus; 242345347eSHal Finkel 252345347eSHal Finkel namespace { 262345347eSHal Finkel class PPCDisassembler : public MCDisassembler { 27c11fd3e7SBenjamin Kramer bool IsLittleEndian; 28c11fd3e7SBenjamin Kramer 292345347eSHal Finkel public: 30c11fd3e7SBenjamin Kramer PPCDisassembler(const MCSubtargetInfo &STI, MCContext &Ctx, 31c11fd3e7SBenjamin Kramer bool IsLittleEndian) 32c11fd3e7SBenjamin Kramer : MCDisassembler(STI, Ctx), IsLittleEndian(IsLittleEndian) {} 332345347eSHal Finkel 344aa6bea7SRafael Espindola DecodeStatus getInstruction(MCInst &Instr, uint64_t &Size, 357fc5b874SRafael Espindola ArrayRef<uint8_t> Bytes, uint64_t Address, 364aa6bea7SRafael Espindola raw_ostream &VStream, 374aa6bea7SRafael Espindola raw_ostream &CStream) const override; 382345347eSHal Finkel }; 392345347eSHal Finkel } // end anonymous namespace 402345347eSHal Finkel 412345347eSHal Finkel static MCDisassembler *createPPCDisassembler(const Target &T, 42a1bc0f56SLang Hames const MCSubtargetInfo &STI, 43a1bc0f56SLang Hames MCContext &Ctx) { 44c11fd3e7SBenjamin Kramer return new PPCDisassembler(STI, Ctx, /*IsLittleEndian=*/false); 45c11fd3e7SBenjamin Kramer } 46c11fd3e7SBenjamin Kramer 47c11fd3e7SBenjamin Kramer static MCDisassembler *createPPCLEDisassembler(const Target &T, 48c11fd3e7SBenjamin Kramer const MCSubtargetInfo &STI, 49c11fd3e7SBenjamin Kramer MCContext &Ctx) { 50c11fd3e7SBenjamin Kramer return new PPCDisassembler(STI, Ctx, /*IsLittleEndian=*/true); 512345347eSHal Finkel } 522345347eSHal Finkel 532345347eSHal Finkel extern "C" void LLVMInitializePowerPCDisassembler() { 542345347eSHal Finkel // Register the disassembler for each target. 55f42454b9SMehdi Amini TargetRegistry::RegisterMCDisassembler(getThePPC32Target(), 562345347eSHal Finkel createPPCDisassembler); 57f42454b9SMehdi Amini TargetRegistry::RegisterMCDisassembler(getThePPC64Target(), 582345347eSHal Finkel createPPCDisassembler); 59f42454b9SMehdi Amini TargetRegistry::RegisterMCDisassembler(getThePPC64LETarget(), 60c11fd3e7SBenjamin Kramer createPPCLEDisassembler); 612345347eSHal Finkel } 622345347eSHal Finkel 632345347eSHal Finkel // FIXME: These can be generated by TableGen from the existing register 642345347eSHal Finkel // encoding values! 652345347eSHal Finkel 662345347eSHal Finkel template <std::size_t N> 672345347eSHal Finkel static DecodeStatus decodeRegisterClass(MCInst &Inst, uint64_t RegNo, 680dad994aSNemanja Ivanovic const MCPhysReg (&Regs)[N]) { 692345347eSHal Finkel assert(RegNo < N && "Invalid register number"); 70e9119e41SJim Grosbach Inst.addOperand(MCOperand::createReg(Regs[RegNo])); 712345347eSHal Finkel return MCDisassembler::Success; 722345347eSHal Finkel } 732345347eSHal Finkel 742345347eSHal Finkel static DecodeStatus DecodeCRRCRegisterClass(MCInst &Inst, uint64_t RegNo, 752345347eSHal Finkel uint64_t Address, 762345347eSHal Finkel const void *Decoder) { 772345347eSHal Finkel return decodeRegisterClass(Inst, RegNo, CRRegs); 782345347eSHal Finkel } 792345347eSHal Finkel 80535e69deSKit Barton static DecodeStatus DecodeCRRC0RegisterClass(MCInst &Inst, uint64_t RegNo, 81535e69deSKit Barton uint64_t Address, 82535e69deSKit Barton const void *Decoder) { 83535e69deSKit Barton return decodeRegisterClass(Inst, RegNo, CRRegs); 84535e69deSKit Barton } 85535e69deSKit Barton 862345347eSHal Finkel static DecodeStatus DecodeCRBITRCRegisterClass(MCInst &Inst, uint64_t RegNo, 872345347eSHal Finkel uint64_t Address, 882345347eSHal Finkel const void *Decoder) { 892345347eSHal Finkel return decodeRegisterClass(Inst, RegNo, CRBITRegs); 902345347eSHal Finkel } 912345347eSHal Finkel 922345347eSHal Finkel static DecodeStatus DecodeF4RCRegisterClass(MCInst &Inst, uint64_t RegNo, 932345347eSHal Finkel uint64_t Address, 942345347eSHal Finkel const void *Decoder) { 952345347eSHal Finkel return decodeRegisterClass(Inst, RegNo, FRegs); 962345347eSHal Finkel } 972345347eSHal Finkel 982345347eSHal Finkel static DecodeStatus DecodeF8RCRegisterClass(MCInst &Inst, uint64_t RegNo, 992345347eSHal Finkel uint64_t Address, 1002345347eSHal Finkel const void *Decoder) { 1012345347eSHal Finkel return decodeRegisterClass(Inst, RegNo, FRegs); 1022345347eSHal Finkel } 1032345347eSHal Finkel 10411049f8fSNemanja Ivanovic static DecodeStatus DecodeVFRCRegisterClass(MCInst &Inst, uint64_t RegNo, 10511049f8fSNemanja Ivanovic uint64_t Address, 10611049f8fSNemanja Ivanovic const void *Decoder) { 10711049f8fSNemanja Ivanovic return decodeRegisterClass(Inst, RegNo, VFRegs); 10811049f8fSNemanja Ivanovic } 10911049f8fSNemanja Ivanovic 1102345347eSHal Finkel static DecodeStatus DecodeVRRCRegisterClass(MCInst &Inst, uint64_t RegNo, 1112345347eSHal Finkel uint64_t Address, 1122345347eSHal Finkel const void *Decoder) { 1132345347eSHal Finkel return decodeRegisterClass(Inst, RegNo, VRegs); 1142345347eSHal Finkel } 1152345347eSHal Finkel 11627774d92SHal Finkel static DecodeStatus DecodeVSRCRegisterClass(MCInst &Inst, uint64_t RegNo, 11727774d92SHal Finkel uint64_t Address, 11827774d92SHal Finkel const void *Decoder) { 11927774d92SHal Finkel return decodeRegisterClass(Inst, RegNo, VSRegs); 12027774d92SHal Finkel } 12127774d92SHal Finkel 12219be506aSHal Finkel static DecodeStatus DecodeVSFRCRegisterClass(MCInst &Inst, uint64_t RegNo, 12319be506aSHal Finkel uint64_t Address, 12419be506aSHal Finkel const void *Decoder) { 12519be506aSHal Finkel return decodeRegisterClass(Inst, RegNo, VSFRegs); 12619be506aSHal Finkel } 12719be506aSHal Finkel 128f3c94b1eSNemanja Ivanovic static DecodeStatus DecodeVSSRCRegisterClass(MCInst &Inst, uint64_t RegNo, 129f3c94b1eSNemanja Ivanovic uint64_t Address, 130f3c94b1eSNemanja Ivanovic const void *Decoder) { 131f3c94b1eSNemanja Ivanovic return decodeRegisterClass(Inst, RegNo, VSSRegs); 132f3c94b1eSNemanja Ivanovic } 133f3c94b1eSNemanja Ivanovic 1342345347eSHal Finkel static DecodeStatus DecodeGPRCRegisterClass(MCInst &Inst, uint64_t RegNo, 1352345347eSHal Finkel uint64_t Address, 1362345347eSHal Finkel const void *Decoder) { 1370dad994aSNemanja Ivanovic return decodeRegisterClass(Inst, RegNo, RRegs); 1382345347eSHal Finkel } 1392345347eSHal Finkel 1402345347eSHal Finkel static DecodeStatus DecodeGPRC_NOR0RegisterClass(MCInst &Inst, uint64_t RegNo, 1412345347eSHal Finkel uint64_t Address, 1422345347eSHal Finkel const void *Decoder) { 1430dad994aSNemanja Ivanovic return decodeRegisterClass(Inst, RegNo, RRegsNoR0); 1442345347eSHal Finkel } 1452345347eSHal Finkel 1462345347eSHal Finkel static DecodeStatus DecodeG8RCRegisterClass(MCInst &Inst, uint64_t RegNo, 1472345347eSHal Finkel uint64_t Address, 1482345347eSHal Finkel const void *Decoder) { 1490dad994aSNemanja Ivanovic return decodeRegisterClass(Inst, RegNo, XRegs); 1502345347eSHal Finkel } 1512345347eSHal Finkel 15222e7da95SGuozhi Wei static DecodeStatus DecodeG8RC_NOX0RegisterClass(MCInst &Inst, uint64_t RegNo, 15322e7da95SGuozhi Wei uint64_t Address, 15422e7da95SGuozhi Wei const void *Decoder) { 1550dad994aSNemanja Ivanovic return decodeRegisterClass(Inst, RegNo, XRegsNoX0); 15622e7da95SGuozhi Wei } 15722e7da95SGuozhi Wei 1582345347eSHal Finkel #define DecodePointerLikeRegClass0 DecodeGPRCRegisterClass 1592345347eSHal Finkel #define DecodePointerLikeRegClass1 DecodeGPRC_NOR0RegisterClass 1602345347eSHal Finkel 161c93a9a2cSHal Finkel static DecodeStatus DecodeQFRCRegisterClass(MCInst &Inst, uint64_t RegNo, 162c93a9a2cSHal Finkel uint64_t Address, 163c93a9a2cSHal Finkel const void *Decoder) { 164c93a9a2cSHal Finkel return decodeRegisterClass(Inst, RegNo, QFRegs); 165c93a9a2cSHal Finkel } 166c93a9a2cSHal Finkel 167d52990c7SJustin Hibbits static DecodeStatus DecodeSPE4RCRegisterClass(MCInst &Inst, uint64_t RegNo, 168d52990c7SJustin Hibbits uint64_t Address, 169d52990c7SJustin Hibbits const void *Decoder) { 1700dad994aSNemanja Ivanovic return decodeRegisterClass(Inst, RegNo, RRegs); 171d52990c7SJustin Hibbits } 172d52990c7SJustin Hibbits 173d52990c7SJustin Hibbits static DecodeStatus DecodeSPERCRegisterClass(MCInst &Inst, uint64_t RegNo, 174d52990c7SJustin Hibbits uint64_t Address, 175d52990c7SJustin Hibbits const void *Decoder) { 176d52990c7SJustin Hibbits return decodeRegisterClass(Inst, RegNo, SPERegs); 177d52990c7SJustin Hibbits } 178d52990c7SJustin Hibbits 179c93a9a2cSHal Finkel #define DecodeQSRCRegisterClass DecodeQFRCRegisterClass 180c93a9a2cSHal Finkel #define DecodeQBRCRegisterClass DecodeQFRCRegisterClass 181c93a9a2cSHal Finkel 1822345347eSHal Finkel template<unsigned N> 1832345347eSHal Finkel static DecodeStatus decodeUImmOperand(MCInst &Inst, uint64_t Imm, 1842345347eSHal Finkel int64_t Address, const void *Decoder) { 1852345347eSHal Finkel assert(isUInt<N>(Imm) && "Invalid immediate"); 186e9119e41SJim Grosbach Inst.addOperand(MCOperand::createImm(Imm)); 1872345347eSHal Finkel return MCDisassembler::Success; 1882345347eSHal Finkel } 1892345347eSHal Finkel 1902345347eSHal Finkel template<unsigned N> 1912345347eSHal Finkel static DecodeStatus decodeSImmOperand(MCInst &Inst, uint64_t Imm, 1922345347eSHal Finkel int64_t Address, const void *Decoder) { 1932345347eSHal Finkel assert(isUInt<N>(Imm) && "Invalid immediate"); 194e9119e41SJim Grosbach Inst.addOperand(MCOperand::createImm(SignExtend64<N>(Imm))); 1952345347eSHal Finkel return MCDisassembler::Success; 1962345347eSHal Finkel } 1972345347eSHal Finkel 1982345347eSHal Finkel static DecodeStatus decodeMemRIOperands(MCInst &Inst, uint64_t Imm, 1992345347eSHal Finkel int64_t Address, const void *Decoder) { 2002345347eSHal Finkel // Decode the memri field (imm, reg), which has the low 16-bits as the 2012345347eSHal Finkel // displacement and the next 5 bits as the register #. 2022345347eSHal Finkel 2032345347eSHal Finkel uint64_t Base = Imm >> 16; 2042345347eSHal Finkel uint64_t Disp = Imm & 0xFFFF; 2052345347eSHal Finkel 2062345347eSHal Finkel assert(Base < 32 && "Invalid base register"); 2072345347eSHal Finkel 2082345347eSHal Finkel switch (Inst.getOpcode()) { 2092345347eSHal Finkel default: break; 2102345347eSHal Finkel case PPC::LBZU: 2112345347eSHal Finkel case PPC::LHAU: 2122345347eSHal Finkel case PPC::LHZU: 2132345347eSHal Finkel case PPC::LWZU: 2142345347eSHal Finkel case PPC::LFSU: 2152345347eSHal Finkel case PPC::LFDU: 2162345347eSHal Finkel // Add the tied output operand. 2170dad994aSNemanja Ivanovic Inst.addOperand(MCOperand::createReg(RRegsNoR0[Base])); 2182345347eSHal Finkel break; 2192345347eSHal Finkel case PPC::STBU: 2202345347eSHal Finkel case PPC::STHU: 2212345347eSHal Finkel case PPC::STWU: 2222345347eSHal Finkel case PPC::STFSU: 2232345347eSHal Finkel case PPC::STFDU: 2240dad994aSNemanja Ivanovic Inst.insert(Inst.begin(), MCOperand::createReg(RRegsNoR0[Base])); 2252345347eSHal Finkel break; 2262345347eSHal Finkel } 2272345347eSHal Finkel 228e9119e41SJim Grosbach Inst.addOperand(MCOperand::createImm(SignExtend64<16>(Disp))); 2290dad994aSNemanja Ivanovic Inst.addOperand(MCOperand::createReg(RRegsNoR0[Base])); 2302345347eSHal Finkel return MCDisassembler::Success; 2312345347eSHal Finkel } 2322345347eSHal Finkel 2332345347eSHal Finkel static DecodeStatus decodeMemRIXOperands(MCInst &Inst, uint64_t Imm, 2342345347eSHal Finkel int64_t Address, const void *Decoder) { 2352345347eSHal Finkel // Decode the memrix field (imm, reg), which has the low 14-bits as the 2362345347eSHal Finkel // displacement and the next 5 bits as the register #. 2372345347eSHal Finkel 2382345347eSHal Finkel uint64_t Base = Imm >> 14; 2392345347eSHal Finkel uint64_t Disp = Imm & 0x3FFF; 2402345347eSHal Finkel 2412345347eSHal Finkel assert(Base < 32 && "Invalid base register"); 2422345347eSHal Finkel 2432345347eSHal Finkel if (Inst.getOpcode() == PPC::LDU) 2442345347eSHal Finkel // Add the tied output operand. 2450dad994aSNemanja Ivanovic Inst.addOperand(MCOperand::createReg(RRegsNoR0[Base])); 2462345347eSHal Finkel else if (Inst.getOpcode() == PPC::STDU) 2470dad994aSNemanja Ivanovic Inst.insert(Inst.begin(), MCOperand::createReg(RRegsNoR0[Base])); 2482345347eSHal Finkel 249e9119e41SJim Grosbach Inst.addOperand(MCOperand::createImm(SignExtend64<16>(Disp << 2))); 2500dad994aSNemanja Ivanovic Inst.addOperand(MCOperand::createReg(RRegsNoR0[Base])); 2512345347eSHal Finkel return MCDisassembler::Success; 2522345347eSHal Finkel } 2532345347eSHal Finkel 254ba532dc8SKit Barton static DecodeStatus decodeMemRIX16Operands(MCInst &Inst, uint64_t Imm, 255ba532dc8SKit Barton int64_t Address, const void *Decoder) { 256ba532dc8SKit Barton // Decode the memrix16 field (imm, reg), which has the low 12-bits as the 257ba532dc8SKit Barton // displacement with 16-byte aligned, and the next 5 bits as the register #. 258ba532dc8SKit Barton 259ba532dc8SKit Barton uint64_t Base = Imm >> 12; 260ba532dc8SKit Barton uint64_t Disp = Imm & 0xFFF; 261ba532dc8SKit Barton 262ba532dc8SKit Barton assert(Base < 32 && "Invalid base register"); 263ba532dc8SKit Barton 264ba532dc8SKit Barton Inst.addOperand(MCOperand::createImm(SignExtend64<16>(Disp << 4))); 2650dad994aSNemanja Ivanovic Inst.addOperand(MCOperand::createReg(RRegsNoR0[Base])); 266ba532dc8SKit Barton return MCDisassembler::Success; 267ba532dc8SKit Barton } 268ba532dc8SKit Barton 2694fa4fa6aSJustin Hibbits static DecodeStatus decodeSPE8Operands(MCInst &Inst, uint64_t Imm, 2704fa4fa6aSJustin Hibbits int64_t Address, const void *Decoder) { 2714fa4fa6aSJustin Hibbits // Decode the spe8disp field (imm, reg), which has the low 5-bits as the 2724fa4fa6aSJustin Hibbits // displacement with 8-byte aligned, and the next 5 bits as the register #. 2734fa4fa6aSJustin Hibbits 2744fa4fa6aSJustin Hibbits uint64_t Base = Imm >> 5; 2754fa4fa6aSJustin Hibbits uint64_t Disp = Imm & 0x1F; 2764fa4fa6aSJustin Hibbits 2774fa4fa6aSJustin Hibbits assert(Base < 32 && "Invalid base register"); 2784fa4fa6aSJustin Hibbits 2794fa4fa6aSJustin Hibbits Inst.addOperand(MCOperand::createImm(Disp << 3)); 2800dad994aSNemanja Ivanovic Inst.addOperand(MCOperand::createReg(RRegsNoR0[Base])); 2814fa4fa6aSJustin Hibbits return MCDisassembler::Success; 2824fa4fa6aSJustin Hibbits } 2834fa4fa6aSJustin Hibbits 2844fa4fa6aSJustin Hibbits static DecodeStatus decodeSPE4Operands(MCInst &Inst, uint64_t Imm, 2854fa4fa6aSJustin Hibbits int64_t Address, const void *Decoder) { 2864fa4fa6aSJustin Hibbits // Decode the spe4disp field (imm, reg), which has the low 5-bits as the 2874fa4fa6aSJustin Hibbits // displacement with 4-byte aligned, and the next 5 bits as the register #. 2884fa4fa6aSJustin Hibbits 2894fa4fa6aSJustin Hibbits uint64_t Base = Imm >> 5; 2904fa4fa6aSJustin Hibbits uint64_t Disp = Imm & 0x1F; 2914fa4fa6aSJustin Hibbits 2924fa4fa6aSJustin Hibbits assert(Base < 32 && "Invalid base register"); 2934fa4fa6aSJustin Hibbits 2944fa4fa6aSJustin Hibbits Inst.addOperand(MCOperand::createImm(Disp << 2)); 2950dad994aSNemanja Ivanovic Inst.addOperand(MCOperand::createReg(RRegsNoR0[Base])); 2964fa4fa6aSJustin Hibbits return MCDisassembler::Success; 2974fa4fa6aSJustin Hibbits } 2984fa4fa6aSJustin Hibbits 2994fa4fa6aSJustin Hibbits static DecodeStatus decodeSPE2Operands(MCInst &Inst, uint64_t Imm, 3004fa4fa6aSJustin Hibbits int64_t Address, const void *Decoder) { 3014fa4fa6aSJustin Hibbits // Decode the spe2disp field (imm, reg), which has the low 5-bits as the 3024fa4fa6aSJustin Hibbits // displacement with 2-byte aligned, and the next 5 bits as the register #. 3034fa4fa6aSJustin Hibbits 3044fa4fa6aSJustin Hibbits uint64_t Base = Imm >> 5; 3054fa4fa6aSJustin Hibbits uint64_t Disp = Imm & 0x1F; 3064fa4fa6aSJustin Hibbits 3074fa4fa6aSJustin Hibbits assert(Base < 32 && "Invalid base register"); 3084fa4fa6aSJustin Hibbits 3094fa4fa6aSJustin Hibbits Inst.addOperand(MCOperand::createImm(Disp << 1)); 3100dad994aSNemanja Ivanovic Inst.addOperand(MCOperand::createReg(RRegsNoR0[Base])); 3114fa4fa6aSJustin Hibbits return MCDisassembler::Success; 3124fa4fa6aSJustin Hibbits } 3134fa4fa6aSJustin Hibbits 3142345347eSHal Finkel static DecodeStatus decodeCRBitMOperand(MCInst &Inst, uint64_t Imm, 3152345347eSHal Finkel int64_t Address, const void *Decoder) { 3162345347eSHal Finkel // The cr bit encoding is 0x80 >> cr_reg_num. 3172345347eSHal Finkel 3182345347eSHal Finkel unsigned Zeros = countTrailingZeros(Imm); 3192345347eSHal Finkel assert(Zeros < 8 && "Invalid CR bit value"); 3202345347eSHal Finkel 321e9119e41SJim Grosbach Inst.addOperand(MCOperand::createReg(CRRegs[7 - Zeros])); 3222345347eSHal Finkel return MCDisassembler::Success; 3232345347eSHal Finkel } 3242345347eSHal Finkel 3252345347eSHal Finkel #include "PPCGenDisassemblerTables.inc" 3262345347eSHal Finkel 3272345347eSHal Finkel DecodeStatus PPCDisassembler::getInstruction(MCInst &MI, uint64_t &Size, 3287fc5b874SRafael Espindola ArrayRef<uint8_t> Bytes, 3294aa6bea7SRafael Espindola uint64_t Address, raw_ostream &OS, 3304aa6bea7SRafael Espindola raw_ostream &CS) const { 3312345347eSHal Finkel // Get the four bytes of the instruction. 3322345347eSHal Finkel Size = 4; 3337fc5b874SRafael Espindola if (Bytes.size() < 4) { 3342345347eSHal Finkel Size = 0; 3352345347eSHal Finkel return MCDisassembler::Fail; 3362345347eSHal Finkel } 3372345347eSHal Finkel 338c11fd3e7SBenjamin Kramer // Read the instruction in the proper endianness. 339c11fd3e7SBenjamin Kramer uint32_t Inst = IsLittleEndian ? support::endian::read32le(Bytes.data()) 340c11fd3e7SBenjamin Kramer : support::endian::read32be(Bytes.data()); 3412345347eSHal Finkel 342db0712f9SMichael Kuperstein if (STI.getFeatureBits()[PPC::FeatureQPX]) { 343c93a9a2cSHal Finkel DecodeStatus result = 344c93a9a2cSHal Finkel decodeInstruction(DecoderTableQPX32, MI, Inst, Address, this, STI); 345c93a9a2cSHal Finkel if (result != MCDisassembler::Fail) 346c93a9a2cSHal Finkel return result; 3474fa4fa6aSJustin Hibbits } else if (STI.getFeatureBits()[PPC::FeatureSPE]) { 3484fa4fa6aSJustin Hibbits DecodeStatus result = 3494fa4fa6aSJustin Hibbits decodeInstruction(DecoderTableSPE32, MI, Inst, Address, this, STI); 3504fa4fa6aSJustin Hibbits if (result != MCDisassembler::Fail) 3514fa4fa6aSJustin Hibbits return result; 352c93a9a2cSHal Finkel } 353c93a9a2cSHal Finkel 3542345347eSHal Finkel return decodeInstruction(DecoderTable32, MI, Inst, Address, this, STI); 3552345347eSHal Finkel } 3562345347eSHal Finkel 357