| Index: src/macro-assembler-ia32.cc
|
| ===================================================================
|
| --- src/macro-assembler-ia32.cc (revision 353)
|
| +++ src/macro-assembler-ia32.cc (working copy)
|
| @@ -325,7 +325,7 @@
|
| }
|
|
|
|
|
| -void MacroAssembler::ExitInternalFrame() {
|
| +void MacroAssembler::LeaveInternalFrame() {
|
| if (FLAG_debug_code) {
|
| StackFrame::Type type = StackFrame::INTERNAL;
|
| cmp(Operand(ebp, StandardFrameConstants::kMarkerOffset),
|
| @@ -336,6 +336,58 @@
|
| }
|
|
|
|
|
| +void MacroAssembler::EnterExitFrame(StackFrame::Type type) {
|
| + ASSERT(type == StackFrame::EXIT || type == StackFrame::EXIT_DEBUG);
|
| +
|
| + // Setup the frame structure on the stack.
|
| + ASSERT(ExitFrameConstants::kPPDisplacement == +2 * kPointerSize);
|
| + ASSERT(ExitFrameConstants::kCallerPCOffset == +1 * kPointerSize);
|
| + ASSERT(ExitFrameConstants::kCallerFPOffset == 0 * kPointerSize);
|
| + push(ebp);
|
| + mov(ebp, Operand(esp));
|
| +
|
| + // Reserve room for entry stack pointer and push the debug marker.
|
| + ASSERT(ExitFrameConstants::kSPOffset == -1 * kPointerSize);
|
| + push(Immediate(0)); // saved entry sp, patched before call
|
| + push(Immediate(type == StackFrame::EXIT_DEBUG ? 1 : 0));
|
| +
|
| + // Save the frame pointer and the context in top.
|
| + ExternalReference c_entry_fp_address(Top::k_c_entry_fp_address);
|
| + ExternalReference context_address(Top::k_context_address);
|
| + mov(Operand::StaticVariable(c_entry_fp_address), ebp);
|
| + mov(Operand::StaticVariable(context_address), esi);
|
| +
|
| + // Setup argc and argv in callee-saved registers.
|
| + int offset = StandardFrameConstants::kCallerSPOffset - kPointerSize;
|
| + mov(edi, Operand(eax));
|
| + lea(esi, Operand(ebp, eax, times_4, offset));
|
| +}
|
| +
|
| +
|
| +void MacroAssembler::LeaveExitFrame() {
|
| + // Get the return address from the stack and restore the frame pointer.
|
| + mov(ecx, Operand(ebp, 1 * kPointerSize));
|
| + mov(ebp, Operand(ebp, 0 * kPointerSize));
|
| +
|
| + // Pop the arguments and the receiver from the caller stack.
|
| + lea(esp, Operand(esi, 1 * kPointerSize));
|
| +
|
| + // Restore current context from top and clear it in debug mode.
|
| + ExternalReference context_address(Top::k_context_address);
|
| + mov(esi, Operand::StaticVariable(context_address));
|
| + if (kDebug) {
|
| + mov(Operand::StaticVariable(context_address), Immediate(0));
|
| + }
|
| +
|
| + // Push the return address to get ready to return.
|
| + push(ecx);
|
| +
|
| + // Clear the top frame.
|
| + ExternalReference c_entry_fp_address(Top::k_c_entry_fp_address);
|
| + mov(Operand::StaticVariable(c_entry_fp_address), Immediate(0));
|
| +}
|
| +
|
| +
|
| void MacroAssembler::PushTryHandler(CodeLocation try_location,
|
| HandlerType type) {
|
| ASSERT(StackHandlerConstants::kSize == 6 * kPointerSize); // adjust this code
|
|
|