diff options
-rw-r--r-- | lib/Target/Sparc/SparcRegisterInfo.cpp | 5 | ||||
-rw-r--r-- | lib/Target/Sparc/SparcSubtarget.h | 6 | ||||
-rw-r--r-- | test/CodeGen/SPARC/64abi.ll | 12 |
3 files changed, 14 insertions, 9 deletions
diff --git a/lib/Target/Sparc/SparcRegisterInfo.cpp b/lib/Target/Sparc/SparcRegisterInfo.cpp index db9b30eb43..3af4c614cd 100644 --- a/lib/Target/Sparc/SparcRegisterInfo.cpp +++ b/lib/Target/Sparc/SparcRegisterInfo.cpp @@ -74,8 +74,9 @@ SparcRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II, // Addressable stack objects are accessed using neg. offsets from %fp MachineFunction &MF = *MI.getParent()->getParent(); - int Offset = MF.getFrameInfo()->getObjectOffset(FrameIndex) + - MI.getOperand(FIOperandNum + 1).getImm(); + int64_t Offset = MF.getFrameInfo()->getObjectOffset(FrameIndex) + + MI.getOperand(FIOperandNum + 1).getImm() + + Subtarget.getStackPointerBias(); // Replace frame index with a frame pointer reference. if (Offset >= -4096 && Offset <= 4095) { diff --git a/lib/Target/Sparc/SparcSubtarget.h b/lib/Target/Sparc/SparcSubtarget.h index a81931b34a..b94dd110ea 100644 --- a/lib/Target/Sparc/SparcSubtarget.h +++ b/lib/Target/Sparc/SparcSubtarget.h @@ -52,6 +52,12 @@ public: } return std::string(p); } + + /// The 64-bit ABI uses biased stack and frame pointers, so the stack frame + /// of the current function is the area from [%sp+BIAS] to [%fp+BIAS]. + int64_t getStackPointerBias() const { + return is64Bit() ? 2047 : 0; + } }; } // end namespace llvm diff --git a/test/CodeGen/SPARC/64abi.ll b/test/CodeGen/SPARC/64abi.ll index a9eb62387b..5c1c27aebc 100644 --- a/test/CodeGen/SPARC/64abi.ll +++ b/test/CodeGen/SPARC/64abi.ll @@ -7,10 +7,9 @@ ; CHECK: st %i3, [%i4] ; CHECK: stx %i4, [%i4] ; CHECK: st %i5, [%i4] -; FIXME: Stack bias -; CHECK: ld [%fp+180], [[R:%[gilo][0-7]]] +; CHECK: ld [%fp+2227], [[R:%[gilo][0-7]]] ; CHECK: st [[R]], [%i4] -; CHECK: ldx [%fp+184], [[R:%[gilo][0-7]]] +; CHECK: ldx [%fp+2231], [[R:%[gilo][0-7]]] ; CHECK: stx [[R]], [%i4] define void @intarg(i8 %a0, ; %i0 i8 %a1, ; %i1 @@ -39,8 +38,7 @@ define void @intarg(i8 %a0, ; %i0 ; CHECK: faddd %f2, ; CHECK: faddd %f4, ; CHECK: faddd %f6, -; FIXME: Stack bias -; CHECK: ld [%fp+260], [[F:%f[0-9]+]] +; CHECK: ld [%fp+2307], [[F:%f[0-9]+]] ; CHECK: fadds %f31, [[F]] define double @floatarg(float %a0, ; %f1 double %a1, ; %d2 @@ -74,8 +72,8 @@ define double @floatarg(float %a0, ; %f1 ; CHECK: fstod %f3 ; CHECK: faddd %f6 ; CHECK: faddd %f16 -; CHECK: ldx [%fp+184] -; CHECK: ldx [%fp+200] +; CHECK: ldx [%fp+2231] +; CHECK: ldx [%fp+2247] define void @mixedarg(i8 %a0, ; %i0 float %a1, ; %f3 i16 %a2, ; %i2 |