[Sparc] Account for bias in stack readjustment.
from Brad (maintainer)
This commit is contained in:
parent
d23bfea135
commit
f5ec4ab208
@ -1,4 +1,4 @@
|
||||
# $OpenBSD: Makefile,v 1.163 2017/10/26 10:05:55 ajacoutot Exp $
|
||||
# $OpenBSD: Makefile,v 1.164 2017/11/02 10:36:23 ajacoutot Exp $
|
||||
|
||||
# XXX: Remember to bump MODCLANG_VERSION in lang/clang/clang.port.mk when
|
||||
# updating this port.
|
||||
@ -17,7 +17,7 @@ DISTNAME = llvm-${LLVM_V}.src
|
||||
PKGNAME = llvm-${LLVM_V}
|
||||
PKGNAME-main = llvm-${LLVM_V}
|
||||
PKGNAME-python = py-llvm-${LLVM_V}
|
||||
REVISION-main = 7
|
||||
REVISION-main = 8
|
||||
CATEGORIES = devel
|
||||
DISTFILES = llvm-${LLVM_V}.src${EXTRACT_SUFX} \
|
||||
cfe-${LLVM_V}.src${EXTRACT_SUFX} \
|
||||
|
@ -0,0 +1,64 @@
|
||||
$OpenBSD: patch-lib_Target_Sparc_SparcFrameLowering_cpp,v 1.3 2017/11/02 10:36:23 ajacoutot Exp $
|
||||
|
||||
[Sparc] Account for bias in stack readjustment
|
||||
|
||||
This was broken long ago in D12208, which failed to account for the fact that
|
||||
64-bit SPARC uses a stack bias of 2047, and it is the *unbiased* value which
|
||||
should be aligned, not the biased one.
|
||||
|
||||
Index: lib/Target/Sparc/SparcFrameLowering.cpp
|
||||
--- lib/Target/Sparc/SparcFrameLowering.cpp.orig
|
||||
+++ lib/Target/Sparc/SparcFrameLowering.cpp
|
||||
@@ -88,10 +88,11 @@ void SparcFrameLowering::emitPrologue(MachineFunction
|
||||
|
||||
assert(&MF.front() == &MBB && "Shrink-wrapping not yet supported");
|
||||
MachineFrameInfo &MFI = MF.getFrameInfo();
|
||||
+ const SparcSubtarget &Subtarget = MF.getSubtarget<SparcSubtarget>();
|
||||
const SparcInstrInfo &TII =
|
||||
- *static_cast<const SparcInstrInfo *>(MF.getSubtarget().getInstrInfo());
|
||||
+ *static_cast<const SparcInstrInfo *>(Subtarget.getInstrInfo());
|
||||
const SparcRegisterInfo &RegInfo =
|
||||
- *static_cast<const SparcRegisterInfo *>(MF.getSubtarget().getRegisterInfo());
|
||||
+ *static_cast<const SparcRegisterInfo *>(Subtarget.getRegisterInfo());
|
||||
MachineBasicBlock::iterator MBBI = MBB.begin();
|
||||
// Debug location must be unknown since the first debug location is used
|
||||
// to determine the end of the prologue.
|
||||
@@ -141,7 +142,7 @@ void SparcFrameLowering::emitPrologue(MachineFunction
|
||||
|
||||
// Adds the SPARC subtarget-specific spill area to the stack
|
||||
// size. Also ensures target-required alignment.
|
||||
- NumBytes = MF.getSubtarget<SparcSubtarget>().getAdjustedFrameSize(NumBytes);
|
||||
+ NumBytes = Subtarget.getAdjustedFrameSize(NumBytes);
|
||||
|
||||
// Finally, ensure that the size is sufficiently aligned for the
|
||||
// data on the stack.
|
||||
@@ -176,9 +177,27 @@ void SparcFrameLowering::emitPrologue(MachineFunction
|
||||
.addCFIIndex(CFIIndex);
|
||||
|
||||
if (NeedsStackRealignment) {
|
||||
- // andn %o6, MaxAlign-1, %o6
|
||||
+ int64_t Bias = Subtarget.getStackPointerBias();
|
||||
+ unsigned regUnbiased;
|
||||
+ if (Bias) {
|
||||
+ // This clobbers G1 which we always know is available here.
|
||||
+ regUnbiased = SP::G1;
|
||||
+ // add %o6, BIAS, %g1
|
||||
+ BuildMI(MBB, MBBI, dl, TII.get(SP::ADDri), regUnbiased)
|
||||
+ .addReg(SP::O6).addImm(Bias);
|
||||
+ } else
|
||||
+ regUnbiased = SP::O6;
|
||||
+
|
||||
+ // andn %regUnbiased, MaxAlign-1, %regUnbiased
|
||||
int MaxAlign = MFI.getMaxAlignment();
|
||||
- BuildMI(MBB, MBBI, dl, TII.get(SP::ANDNri), SP::O6).addReg(SP::O6).addImm(MaxAlign - 1);
|
||||
+ BuildMI(MBB, MBBI, dl, TII.get(SP::ANDNri), regUnbiased)
|
||||
+ .addReg(regUnbiased).addImm(MaxAlign - 1);
|
||||
+
|
||||
+ if (Bias) {
|
||||
+ // add %o6, -BIAS, %g1
|
||||
+ BuildMI(MBB, MBBI, dl, TII.get(SP::ADDri), SP::O6)
|
||||
+ .addReg(regUnbiased).addImm(-Bias);
|
||||
+ }
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user