mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-14 16:33:28 +00:00
Implement code to keep the stack pointer aligned to an 8 byte boundary.
This improves the performance of the power benchmark by a few percent. This will be neccesary for SSE code, which requires 16 byte alignment of the stack. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@5320 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
eafa423881
commit
f158da2f78
@ -386,7 +386,7 @@ void ISel::LoadArgumentsToVirtualRegs(Function &Fn) {
|
||||
// [ESP + 8] -- second argument, if first argument is four bytes in size
|
||||
// ...
|
||||
//
|
||||
unsigned ArgOffset = 4;
|
||||
unsigned ArgOffset = 0; // Frame mechanisms handle retaddr slot
|
||||
MachineFrameInfo *MFI = F->getFrameInfo();
|
||||
|
||||
for (Function::aiterator I = Fn.abegin(), E = Fn.aend(); I != E; ++I) {
|
||||
|
@ -386,7 +386,7 @@ void ISel::LoadArgumentsToVirtualRegs(Function &Fn) {
|
||||
// [ESP + 8] -- second argument, if first argument is four bytes in size
|
||||
// ...
|
||||
//
|
||||
unsigned ArgOffset = 4;
|
||||
unsigned ArgOffset = 0; // Frame mechanisms handle retaddr slot
|
||||
MachineFrameInfo *MFI = F->getFrameInfo();
|
||||
|
||||
for (Function::aiterator I = Fn.abegin(), E = Fn.aend(); I != E; ++I) {
|
||||
|
@ -13,6 +13,8 @@
|
||||
#include "llvm/CodeGen/MachineInstrBuilder.h"
|
||||
#include "llvm/CodeGen/MachineFunction.h"
|
||||
#include "llvm/CodeGen/MachineFrameInfo.h"
|
||||
#include "llvm/Target/TargetMachine.h"
|
||||
#include "llvm/Target/TargetFrameInfo.h"
|
||||
#include "Support/CommandLine.h"
|
||||
|
||||
namespace {
|
||||
@ -105,6 +107,12 @@ void X86RegisterInfo::eliminateCallFramePseudoInstr(MachineFunction &MF,
|
||||
// <amt>'
|
||||
unsigned Amount = Old->getOperand(0).getImmedValue();
|
||||
if (Amount != 0) {
|
||||
// We need to keep the stack aligned properly. To do this, we round the
|
||||
// amount of space needed for the outgoing arguments up to the next
|
||||
// alignment boundary.
|
||||
unsigned Align = MF.getTarget().getFrameInfo().getStackAlignment();
|
||||
Amount = (Amount+Align-1)/Align*Align;
|
||||
|
||||
if (Old->getOpcode() == X86::ADJCALLSTACKDOWN) {
|
||||
New=BuildMI(X86::SUBri32, 2, X86::ESP).addReg(X86::ESP).addZImm(Amount);
|
||||
} else {
|
||||
@ -191,6 +199,11 @@ void X86RegisterInfo::emitPrologue(MachineFunction &MF) const {
|
||||
//
|
||||
NumBytes += MFI->getMaxCallFrameSize();
|
||||
|
||||
// Round the size to a multiple of the alignment (don't forget the 4 byte
|
||||
// offset though).
|
||||
unsigned Align = MF.getTarget().getFrameInfo().getStackAlignment();
|
||||
NumBytes = ((NumBytes+4)+Align-1)/Align*Align - 4;
|
||||
|
||||
// Update frame info to pretend that this is part of the stack...
|
||||
MFI->setStackSize(NumBytes);
|
||||
}
|
||||
|
@ -37,7 +37,7 @@ X86TargetMachine::X86TargetMachine(unsigned Config)
|
||||
1, 4,
|
||||
(Config & TM::PtrSizeMask) == TM::PtrSize64 ? 8 : 4,
|
||||
(Config & TM::PtrSizeMask) == TM::PtrSize64 ? 8 : 4),
|
||||
FrameInfo(TargetFrameInfo::StackGrowsDown, 1/*16*/, 0) {
|
||||
FrameInfo(TargetFrameInfo::StackGrowsDown, 8/*16 for SSE*/, 4) {
|
||||
}
|
||||
|
||||
/// addPassesToJITCompile - Add passes to the specified pass manager to
|
||||
|
Loading…
x
Reference in New Issue
Block a user