Chromium Code Reviews| Index: runtime/vm/assembler_x64.cc |
| diff --git a/runtime/vm/assembler_x64.cc b/runtime/vm/assembler_x64.cc |
| index ccc142f41aa907c621872d41a70dd0aaa33f7047..1d4914e09873747724e398a59bab030850e5409e 100644 |
| --- a/runtime/vm/assembler_x64.cc |
| +++ b/runtime/vm/assembler_x64.cc |
| @@ -1674,7 +1674,9 @@ void Assembler::ReserveAlignedFrameSpace(intptr_t frame_space) { |
| } |
| -void Assembler::PreserveCallerSavedRegisters() { |
| +void Assembler::EnterCallRuntimeFrame(intptr_t frame_space) { |
| + enter(Immediate(0)); |
| + // Preserve volatile registers. |
|
siva
2012/07/27 20:41:21
ASSERT(kNumberOfVolatileRegisters == 9);
|
| // Based on http://x86-64.org/documentation/abi.pdf Fig. 3.4 |
| pushq(RAX); |
| pushq(RCX); |
| @@ -1686,12 +1688,20 @@ void Assembler::PreserveCallerSavedRegisters() { |
| pushq(R10); |
| pushq(R11); |
| // TODO(srdjan): Add XMM registers once they are used by the compiler. |
| + |
| + ReserveAlignedFrameSpace(frame_space); |
| } |
| -void Assembler::RestoreCallerSavedRegisters() { |
| +void Assembler::LeaveCallRuntimeFrame() { |
| + // RSP might have been modified to reserve space for arguments |
| + // and ensure proper alignment of the stack frame. |
| + // We need to restore it before restoring registers. |
| + const intptr_t kNumberOfVolatileRegisters = 9; |
|
siva
2012/07/27 20:41:21
ditto comment regarding kNumberOfVolatileRegisters
|
| + leaq(RSP, Address(RBP, -kNumberOfVolatileRegisters * kWordSize)); |
| + |
| + // Restore volatile registers. |
| // Based on http://x86-64.org/documentation/abi.pdf Fig. 3.4 |
| - // TODO(srdjan): Add XMM registers once they are used by the compiler. |
| popq(R11); |
| popq(R10); |
| popq(R9); |
| @@ -1701,6 +1711,7 @@ void Assembler::RestoreCallerSavedRegisters() { |
| popq(RDX); |
| popq(RCX); |
| popq(RAX); |
|
siva
2012/07/27 20:41:21
ditto comment regarding kNumberOfVolatileRegisters
|
| + leave(); |
| } |