summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorMisha Brukman <brukman+llvm@gmail.com>2004-07-28 00:56:04 +0000
committerMisha Brukman <brukman+llvm@gmail.com>2004-07-28 00:56:04 +0000
commitf7037385e22cde157757b3424a92df504d91ed19 (patch)
tree34fad564b964d7bf5594e38425cb6fedfb0c4af7 /llvm/lib
parentbd1d7dceb7287c3d6c582662cf93ab1d40c977f7 (diff)
downloadbcm5719-llvm-f7037385e22cde157757b3424a92df504d91ed19.tar.gz
bcm5719-llvm-f7037385e22cde157757b3424a92df504d91ed19.zip
LI can only take signed values, so values > 32767 can only be loaded with ORI
llvm-svn: 15299
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Target/PowerPC/PPC32ISelSimple.cpp8
-rw-r--r--llvm/lib/Target/PowerPC/PowerPCISelSimple.cpp8
2 files changed, 14 insertions, 2 deletions
diff --git a/llvm/lib/Target/PowerPC/PPC32ISelSimple.cpp b/llvm/lib/Target/PowerPC/PPC32ISelSimple.cpp
index 062df545fc9..790aab42c55 100644
--- a/llvm/lib/Target/PowerPC/PPC32ISelSimple.cpp
+++ b/llvm/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 {
diff --git a/llvm/lib/Target/PowerPC/PowerPCISelSimple.cpp b/llvm/lib/Target/PowerPC/PowerPCISelSimple.cpp
index 062df545fc9..790aab42c55 100644
--- a/llvm/lib/Target/PowerPC/PowerPCISelSimple.cpp
+++ b/llvm/lib/Target/PowerPC/PowerPCISelSimple.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 {
OpenPOWER on IntegriCloud