Chromium Code Reviews| Index: src/x64/codegen-x64.cc |
| diff --git a/src/x64/codegen-x64.cc b/src/x64/codegen-x64.cc |
| index 8d313c951cb45678bb106962a31fdd33535c5343..c5f023c840ef689d9de36f4d6f9dbf8208318659 100644 |
| --- a/src/x64/codegen-x64.cc |
| +++ b/src/x64/codegen-x64.cc |
| @@ -6829,7 +6829,8 @@ void ArgumentsAccessStub::GenerateNewObject(MacroAssembler* masm) { |
| // Do the runtime call to allocate the arguments object. |
| __ bind(&runtime); |
| - __ TailCallRuntime(ExternalReference(Runtime::kNewArgumentsFast), 3); |
| + Runtime::Function* f = Runtime::FunctionForId(Runtime::kNewArgumentsFast); |
| + __ TailCallRuntime(ExternalReference(f), 3, f->result_size); |
| } |
| @@ -6891,7 +6892,9 @@ void ArgumentsAccessStub::GenerateReadElement(MacroAssembler* masm) { |
| __ pop(rbx); // Return address. |
| __ push(rdx); |
| __ push(rbx); |
| - __ TailCallRuntime(ExternalReference(Runtime::kGetArgumentsProperty), 1); |
| + Runtime::Function* f = |
| + Runtime::FunctionForId(Runtime::kGetArgumentsProperty); |
| + __ TailCallRuntime(ExternalReference(f), 1, f->result_size); |
| } |
| @@ -6915,6 +6918,19 @@ void ArgumentsAccessStub::GenerateReadLength(MacroAssembler* masm) { |
| } |
| +int CEntryStub::MinorKey() { |
| + ASSERT(result_size_ <= 2); |
| +#ifdef _WIN64 |
| + // Simple results returned in rax. |
| + // Complex results must be written to address passed as first argument. |
| + return (result_size_ < 2) ? 0 : result_size_ * 2; |
|
William Hesse
2009/09/07 14:34:18
Why is the key 4 if the size is 2, and 0 if it is
Lasse Reichstein
2009/09/08 11:51:35
Previously, minor key 0 was used for CEntryStub an
|
| +#else |
| + // Results returned in rax or in rax+rdx by default. |
|
Søren Thygesen Gjesse
2009/09/07 12:22:33
Maybe add something about this being compiler spec
Lasse Reichstein
2009/09/08 11:51:35
I'll say something.
It's calling convention specif
|
| + return 0; |
| +#endif |
| +} |
| + |
| + |
| void CEntryStub::GenerateThrowTOS(MacroAssembler* masm) { |
| // Check that stack should contain next handler, frame pointer, state and |
| // return address in that order. |
| @@ -6986,8 +7002,18 @@ void CEntryStub::GenerateCore(MacroAssembler* masm, |
| // Store Arguments object on stack, below the 4 WIN64 ABI parameter slots. |
| __ movq(Operand(rsp, 4 * kPointerSize), r14); // argc. |
| __ movq(Operand(rsp, 5 * kPointerSize), r15); // argv. |
| - // Pass a pointer to the Arguments object as the first argument. |
| - __ lea(rcx, Operand(rsp, 4 * kPointerSize)); |
| + if (result_size_ < 2) { |
|
Søren Thygesen Gjesse
2009/09/07 12:22:33
Why not == 1? We only have 1 and 2 right?
Lasse Reichstein
2009/09/08 11:51:35
I was expecting 0 to be allowed too (for a functio
|
| + // Pass a pointer to the Arguments object as the first argument. |
| + // Return result in single register (rax). |
| + __ lea(rcx, Operand(rsp, 4 * kPointerSize)); |
| + } else { |
| + ASSERT_EQ(2, result_size_); |
| + // Pass a pointer to the result location as the first argument. |
| + __ lea(rcx, Operand(rsp, 6 * kPointerSize)); |
| + // Pass a pointer to the Arguments object as the second argument. |
| + __ lea(rdx, Operand(rsp, 4 * kPointerSize)); |
| + } |
| + |
| #else // ! defined(_WIN64) |
| // GCC passes arguments in rdi, rsi, rdx, rcx, r8, r9. |
| __ movq(rdi, r14); // argc. |
| @@ -7010,7 +7036,7 @@ void CEntryStub::GenerateCore(MacroAssembler* masm, |
| __ j(zero, &failure_returned); |
| // Exit the JavaScript to C++ exit frame. |
| - __ LeaveExitFrame(frame_type); |
| + __ LeaveExitFrame(frame_type, result_size_); |
| __ ret(0); |
| // Handling of failure. |
| @@ -7146,7 +7172,7 @@ void CEntryStub::GenerateBody(MacroAssembler* masm, bool is_debug_break) { |
| StackFrame::EXIT; |
| // Enter the exit frame that transitions from JavaScript to C++. |
| - __ EnterExitFrame(frame_type); |
| + __ EnterExitFrame(frame_type, result_size_); |
| // rax: Holds the context at this point, but should not be used. |
| // On entry to code generated by GenerateCore, it must hold |
| @@ -7333,7 +7359,8 @@ void StackCheckStub::Generate(MacroAssembler* masm) { |
| __ push(rax); |
| // Do tail-call to runtime routine. |
| - __ TailCallRuntime(ExternalReference(Runtime::kStackGuard), 1); |
| + Runtime::Function* f = Runtime::FunctionForId(Runtime::kStackGuard); |
| + __ TailCallRuntime(ExternalReference(f), 1, f->result_size); |
| } |