diff options
author | Misha Brukman <brukman+llvm@gmail.com> | 2004-07-28 00:56:04 +0000 |
---|---|---|
committer | Misha Brukman <brukman+llvm@gmail.com> | 2004-07-28 00:56:04 +0000 |
commit | 8b29776d680f1b80b7471291b7d41df753d28511 (patch) | |
tree | 374c26a8c73c6fceac220e9f398e04e419f4f1b4 /lib/Target/PowerPC/PPC32ISelSimple.cpp | |
parent | b9b8ba58e7024917b6a44e776445cf6649bb83c2 (diff) |
LI can only take signed values, so values > 32767 can only be loaded with ORI
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@15299 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/PowerPC/PPC32ISelSimple.cpp')
-rw-r--r-- | lib/Target/PowerPC/PPC32ISelSimple.cpp | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/lib/Target/PowerPC/PPC32ISelSimple.cpp b/lib/Target/PowerPC/PPC32ISelSimple.cpp index 062df545fc..790aab42c5 100644 --- a/lib/Target/PowerPC/PPC32ISelSimple.cpp +++ b/lib/Target/PowerPC/PPC32ISelSimple.cpp @@ -555,7 +555,13 @@ void ISel::copyConstantToRegister(MachineBasicBlock *MBB, BuildMI(*MBB, IP, PPC32::ORI, 2, R+1).addReg(Temp).addImm(Val & 0xFFFF); } else if (Val < (1ULL << 48)) { unsigned Temp = makeAnotherReg(Type::IntTy); - BuildMI(*MBB, IP, PPC32::LI, 1, R).addSImm((Val >> 32) & 0xFFFF); + int HiBits = (Val >> 32) & 0xFFFF; + if (HiBits > 32767) { + BuildMI(*MBB, IP, PPC32::LI, 1, PPC32::R0).addImm(0); + BuildMI(*MBB, IP, PPC32::ORI, 2, R).addReg(PPC32::R0).addSImm(HiBits); + } else { + BuildMI(*MBB, IP, PPC32::LI, 1, R).addSImm(HiBits); + } BuildMI(*MBB, IP, PPC32::LIS, 1, Temp).addSImm((Val >> 16) & 0xFFFF); BuildMI(*MBB, IP, PPC32::ORI, 2, R+1).addReg(Temp).addImm(Val & 0xFFFF); } else { |