Chromium Code Reviews| Index: src/IceTargetLoweringX8664.cpp |
| diff --git a/src/IceTargetLoweringX8664.cpp b/src/IceTargetLoweringX8664.cpp |
| index 6844d4adc4359606f99414424b80633d2a9bf478..a9b760ccd76284178d6142ffefa253f65ac9b574 100644 |
| --- a/src/IceTargetLoweringX8664.cpp |
| +++ b/src/IceTargetLoweringX8664.cpp |
| @@ -193,7 +193,7 @@ void TargetX8664::lowerCall(const InstCall *Instr) { |
| ParameterAreaSizeBytes = |
| Traits::applyStackAlignment(ParameterAreaSizeBytes); |
| } |
| - Variable *esp = getPhysicalRegister(Traits::RegisterSet::Reg_esp); |
| + Variable *esp = getPhysicalRegister(Traits::RegisterSet::Reg_rsp); |
| Constant *Loc = Ctx->getConstantInt32(ParameterAreaSizeBytes); |
| StackArgLocations.push_back( |
| Traits::X86OperandMem::create(Func, Ty, esp, Loc)); |
| @@ -276,14 +276,6 @@ void TargetX8664::lowerCall(const InstCall *Instr) { |
| llvm_unreachable("X86-64 Sandboxing codegen not implemented."); |
| } |
| - // Add the appropriate offset to esp. The call instruction takes care of |
| - // resetting the stack offset during emission. |
| - if (ParameterAreaSizeBytes) { |
| - Variable *Esp = |
| - Func->getTarget()->getPhysicalRegister(Traits::RegisterSet::Reg_esp); |
| - _add(Esp, Ctx->getConstantInt32(ParameterAreaSizeBytes)); |
| - } |
| - |
| // Insert a register-kill pseudo instruction. |
| Context.insert<InstFakeKill>(NewCall); |
| @@ -465,12 +457,20 @@ void TargetX8664::addProlog(CfgNode *Node) { |
| // Add push instructions for preserved registers. |
| uint32_t NumCallee = 0; |
| size_t PreservedRegsSizeBytes = 0; |
| + llvm::SmallBitVector Pushed(CalleeSaves.size()); |
| for (SizeT i = 0; i < CalleeSaves.size(); ++i) { |
| - if (CalleeSaves[i] && RegsUsed[i]) { |
| - ++NumCallee; |
| - PreservedRegsSizeBytes += typeWidthInBytes(IceType_i64); |
| - _push(getPhysicalRegister(i)); |
| - } |
| + const SizeT Canonical = Traits::getBaseReg(i); |
| + assert(static_cast<int32_t>(Canonical) == Traits::getBaseReg(Canonical)); |
|
Jim Stichnoth
2015/12/20 19:27:37
I think Canonical can/should be changed to int32_t
John
2015/12/21 13:41:32
Done.
|
| + if (CalleeSaves[i] && RegsUsed[i]) |
| + Pushed[Canonical] = true; |
| + } |
| + for (SizeT i = 0; i < Pushed.size(); ++i) { |
| + if (!Pushed[i]) |
| + continue; |
| + assert(static_cast<int32_t>(i) == Traits::getBaseReg(i)); |
| + ++NumCallee; |
| + PreservedRegsSizeBytes += typeWidthInBytes(IceType_i64); |
| + _push(getPhysicalRegister(i, IceType_i64)); |
| } |
| Ctx->statsUpdateRegistersSaved(NumCallee); |
| @@ -479,8 +479,8 @@ void TargetX8664::addProlog(CfgNode *Node) { |
| assert((RegsUsed & getRegisterSet(RegSet_FramePointer, RegSet_None)) |
| .count() == 0); |
| PreservedRegsSizeBytes += typeWidthInBytes(IceType_i64); |
| - Variable *ebp = getPhysicalRegister(Traits::RegisterSet::Reg_ebp); |
| - Variable *esp = getPhysicalRegister(Traits::RegisterSet::Reg_esp); |
| + Variable *ebp = getPhysicalRegister(Traits::RegisterSet::Reg_rbp); |
| + Variable *esp = getPhysicalRegister(Traits::RegisterSet::Reg_rsp); |
| _push(ebp); |
| _mov(ebp, esp); |
| // Keep ebp live for late-stage liveness analysis (e.g. asm-verbose mode). |
| @@ -521,14 +521,14 @@ void TargetX8664::addProlog(CfgNode *Node) { |
| SpillAreaSizeBytes += FixedAllocaSizeBytes; |
| // Generate "sub esp, SpillAreaSizeBytes" |
| if (SpillAreaSizeBytes) { |
| - _sub(getPhysicalRegister(Traits::RegisterSet::Reg_esp), |
| + _sub(getPhysicalRegister(getStackReg(), IceType_i64), |
| Ctx->getConstantInt32(SpillAreaSizeBytes)); |
| // If the fixed allocas are aligned more than the stack frame, align the |
| // stack pointer accordingly. |
| if (PrologEmitsFixedAllocas && |
| FixedAllocaAlignBytes > Traits::X86_STACK_ALIGNMENT_BYTES) { |
| assert(IsEbpBasedFrame); |
| - _and(getPhysicalRegister(Traits::RegisterSet::Reg_esp), |
| + _and(getPhysicalRegister(Traits::RegisterSet::Reg_rsp), |
| Ctx->getConstantInt32(-FixedAllocaAlignBytes)); |
| } |
| } |
| @@ -637,9 +637,9 @@ void TargetX8664::addEpilog(CfgNode *Node) { |
| Context.init(Node); |
| Context.setInsertPoint(InsertPoint); |
| - Variable *esp = getPhysicalRegister(Traits::RegisterSet::Reg_esp); |
| + Variable *esp = getPhysicalRegister(Traits::RegisterSet::Reg_rsp); |
| if (IsEbpBasedFrame) { |
| - Variable *ebp = getPhysicalRegister(Traits::RegisterSet::Reg_ebp); |
| + Variable *ebp = getPhysicalRegister(Traits::RegisterSet::Reg_rbp); |
| // For late-stage liveness analysis (e.g. asm-verbose mode), adding a fake |
| // use of esp before the assignment of esp=ebp keeps previous esp |
| // adjustments from being dead-code eliminated. |
| @@ -655,13 +655,19 @@ void TargetX8664::addEpilog(CfgNode *Node) { |
| // Add pop instructions for preserved registers. |
| llvm::SmallBitVector CalleeSaves = |
| getRegisterSet(RegSet_CalleeSave, RegSet_None); |
| - for (SizeT i = 0; i < CalleeSaves.size(); ++i) { |
| - SizeT j = CalleeSaves.size() - i - 1; |
| - if (j == Traits::RegisterSet::Reg_ebp && IsEbpBasedFrame) |
| + llvm::SmallBitVector Popped(CalleeSaves.size()); |
| + for (int32_t i = CalleeSaves.size() - 1; i >= 0; --i) { |
| + if (i == Traits::RegisterSet::Reg_rbp && IsEbpBasedFrame) |
| continue; |
| - if (CalleeSaves[j] && RegsUsed[j]) { |
| - _pop(getPhysicalRegister(j)); |
| - } |
| + const SizeT Canonical = Traits::getBaseReg(i); |
| + if (CalleeSaves[i] && RegsUsed[i]) |
| + Popped[Canonical] = true; |
| + } |
| + for (int32_t i = Popped.size() - 1; i >= 0; --i) { |
| + if (!Popped[i]) |
| + continue; |
| + assert(i == Traits::getBaseReg(i)); |
| + _pop(getPhysicalRegister(i, IceType_i64)); |
| } |
| if (Ctx->getFlags().getUseSandboxing()) { |