LI can only take signed values, so values > 32767 can only be loaded with ORI
authorMisha Brukman <brukman+llvm@gmail.com>
Wed, 28 Jul 2004 00:56:04 +0000 (00:56 +0000)
committerMisha Brukman <brukman+llvm@gmail.com>
Wed, 28 Jul 2004 00:56:04 +0000 (00:56 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@15299 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/PowerPC/PPC32ISelSimple.cpp
lib/Target/PowerPC/PowerPCISelSimple.cpp

index 062df545fc9abef46e3b62c68bddb2d22b2bccfc..790aab42c55fcedb27f3ecf90bc0347c6d13d670 100644 (file)
@@ -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 {
index 062df545fc9abef46e3b62c68bddb2d22b2bccfc..790aab42c55fcedb27f3ecf90bc0347c6d13d670 100644 (file)
@@ -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 {