diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Target/X86/README.txt | 45 | ||||
-rw-r--r-- | lib/Target/X86/X86RegisterInfo.cpp | 15 | ||||
-rw-r--r-- | lib/Target/X86/X86RegisterInfo.h | 2 |
3 files changed, 12 insertions, 50 deletions
diff --git a/lib/Target/X86/README.txt b/lib/Target/X86/README.txt index f15090a..d70e90a 100644 --- a/lib/Target/X86/README.txt +++ b/lib/Target/X86/README.txt @@ -1040,51 +1040,6 @@ int %test2(int %X) { //===---------------------------------------------------------------------===// -We use push/pop of stack space around calls in situations where we don't have to. -Call to f below produces: - subl $16, %esp <<<<< - movl %eax, (%esp) - call L_f$stub - addl $16, %esp <<<<< -The stack push/pop can be moved into the prolog/epilog. It does this because it's -building the frame pointer, but this should not be sufficient, only the use of alloca -should cause it to do this. -(There are other issues shown by this code, but this is one.) - -typedef struct _range_t { - float fbias; - float fscale; - int ibias; - int iscale; - int ishift; - unsigned char lut[]; -} range_t; - -struct _decode_t { - int type:4; - int unit:4; - int alpha:8; - int N:8; - int bpc:8; - int bpp:16; - int skip:8; - int swap:8; - const range_t*const*range; -}; - -typedef struct _decode_t decode_t; - -extern int f(const decode_t* decode); - -int decode_byte (const decode_t* decode) { - if (decode->swap != 0) - return f(decode); - return 0; -} - - -//===---------------------------------------------------------------------===// - This: #include <xmmintrin.h> unsigned test(float f) { diff --git a/lib/Target/X86/X86RegisterInfo.cpp b/lib/Target/X86/X86RegisterInfo.cpp index b64d864..dd6cf36 100644 --- a/lib/Target/X86/X86RegisterInfo.cpp +++ b/lib/Target/X86/X86RegisterInfo.cpp @@ -1022,18 +1022,23 @@ bool X86RegisterInfo::hasFP(const MachineFunction &MF) const { MachineModuleInfo *MMI = MFI->getMachineModuleInfo(); return (NoFramePointerElim || - MF.getFrameInfo()->hasVarSizedObjects() || + MFI->hasVarSizedObjects() || MF.getInfo<X86MachineFunctionInfo>()->getForceFramePointer() || (MMI && MMI->callsUnwindInit())); } +bool X86RegisterInfo::hasReservedCallFrame(MachineFunction &MF) const { + return !MF.getFrameInfo()->hasVarSizedObjects(); +} + void X86RegisterInfo:: eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB, MachineBasicBlock::iterator I) const { - if (hasFP(MF)) { - // If we have a frame pointer, turn the adjcallstackup instruction into a - // 'sub ESP, <amt>' and the adjcallstackdown instruction into 'add ESP, - // <amt>' + if (!hasReservedCallFrame(MF)) { + // If the stack pointer can be changed after prologue, turn the + // adjcallstackup instruction into a 'sub ESP, <amt>' and the + // adjcallstackdown instruction into 'add ESP, <amt>' + // TODO: consider using push / pop instead of sub + store / add MachineInstr *Old = I; uint64_t Amount = Old->getOperand(0).getImm(); if (Amount != 0) { diff --git a/lib/Target/X86/X86RegisterInfo.h b/lib/Target/X86/X86RegisterInfo.h index ab9e33f..0ec9a06 100644 --- a/lib/Target/X86/X86RegisterInfo.h +++ b/lib/Target/X86/X86RegisterInfo.h @@ -98,6 +98,8 @@ public: bool hasFP(const MachineFunction &MF) const; + bool hasReservedCallFrame(MachineFunction &MF) const; + void eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB, MachineBasicBlock::iterator MI) const; |