From 7192eb873201ff201681fefd1f5bf6ca2b2bc98e Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Mon, 15 Nov 2010 05:19:25 +0000 Subject: [PATCH] add proper encoding for MTCRF instead of using a hack. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@119121 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/PowerPC/PPCCodeEmitter.cpp | 31 +++++++++++++++---------- lib/Target/PowerPC/PPCInstrInfo.td | 1 + lib/Target/PowerPC/PPCMCCodeEmitter.cpp | 20 +++++++++++++--- 3 files changed, 37 insertions(+), 15 deletions(-) diff --git a/lib/Target/PowerPC/PPCCodeEmitter.cpp b/lib/Target/PowerPC/PPCCodeEmitter.cpp index 5298dda6bee..db8e2c544a8 100644 --- a/lib/Target/PowerPC/PPCCodeEmitter.cpp +++ b/lib/Target/PowerPC/PPCCodeEmitter.cpp @@ -58,6 +58,8 @@ namespace { unsigned getMachineOpValue(const MachineInstr &MI, const MachineOperand &MO) const; + unsigned get_crbitm_encoding(const MachineInstr &MI, unsigned OpNo) const; + const char *getPassName() const { return "PowerPC Machine Code Emitter"; } /// runOnMachineFunction - emits the given MachineFunction to memory @@ -124,24 +126,29 @@ void PPCCodeEmitter::emitBasicBlock(MachineBasicBlock &MBB) { } } +unsigned PPCCodeEmitter::get_crbitm_encoding(const MachineInstr &MI, + unsigned OpNo) const { + const MachineOperand &MO = MI.getOperand(OpNo); + assert((MI.getOpcode() == PPC::MTCRF || MI.getOpcode() == PPC::MFOCRF) && + (MO.getReg() >= PPC::CR0 && MO.getReg() <= PPC::CR7)); + return 0x80 >> PPCRegisterInfo::getRegisterNumbering(MO.getReg()); +} + + unsigned PPCCodeEmitter::getMachineOpValue(const MachineInstr &MI, const MachineOperand &MO) const { unsigned rv = 0; // Return value; defaults to 0 for unhandled cases // or things that get fixed up later by the JIT. if (MO.isReg()) { - rv = PPCRegisterInfo::getRegisterNumbering(MO.getReg()); - - // Special encoding for MTCRF and MFOCRF, which uses a bit mask for the - // register, not the register number directly. - if ((MI.getOpcode() == PPC::MTCRF || MI.getOpcode() == PPC::MFOCRF) && - (MO.getReg() >= PPC::CR0 && MO.getReg() <= PPC::CR7)) { - rv = 0x80 >> rv; - } - } else if (MO.isImm()) { - rv = MO.getImm(); - } else if (MO.isGlobal() || MO.isSymbol() || - MO.isCPI() || MO.isJTI()) { + assert(MI.getOpcode() != PPC::MTCRF && MI.getOpcode() != PPC::MFOCRF); + return PPCRegisterInfo::getRegisterNumbering(MO.getReg()); + } + + if (MO.isImm()) + return MO.getImm(); + + if (MO.isGlobal() || MO.isSymbol() || MO.isCPI() || MO.isJTI()) { unsigned Reloc = 0; if (MI.getOpcode() == PPC::BL_Darwin || MI.getOpcode() == PPC::BL8_Darwin || MI.getOpcode() == PPC::BL_SVR4 || MI.getOpcode() == PPC::BL8_ELF || diff --git a/lib/Target/PowerPC/PPCInstrInfo.td b/lib/Target/PowerPC/PPCInstrInfo.td index 05fdbeb8633..add8009b267 100644 --- a/lib/Target/PowerPC/PPCInstrInfo.td +++ b/lib/Target/PowerPC/PPCInstrInfo.td @@ -304,6 +304,7 @@ def symbolLo: Operand { } def crbitm: Operand { let PrintMethod = "printcrbitm"; + let EncoderMethod = "get_crbitm_encoding"; } // Address operands def memri : Operand { diff --git a/lib/Target/PowerPC/PPCMCCodeEmitter.cpp b/lib/Target/PowerPC/PPCMCCodeEmitter.cpp index fd98f4dfb13..bbadcb07918 100644 --- a/lib/Target/PowerPC/PPCMCCodeEmitter.cpp +++ b/lib/Target/PowerPC/PPCMCCodeEmitter.cpp @@ -56,12 +56,14 @@ public: "Invalid kind!"); return Infos[Kind - FirstTargetFixupKind]; } - + + unsigned get_crbitm_encoding(const MCInst &MI, unsigned OpNo, + SmallVectorImpl &Fixups) const; + /// getMachineOpValue - Return binary encoding of operand. If the machine /// operand requires relocation, record the relocation and return zero. unsigned getMachineOpValue(const MCInst &MI,const MCOperand &MO, SmallVectorImpl &Fixups) const; - // getBinaryCodeForInstr - TableGen'erated function for getting the // binary encoding for an instruction. @@ -89,11 +91,23 @@ MCCodeEmitter *llvm::createPPCMCCodeEmitter(const Target &, TargetMachine &TM, return new PPCMCCodeEmitter(TM, Ctx); } +unsigned PPCMCCodeEmitter:: +get_crbitm_encoding(const MCInst &MI, unsigned OpNo, + SmallVectorImpl &Fixups) const { + const MCOperand &MO = MI.getOperand(OpNo); + assert((MI.getOpcode() == PPC::MTCRF || MI.getOpcode() == PPC::MFOCRF) && + (MO.getReg() >= PPC::CR0 && MO.getReg() <= PPC::CR7)); + return 0x80 >> PPCRegisterInfo::getRegisterNumbering(MO.getReg()); +} + + unsigned PPCMCCodeEmitter:: getMachineOpValue(const MCInst &MI, const MCOperand &MO, SmallVectorImpl &Fixups) const { - if (MO.isReg()) + if (MO.isReg()) { + assert(MI.getOpcode() != PPC::MTCRF && MI.getOpcode() != PPC::MFOCRF); return PPCRegisterInfo::getRegisterNumbering(MO.getReg()); + } if (MO.isImm()) return MO.getImm(); -- 2.34.1