From d6a07ccd10191c7060ebc04e53371bb383dc5863 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Mon, 15 Nov 2010 05:19:25 +0000 Subject: add proper encoding for MTCRF instead of using a hack. llvm-svn: 119121 --- llvm/lib/Target/PowerPC/PPCMCCodeEmitter.cpp | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) (limited to 'llvm/lib/Target/PowerPC/PPCMCCodeEmitter.cpp') diff --git a/llvm/lib/Target/PowerPC/PPCMCCodeEmitter.cpp b/llvm/lib/Target/PowerPC/PPCMCCodeEmitter.cpp index fd98f4dfb13..bbadcb07918 100644 --- a/llvm/lib/Target/PowerPC/PPCMCCodeEmitter.cpp +++ b/llvm/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(); -- cgit v1.2.3