aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/Target/Sparc/SparcV8ISelSimple.cpp14
-rw-r--r--lib/Target/SparcV8/SparcV8ISelSimple.cpp14
2 files changed, 24 insertions, 4 deletions
diff --git a/lib/Target/Sparc/SparcV8ISelSimple.cpp b/lib/Target/Sparc/SparcV8ISelSimple.cpp
index bca63dbf7b..0ea1f4a2d8 100644
--- a/lib/Target/Sparc/SparcV8ISelSimple.cpp
+++ b/lib/Target/Sparc/SparcV8ISelSimple.cpp
@@ -1059,8 +1059,18 @@ void V8ISel::emitGEPOperation (MachineBasicBlock *MBB,
unsigned memberOffset =
TD.getStructLayout (StTy)->MemberOffsets[fieldIndex];
// Emit an ADD to add memberOffset to the basePtr.
- BuildMI (*MBB, IP, V8::ADDri, 2,
- nextBasePtrReg).addReg (basePtrReg).addZImm (memberOffset);
+ // We might have to copy memberOffset into a register first, if it's
+ // big.
+ if (memberOffset + 4096 < 8191) {
+ BuildMI (*MBB, IP, V8::ADDri, 2,
+ nextBasePtrReg).addReg (basePtrReg).addSImm (memberOffset);
+ } else {
+ unsigned offsetReg = makeAnotherReg (Type::IntTy);
+ copyConstantToRegister (MBB, IP,
+ ConstantInt::get(Type::IntTy, memberOffset), offsetReg);
+ BuildMI (*MBB, IP, V8::ADDrr, 2,
+ nextBasePtrReg).addReg (basePtrReg).addReg (offsetReg);
+ }
// The next type is the member of the structure selected by the
// index.
Ty = StTy->getElementType (fieldIndex);
diff --git a/lib/Target/SparcV8/SparcV8ISelSimple.cpp b/lib/Target/SparcV8/SparcV8ISelSimple.cpp
index bca63dbf7b..0ea1f4a2d8 100644
--- a/lib/Target/SparcV8/SparcV8ISelSimple.cpp
+++ b/lib/Target/SparcV8/SparcV8ISelSimple.cpp
@@ -1059,8 +1059,18 @@ void V8ISel::emitGEPOperation (MachineBasicBlock *MBB,
unsigned memberOffset =
TD.getStructLayout (StTy)->MemberOffsets[fieldIndex];
// Emit an ADD to add memberOffset to the basePtr.
- BuildMI (*MBB, IP, V8::ADDri, 2,
- nextBasePtrReg).addReg (basePtrReg).addZImm (memberOffset);
+ // We might have to copy memberOffset into a register first, if it's
+ // big.
+ if (memberOffset + 4096 < 8191) {
+ BuildMI (*MBB, IP, V8::ADDri, 2,
+ nextBasePtrReg).addReg (basePtrReg).addSImm (memberOffset);
+ } else {
+ unsigned offsetReg = makeAnotherReg (Type::IntTy);
+ copyConstantToRegister (MBB, IP,
+ ConstantInt::get(Type::IntTy, memberOffset), offsetReg);
+ BuildMI (*MBB, IP, V8::ADDrr, 2,
+ nextBasePtrReg).addReg (basePtrReg).addReg (offsetReg);
+ }
// The next type is the member of the structure selected by the
// index.
Ty = StTy->getElementType (fieldIndex);