Index: src/x64/macro-assembler-x64.cc |
diff --git a/src/x64/macro-assembler-x64.cc b/src/x64/macro-assembler-x64.cc |
index 2fb0f74b0b5bbd833089c4b659425473012a05ba..69abc5454f0eea0a4287ed0ca1bca3844e7049da 100644 |
--- a/src/x64/macro-assembler-x64.cc |
+++ b/src/x64/macro-assembler-x64.cc |
@@ -691,16 +691,13 @@ void MacroAssembler::PrepareCallApiFunction(int arg_stack_space) { |
} |
-void MacroAssembler::CallApiFunctionAndReturn( |
- Address function_address, |
- Address thunk_address, |
- Register thunk_last_arg, |
- int stack_space, |
- Operand return_value_operand, |
- Operand* context_restore_operand) { |
+void MacroAssembler::CallApiFunctionAndReturn(Address function_address, |
+ Address thunk_address, |
+ Register thunk_last_arg, |
+ int stack_space, |
+ int return_value_offset) { |
Label prologue; |
Label promote_scheduled_exception; |
- Label exception_handled; |
Label delete_allocated_handles; |
Label leave_exit_frame; |
Label write_back; |
@@ -771,7 +768,7 @@ void MacroAssembler::CallApiFunctionAndReturn( |
} |
// Load the value from ReturnValue |
- movq(rax, return_value_operand); |
+ movq(rax, Operand(rbp, return_value_offset * kPointerSize)); |
bind(&prologue); |
// No more valid handles (the result handle was the last one). Restore |
@@ -786,7 +783,6 @@ void MacroAssembler::CallApiFunctionAndReturn( |
movq(rsi, scheduled_exception_address); |
Cmp(Operand(rsi, 0), factory->the_hole_value()); |
j(not_equal, &promote_scheduled_exception); |
- bind(&exception_handled); |
#if ENABLE_EXTRA_CHECKS |
// Check if the function returned a valid JavaScript value. |
@@ -823,19 +819,11 @@ void MacroAssembler::CallApiFunctionAndReturn( |
bind(&ok); |
#endif |
- bool restore_context = context_restore_operand != NULL; |
- if (restore_context) { |
- movq(rsi, *context_restore_operand); |
- } |
- LeaveApiExitFrame(!restore_context); |
+ LeaveApiExitFrame(); |
ret(stack_space * kPointerSize); |
bind(&promote_scheduled_exception); |
- { |
- FrameScope frame(this, StackFrame::INTERNAL); |
- CallRuntime(Runtime::kPromoteScheduledException, 0); |
- } |
- jmp(&exception_handled); |
+ TailCallRuntime(Runtime::kPromoteScheduledException, 0, 1); |
// HandleScope limit has changed. Delete allocated extensions. |
bind(&delete_allocated_handles); |
@@ -948,18 +936,6 @@ void MacroAssembler::PopCallerSaved(SaveFPRegsMode fp_mode, |
} |
-void MacroAssembler::Cvtlsi2sd(XMMRegister dst, Register src) { |
- xorps(dst, dst); |
- cvtlsi2sd(dst, src); |
-} |
- |
- |
-void MacroAssembler::Cvtlsi2sd(XMMRegister dst, const Operand& src) { |
- xorps(dst, dst); |
- cvtlsi2sd(dst, src); |
-} |
- |
- |
void MacroAssembler::Set(Register dst, int64_t x) { |
if (x == 0) { |
xorl(dst, dst); |
@@ -2941,7 +2917,7 @@ void MacroAssembler::StoreNumberToDoubleElements( |
// Value is a smi. convert to a double and store. |
// Preserve original value. |
SmiToInteger32(kScratchRegister, maybe_number); |
- Cvtlsi2sd(xmm_scratch, kScratchRegister); |
+ cvtlsi2sd(xmm_scratch, kScratchRegister); |
movsd(FieldOperand(elements, index, times_8, |
FixedDoubleArray::kHeaderSize - elements_offset), |
xmm_scratch); |
@@ -3074,7 +3050,7 @@ void MacroAssembler::DoubleToI(Register result_reg, |
Label* conversion_failed, |
Label::Distance dst) { |
cvttsd2si(result_reg, input_reg); |
- Cvtlsi2sd(xmm0, result_reg); |
+ cvtlsi2sd(xmm0, result_reg); |
ucomisd(xmm0, input_reg); |
j(not_equal, conversion_failed, dst); |
j(parity_even, conversion_failed, dst); // NaN. |
@@ -3111,7 +3087,7 @@ void MacroAssembler::TaggedToI(Register result_reg, |
movsd(xmm0, FieldOperand(input_reg, HeapNumber::kValueOffset)); |
cvttsd2si(result_reg, xmm0); |
- Cvtlsi2sd(temp, result_reg); |
+ cvtlsi2sd(temp, result_reg); |
ucomisd(xmm0, temp); |
RecordComment("Deferred TaggedToI: lost precision"); |
j(not_equal, lost_precision, dst); |
@@ -3707,25 +3683,23 @@ void MacroAssembler::LeaveExitFrame(bool save_doubles) { |
PushReturnAddressFrom(rcx); |
- LeaveExitFrameEpilogue(true); |
+ LeaveExitFrameEpilogue(); |
} |
-void MacroAssembler::LeaveApiExitFrame(bool restore_context) { |
+void MacroAssembler::LeaveApiExitFrame() { |
movq(rsp, rbp); |
pop(rbp); |
- LeaveExitFrameEpilogue(restore_context); |
+ LeaveExitFrameEpilogue(); |
} |
-void MacroAssembler::LeaveExitFrameEpilogue(bool restore_context) { |
+void MacroAssembler::LeaveExitFrameEpilogue() { |
// Restore current context from top and clear it in debug mode. |
ExternalReference context_address(Isolate::kContextAddress, isolate()); |
Operand context_operand = ExternalOperand(context_address); |
- if (restore_context) { |
- movq(rsi, context_operand); |
- } |
+ movq(rsi, context_operand); |
#ifdef DEBUG |
movq(context_operand, Immediate(0)); |
#endif |