diff options
author | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2013-04-06 21:38:57 +0000 |
---|---|---|
committer | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2013-04-06 21:38:57 +0000 |
commit | 2b9355f2d9888d6a011353610b9ca24818de59a2 (patch) | |
tree | af847b3485ed4b093960a3c4fe8101dd46a2875e | |
parent | 839b9096538f790a2bb060547df24703807cb83b (diff) | |
download | llvm-2b9355f2d9888d6a011353610b9ca24818de59a2.tar.gz llvm-2b9355f2d9888d6a011353610b9ca24818de59a2.tar.bz2 llvm-2b9355f2d9888d6a011353610b9ca24818de59a2.tar.xz |
SPARC v9 stack pointer bias.
64-bit SPARC v9 processes use biased stack and frame pointers, so the
current function's stack frame is located at %sp+BIAS .. %fp+BIAS where
BIAS = 2047.
This makes more local variables directly accessible via [%fp+simm13]
addressing.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@178965 91177308-0d34-0410-b5e6-96231b3b80d8
-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 |