From cc6b01b1e68cd87807f94a8c51088be9ff096e71 Mon Sep 17 00:00:00 2001 From: Misha Brukman Date: Thu, 12 Aug 2004 02:53:01 +0000 Subject: [PATCH] * Pointers are 8 bytes, hence cLong type on 64-bit PPC * Fix loading of GlobalValues git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@15678 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/PowerPC/PPC64ISelSimple.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/lib/Target/PowerPC/PPC64ISelSimple.cpp b/lib/Target/PowerPC/PPC64ISelSimple.cpp index 9695c7d6981..129b038da1f 100644 --- a/lib/Target/PowerPC/PPC64ISelSimple.cpp +++ b/lib/Target/PowerPC/PPC64ISelSimple.cpp @@ -52,14 +52,14 @@ static inline TypeClass getClass(const Type *Ty) { case Type::ShortTyID: case Type::UShortTyID: return cShort; // Short operands are class #1 case Type::IntTyID: - case Type::UIntTyID: - case Type::PointerTyID: return cInt; // Ints and pointers are class #2 + case Type::UIntTyID: return cInt; // Ints are class #2 case Type::FloatTyID: return cFP32; // Single float is #3 case Type::DoubleTyID: return cFP64; // Double Point is #4 + case Type::PointerTyID: case Type::LongTyID: - case Type::ULongTyID: return cLong; // Longs are class #5 + case Type::ULongTyID: return cLong; // Longs and pointers are class #5 default: assert(0 && "Invalid type to getClass!"); return cByte; // not reached @@ -606,9 +606,11 @@ void ISel::copyConstantToRegister(MachineBasicBlock *MBB, // Copy zero (null pointer) to the register. BuildMI(*MBB, IP, PPC::LI, 1, R).addSImm(0); } else if (GlobalValue *GV = dyn_cast(C)) { - unsigned TmpReg = makeAnotherReg(GV->getType()); - BuildMI(*MBB, IP, PPC::LD, 2, TmpReg).addGlobalAddress(GV).addReg(PPC::R2); - BuildMI(*MBB, IP, PPC::LWA, 2, R).addSImm(0).addReg(TmpReg); + static unsigned OpcodeTable[] = { + PPC::LBZ, PPC::LHZ, PPC::LWZ, PPC::LFS, PPC::LFD, PPC::LD + }; + unsigned Opcode = OpcodeTable[getClassB(GV->getType())]; + BuildMI(*MBB, IP, Opcode, 2, R).addGlobalAddress(GV).addReg(PPC::R2); } else { std::cerr << "Offending constant: " << *C << "\n"; assert(0 && "Type not handled yet!");