X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FTarget%2FPowerPC%2FDisassembler%2FPPCDisassembler.cpp;h=93a503c3758d5c21e01256336db71001637d3938;hb=17351cfb43e320129b854fff774cd81a6154fcb9;hp=5b6e6b25b99d4f1562c3e9ec94e88c39c5c864cc;hpb=1336daad86de3d09d8a2319be3b12f91d4632563;p=oota-llvm.git diff --git a/lib/Target/PowerPC/Disassembler/PPCDisassembler.cpp b/lib/Target/PowerPC/Disassembler/PPCDisassembler.cpp index 5b6e6b25b99..93a503c3758 100644 --- a/lib/Target/PowerPC/Disassembler/PPCDisassembler.cpp +++ b/lib/Target/PowerPC/Disassembler/PPCDisassembler.cpp @@ -12,6 +12,7 @@ #include "llvm/MC/MCFixedLenDisassembler.h" #include "llvm/MC/MCInst.h" #include "llvm/MC/MCSubtargetInfo.h" +#include "llvm/Support/Endian.h" #include "llvm/Support/TargetRegistry.h" using namespace llvm; @@ -22,10 +23,12 @@ typedef MCDisassembler::DecodeStatus DecodeStatus; namespace { class PPCDisassembler : public MCDisassembler { + bool IsLittleEndian; + public: - PPCDisassembler(const MCSubtargetInfo &STI, MCContext &Ctx) - : MCDisassembler(STI, Ctx) {} - ~PPCDisassembler() override {} + PPCDisassembler(const MCSubtargetInfo &STI, MCContext &Ctx, + bool IsLittleEndian) + : MCDisassembler(STI, Ctx), IsLittleEndian(IsLittleEndian) {} DecodeStatus getInstruction(MCInst &Instr, uint64_t &Size, ArrayRef Bytes, uint64_t Address, @@ -37,7 +40,13 @@ public: static MCDisassembler *createPPCDisassembler(const Target &T, const MCSubtargetInfo &STI, MCContext &Ctx) { - return new PPCDisassembler(STI, Ctx); + return new PPCDisassembler(STI, Ctx, /*IsLittleEndian=*/false); +} + +static MCDisassembler *createPPCLEDisassembler(const Target &T, + const MCSubtargetInfo &STI, + MCContext &Ctx) { + return new PPCDisassembler(STI, Ctx, /*IsLittleEndian=*/true); } extern "C" void LLVMInitializePowerPCDisassembler() { @@ -47,7 +56,7 @@ extern "C" void LLVMInitializePowerPCDisassembler() { TargetRegistry::RegisterMCDisassembler(ThePPC64Target, createPPCDisassembler); TargetRegistry::RegisterMCDisassembler(ThePPC64LETarget, - createPPCDisassembler); + createPPCLEDisassembler); } // FIXME: These can be generated by TableGen from the existing register @@ -199,7 +208,7 @@ template 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; } @@ -291,7 +300,7 @@ template static DecodeStatus decodeUImmOperand(MCInst &Inst, uint64_t Imm, int64_t Address, const void *Decoder) { assert(isUInt(Imm) && "Invalid immediate"); - Inst.addOperand(MCOperand::CreateImm(Imm)); + Inst.addOperand(MCOperand::createImm(Imm)); return MCDisassembler::Success; } @@ -299,7 +308,7 @@ template static DecodeStatus decodeSImmOperand(MCInst &Inst, uint64_t Imm, int64_t Address, const void *Decoder) { assert(isUInt(Imm) && "Invalid immediate"); - Inst.addOperand(MCOperand::CreateImm(SignExtend64(Imm))); + Inst.addOperand(MCOperand::createImm(SignExtend64(Imm))); return MCDisassembler::Success; } @@ -322,19 +331,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; } @@ -350,12 +359,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; } @@ -366,7 +375,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; } @@ -383,9 +392,9 @@ DecodeStatus PPCDisassembler::getInstruction(MCInst &MI, uint64_t &Size, return MCDisassembler::Fail; } - // The instruction is big-endian encoded. - uint32_t Inst = - (Bytes[0] << 24) | (Bytes[1] << 16) | (Bytes[2] << 8) | (Bytes[3] << 0); + // Read the instruction in the proper endianness. + uint32_t Inst = IsLittleEndian ? support::endian::read32le(Bytes.data()) + : support::endian::read32be(Bytes.data()); if (STI.getFeatureBits()[PPC::FeatureQPX]) { DecodeStatus result =