diff options
Diffstat (limited to 'lib/Target/PowerPC/Disassembler/PPCDisassembler.cpp')
| -rw-r--r-- | lib/Target/PowerPC/Disassembler/PPCDisassembler.cpp | 87 | 
1 files changed, 74 insertions, 13 deletions
diff --git a/lib/Target/PowerPC/Disassembler/PPCDisassembler.cpp b/lib/Target/PowerPC/Disassembler/PPCDisassembler.cpp index 5251b60f3480..4799ea27c4b4 100644 --- a/lib/Target/PowerPC/Disassembler/PPCDisassembler.cpp +++ b/lib/Target/PowerPC/Disassembler/PPCDisassembler.cpp @@ -25,7 +25,7 @@ class PPCDisassembler : public MCDisassembler {  public:    PPCDisassembler(const MCSubtargetInfo &STI, MCContext &Ctx)      : MCDisassembler(STI, Ctx) {} -  virtual ~PPCDisassembler() {} +  ~PPCDisassembler() override {}    DecodeStatus getInstruction(MCInst &Instr, uint64_t &Size,                                ArrayRef<uint8_t> Bytes, uint64_t Address, @@ -131,6 +131,26 @@ static const unsigned VSFRegs[] = {    PPC::VF28, PPC::VF29, PPC::VF30, PPC::VF31  }; +static const unsigned VSSRegs[] = { +  PPC::F0, PPC::F1, PPC::F2, PPC::F3, +  PPC::F4, PPC::F5, PPC::F6, PPC::F7, +  PPC::F8, PPC::F9, PPC::F10, PPC::F11, +  PPC::F12, PPC::F13, PPC::F14, PPC::F15, +  PPC::F16, PPC::F17, PPC::F18, PPC::F19, +  PPC::F20, PPC::F21, PPC::F22, PPC::F23, +  PPC::F24, PPC::F25, PPC::F26, PPC::F27, +  PPC::F28, PPC::F29, PPC::F30, PPC::F31, + +  PPC::VF0, PPC::VF1, PPC::VF2, PPC::VF3, +  PPC::VF4, PPC::VF5, PPC::VF6, PPC::VF7, +  PPC::VF8, PPC::VF9, PPC::VF10, PPC::VF11, +  PPC::VF12, PPC::VF13, PPC::VF14, PPC::VF15, +  PPC::VF16, PPC::VF17, PPC::VF18, PPC::VF19, +  PPC::VF20, PPC::VF21, PPC::VF22, PPC::VF23, +  PPC::VF24, PPC::VF25, PPC::VF26, PPC::VF27, +  PPC::VF28, PPC::VF29, PPC::VF30, PPC::VF31 +}; +  static const unsigned GPRegs[] = {    PPC::R0, PPC::R1, PPC::R2, PPC::R3,    PPC::R4, PPC::R5, PPC::R6, PPC::R7, @@ -164,11 +184,22 @@ static const unsigned G8Regs[] = {    PPC::X28, PPC::X29, PPC::X30, PPC::X31  }; +static const unsigned QFRegs[] = { +  PPC::QF0, PPC::QF1, PPC::QF2, PPC::QF3, +  PPC::QF4, PPC::QF5, PPC::QF6, PPC::QF7, +  PPC::QF8, PPC::QF9, PPC::QF10, PPC::QF11, +  PPC::QF12, PPC::QF13, PPC::QF14, PPC::QF15, +  PPC::QF16, PPC::QF17, PPC::QF18, PPC::QF19, +  PPC::QF20, PPC::QF21, PPC::QF22, PPC::QF23, +  PPC::QF24, PPC::QF25, PPC::QF26, PPC::QF27, +  PPC::QF28, PPC::QF29, PPC::QF30, PPC::QF31 +}; +  template <std::size_t N>  static DecodeStatus decodeRegisterClass(MCInst &Inst, uint64_t RegNo,                                          const unsigned (&Regs)[N]) {    assert(RegNo < N && "Invalid register number"); -  Inst.addOperand(MCOperand::CreateReg(Regs[RegNo])); +  Inst.addOperand(MCOperand::createReg(Regs[RegNo]));    return MCDisassembler::Success;  } @@ -178,6 +209,12 @@ static DecodeStatus DecodeCRRCRegisterClass(MCInst &Inst, uint64_t RegNo,    return decodeRegisterClass(Inst, RegNo, CRRegs);  } +static DecodeStatus DecodeCRRC0RegisterClass(MCInst &Inst, uint64_t RegNo, +                                            uint64_t Address, +                                            const void *Decoder) { +  return decodeRegisterClass(Inst, RegNo, CRRegs); +} +  static DecodeStatus DecodeCRBITRCRegisterClass(MCInst &Inst, uint64_t RegNo,                                              uint64_t Address,                                              const void *Decoder) { @@ -214,6 +251,12 @@ static DecodeStatus DecodeVSFRCRegisterClass(MCInst &Inst, uint64_t RegNo,    return decodeRegisterClass(Inst, RegNo, VSFRegs);  } +static DecodeStatus DecodeVSSRCRegisterClass(MCInst &Inst, uint64_t RegNo, +                                            uint64_t Address, +                                            const void *Decoder) { +  return decodeRegisterClass(Inst, RegNo, VSSRegs); +} +  static DecodeStatus DecodeGPRCRegisterClass(MCInst &Inst, uint64_t RegNo,                                              uint64_t Address,                                              const void *Decoder) { @@ -235,11 +278,20 @@ static DecodeStatus DecodeG8RCRegisterClass(MCInst &Inst, uint64_t RegNo,  #define DecodePointerLikeRegClass0 DecodeGPRCRegisterClass  #define DecodePointerLikeRegClass1 DecodeGPRC_NOR0RegisterClass +static DecodeStatus DecodeQFRCRegisterClass(MCInst &Inst, uint64_t RegNo, +                                            uint64_t Address, +                                            const void *Decoder) { +  return decodeRegisterClass(Inst, RegNo, QFRegs); +} + +#define DecodeQSRCRegisterClass DecodeQFRCRegisterClass +#define DecodeQBRCRegisterClass DecodeQFRCRegisterClass +  template<unsigned N>  static DecodeStatus decodeUImmOperand(MCInst &Inst, uint64_t Imm,                                        int64_t Address, const void *Decoder) {    assert(isUInt<N>(Imm) && "Invalid immediate"); -  Inst.addOperand(MCOperand::CreateImm(Imm)); +  Inst.addOperand(MCOperand::createImm(Imm));    return MCDisassembler::Success;  } @@ -247,7 +299,7 @@ template<unsigned N>  static DecodeStatus decodeSImmOperand(MCInst &Inst, uint64_t Imm,                                        int64_t Address, const void *Decoder) {    assert(isUInt<N>(Imm) && "Invalid immediate"); -  Inst.addOperand(MCOperand::CreateImm(SignExtend64<N>(Imm))); +  Inst.addOperand(MCOperand::createImm(SignExtend64<N>(Imm)));    return MCDisassembler::Success;  } @@ -270,19 +322,19 @@ static DecodeStatus decodeMemRIOperands(MCInst &Inst, uint64_t Imm,    case PPC::LFSU:    case PPC::LFDU:      // Add the tied output operand. -    Inst.addOperand(MCOperand::CreateReg(GP0Regs[Base])); +    Inst.addOperand(MCOperand::createReg(GP0Regs[Base]));      break;    case PPC::STBU:    case PPC::STHU:    case PPC::STWU:    case PPC::STFSU:    case PPC::STFDU: -    Inst.insert(Inst.begin(), MCOperand::CreateReg(GP0Regs[Base])); +    Inst.insert(Inst.begin(), MCOperand::createReg(GP0Regs[Base]));      break;    } -  Inst.addOperand(MCOperand::CreateImm(SignExtend64<16>(Disp))); -  Inst.addOperand(MCOperand::CreateReg(GP0Regs[Base])); +  Inst.addOperand(MCOperand::createImm(SignExtend64<16>(Disp))); +  Inst.addOperand(MCOperand::createReg(GP0Regs[Base]));    return MCDisassembler::Success;  } @@ -298,12 +350,12 @@ static DecodeStatus decodeMemRIXOperands(MCInst &Inst, uint64_t Imm,    if (Inst.getOpcode() == PPC::LDU)      // Add the tied output operand. -    Inst.addOperand(MCOperand::CreateReg(GP0Regs[Base])); +    Inst.addOperand(MCOperand::createReg(GP0Regs[Base]));    else if (Inst.getOpcode() == PPC::STDU) -    Inst.insert(Inst.begin(), MCOperand::CreateReg(GP0Regs[Base])); +    Inst.insert(Inst.begin(), MCOperand::createReg(GP0Regs[Base])); -  Inst.addOperand(MCOperand::CreateImm(SignExtend64<16>(Disp << 2))); -  Inst.addOperand(MCOperand::CreateReg(GP0Regs[Base])); +  Inst.addOperand(MCOperand::createImm(SignExtend64<16>(Disp << 2))); +  Inst.addOperand(MCOperand::createReg(GP0Regs[Base]));    return MCDisassembler::Success;  } @@ -314,7 +366,7 @@ static DecodeStatus decodeCRBitMOperand(MCInst &Inst, uint64_t Imm,    unsigned Zeros = countTrailingZeros(Imm);    assert(Zeros < 8 && "Invalid CR bit value"); -  Inst.addOperand(MCOperand::CreateReg(CRRegs[7 - Zeros])); +  Inst.addOperand(MCOperand::createReg(CRRegs[7 - Zeros]));    return MCDisassembler::Success;  } @@ -335,6 +387,15 @@ DecodeStatus PPCDisassembler::getInstruction(MCInst &MI, uint64_t &Size,    uint32_t Inst =        (Bytes[0] << 24) | (Bytes[1] << 16) | (Bytes[2] << 8) | (Bytes[3] << 0); +  if (STI.getFeatureBits()[PPC::FeatureQPX]) { +    DecodeStatus result = +      decodeInstruction(DecoderTableQPX32, MI, Inst, Address, this, STI); +    if (result != MCDisassembler::Fail) +      return result; + +    MI.clear(); +  } +    return decodeInstruction(DecoderTable32, MI, Inst, Address, this, STI);  }  | 
