| Index: src/x64/macro-assembler-x64.cc
|
| ===================================================================
|
| --- src/x64/macro-assembler-x64.cc (revision 5834)
|
| +++ src/x64/macro-assembler-x64.cc (working copy)
|
| @@ -498,23 +498,22 @@
|
| }
|
|
|
|
|
| -void MacroAssembler::PrepareCallApiFunction(int stack_space,
|
| - int arg_stack_space) {
|
| +void MacroAssembler::PrepareCallApiFunction(int arg_stack_space) {
|
| #ifdef _WIN64
|
| // We need to prepare a slot for result handle on stack and put
|
| // a pointer to it into 1st arg register.
|
| - EnterApiExitFrame(stack_space, arg_stack_space + 1);
|
| + EnterApiExitFrame(arg_stack_space + 1);
|
|
|
| // rcx must be used to pass the pointer to the return value slot.
|
| lea(rcx, StackSpaceOperand(arg_stack_space));
|
| #else
|
| - EnterApiExitFrame(stack_space, arg_stack_space);
|
| + EnterApiExitFrame(arg_stack_space);
|
| #endif
|
| }
|
|
|
|
|
| MaybeObject* MacroAssembler::TryCallApiFunctionAndReturn(
|
| - ApiFunction* function) {
|
| + ApiFunction* function, int stack_space) {
|
| Label empty_result;
|
| Label prologue;
|
| Label promote_scheduled_exception;
|
| @@ -537,7 +536,7 @@
|
| // Allocate HandleScope in callee-save registers.
|
| Register prev_next_address_reg = r14;
|
| Register prev_limit_reg = rbx;
|
| - Register base_reg = kSmiConstantRegister;
|
| + Register base_reg = r12;
|
| movq(base_reg, next_address);
|
| movq(prev_next_address_reg, Operand(base_reg, kNextOffset));
|
| movq(prev_limit_reg, Operand(base_reg, kLimitOffset));
|
| @@ -566,15 +565,14 @@
|
| cmpq(prev_limit_reg, Operand(base_reg, kLimitOffset));
|
| j(not_equal, &delete_allocated_handles);
|
| bind(&leave_exit_frame);
|
| - InitializeSmiConstantRegister();
|
|
|
| // Check if the function scheduled an exception.
|
| movq(rsi, scheduled_exception_address);
|
| Cmp(Operand(rsi, 0), Factory::the_hole_value());
|
| j(not_equal, &promote_scheduled_exception);
|
|
|
| - LeaveExitFrame();
|
| - ret(0);
|
| + LeaveApiExitFrame();
|
| + ret(stack_space * kPointerSize);
|
|
|
| bind(&promote_scheduled_exception);
|
| MaybeObject* result = TryTailCallRuntime(Runtime::kPromoteScheduledException,
|
| @@ -1778,20 +1776,13 @@
|
| }
|
|
|
|
|
| -void MacroAssembler::EnterApiExitFrame(int stack_space,
|
| - int arg_stack_space) {
|
| +void MacroAssembler::EnterApiExitFrame(int arg_stack_space) {
|
| EnterExitFramePrologue(false);
|
| -
|
| - // Setup argv in callee-saved register r12. It is reused in LeaveExitFrame,
|
| - // so it must be retained across the C-call.
|
| - int offset = StandardFrameConstants::kCallerSPOffset - kPointerSize;
|
| - lea(r12, Operand(rbp, (stack_space * kPointerSize) + offset));
|
| -
|
| EnterExitFrameEpilogue(arg_stack_space);
|
| }
|
|
|
|
|
| -void MacroAssembler::LeaveExitFrame(int result_size) {
|
| +void MacroAssembler::LeaveExitFrame() {
|
| // Registers:
|
| // r12 : argv
|
|
|
| @@ -1803,6 +1794,22 @@
|
| // from the caller stack.
|
| lea(rsp, Operand(r12, 1 * kPointerSize));
|
|
|
| + // Push the return address to get ready to return.
|
| + push(rcx);
|
| +
|
| + LeaveExitFrameEpilogue();
|
| +}
|
| +
|
| +
|
| +void MacroAssembler::LeaveApiExitFrame() {
|
| + movq(rsp, rbp);
|
| + pop(rbp);
|
| +
|
| + LeaveExitFrameEpilogue();
|
| +}
|
| +
|
| +
|
| +void MacroAssembler::LeaveExitFrameEpilogue() {
|
| // Restore current context from top and clear it in debug mode.
|
| ExternalReference context_address(Top::k_context_address);
|
| movq(kScratchRegister, context_address);
|
| @@ -1811,9 +1818,6 @@
|
| movq(Operand(kScratchRegister, 0), Immediate(0));
|
| #endif
|
|
|
| - // Push the return address to get ready to return.
|
| - push(rcx);
|
| -
|
| // Clear the top frame.
|
| ExternalReference c_entry_fp_address(Top::k_c_entry_fp_address);
|
| movq(kScratchRegister, c_entry_fp_address);
|
|
|