Chromium Code Reviews| Index: src/x64/stub-cache-x64.cc |
| diff --git a/src/x64/stub-cache-x64.cc b/src/x64/stub-cache-x64.cc |
| index 31f60be565e2de24697de08cca2a78ded9ec27c2..b7e564b43273b1546f160f18a95cc5e12266732a 100644 |
| --- a/src/x64/stub-cache-x64.cc |
| +++ b/src/x64/stub-cache-x64.cc |
| @@ -538,23 +538,21 @@ static void GenerateFastApiCall(MacroAssembler* masm, |
| ASSERT(optimization.is_simple_api_call()); |
| ASSERT(!receiver.is(scratch)); |
| - const int stack_space = kFastApiCallArguments + argc + 1; |
| - // Copy return value. |
| - __ movq(scratch, Operand(rsp, 0)); |
| - // Assign stack space for the call arguments. |
| - __ subq(rsp, Immediate(stack_space * kPointerSize)); |
| - // Move the return address on top of the stack. |
| - __ movq(Operand(rsp, 0), scratch); |
| + int fast_api_call_argc = argc + kFastApiCallArguments; |
| + StackArgumentsAccessor args(rsp, fast_api_call_argc); |
| + |
| + __ movq(scratch, StackOperandForReturnAddress(0)); |
| + // Assign stack space for the call arguments and receiver. |
| + __ subq(rsp, Immediate((fast_api_call_argc + 1) * kPointerSize)); |
| + __ movq(StackOperandForReturnAddress(0), scratch); |
| // Write holder to stack frame. |
| - __ movq(Operand(rsp, 1 * kPointerSize), receiver); |
| - // Write receiver to stack frame. |
| - int index = stack_space; |
| - __ movq(Operand(rsp, index-- * kPointerSize), receiver); |
| + __ movq(args.GetArgumentOperand(fast_api_call_argc), receiver); |
| + __ movq(args.GetReceiverOperand(), receiver); |
| // Write the arguments to stack frame. |
| for (int i = 0; i < argc; i++) { |
| ASSERT(!receiver.is(values[i])); |
| ASSERT(!scratch.is(values[i])); |
| - __ movq(Operand(rsp, index-- * kPointerSize), values[i]); |
| + __ movq(args.GetArgumentOperand(i + 1), values[i]); |
| } |
| GenerateFastApiCall(masm, optimization, argc); |
| @@ -2171,7 +2169,7 @@ Handle<Code> CallStubCompiler::CompileStringFromCharCodeCall( |
| GenerateNameCheck(name, &miss); |
| if (cell.is_null()) { |
| - __ movq(rdx, args.GetArgumentOperand(argc - 1)); |
| + __ movq(rdx, args.GetReceiverOperand()); |
| __ JumpIfSmi(rdx, &miss); |
| CheckPrototypes(Handle<JSObject>::cast(object), rdx, holder, rbx, rax, rdi, |
| name, &miss); |
| @@ -2241,6 +2239,7 @@ Handle<Code> CallStubCompiler::CompileMathFloorCall( |
| CpuFeatureScope use_sse2(masm(), SSE2); |
| const int argc = arguments().immediate(); |
| + StackArgumentsAccessor args(rsp, argc); |
| // If the object is not a JSObject or we got an unexpected number of |
| // arguments, bail out to the regular call. |
| @@ -2252,7 +2251,7 @@ Handle<Code> CallStubCompiler::CompileMathFloorCall( |
| GenerateNameCheck(name, &miss); |
| if (cell.is_null()) { |
| - __ movq(rdx, Operand(rsp, 2 * kPointerSize)); |
| + __ movq(rdx, args.GetReceiverOperand()); |
| STATIC_ASSERT(kSmiTag == 0); |
| __ JumpIfSmi(rdx, &miss); |
| @@ -2267,7 +2266,7 @@ Handle<Code> CallStubCompiler::CompileMathFloorCall( |
| } |
| // Load the (only) argument into rax. |
| - __ movq(rax, Operand(rsp, 1 * kPointerSize)); |
| + __ movq(rax, args.GetArgumentOperand(argc)); |
| // Check if the argument is a smi. |
| Label smi; |
| @@ -2334,7 +2333,7 @@ Handle<Code> CallStubCompiler::CompileMathFloorCall( |
| // Return the argument (when it's an already round heap number). |
| __ bind(&already_round); |
| - __ movq(rax, Operand(rsp, 1 * kPointerSize)); |
| + __ movq(rax, args.GetArgumentOperand(argc)); |
|
danno
2013/09/18 12:08:42
1 instead of argc
haitao.feng
2013/09/22 08:16:00
Done.
|
| __ ret(2 * kPointerSize); |
| // Tail call the full function. We do not have to patch the receiver |
| @@ -2378,7 +2377,7 @@ Handle<Code> CallStubCompiler::CompileMathAbsCall( |
| GenerateNameCheck(name, &miss); |
| if (cell.is_null()) { |
| - __ movq(rdx, args.GetArgumentOperand(argc - 1)); |
| + __ movq(rdx, args.GetReceiverOperand()); |
| __ JumpIfSmi(rdx, &miss); |
| CheckPrototypes(Handle<JSObject>::cast(object), rdx, holder, rbx, rax, rdi, |
| name, &miss); |