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 af8e55f504588bd445260339ac25e0facb81091f..f1a6faeb3ba7a068af02822eb916e8bf1bcbd23c 100644 |
| --- a/src/x64/stub-cache-x64.cc |
| +++ b/src/x64/stub-cache-x64.cc |
| @@ -524,9 +524,11 @@ static void GenerateFastApiCall(MacroAssembler* masm, |
| Address thunk_address = FUNCTION_ADDR(&InvokeFunctionCallback); |
| - Operand context_restore_operand(rbp, 2 * kPointerSize); |
| - Operand return_value_operand( |
| - rbp, (kFastApiCallArguments + 1) * kPointerSize); |
| + StackArgumentsAccessor args_from_rbp(rbp, kFastApiCallArguments, |
|
haitao.feng
2013/09/22 09:44:28
Line 527 to 538 needs review.
|
| + ARGUMENTS_DONT_CONTAIN_RECEIVER); |
| + Operand context_restore_operand = args_from_rbp.GetArgumentOperand( |
| + -FunctionCallbackArguments::kContextSaveIndex); |
| + Operand return_value_operand = args_from_rbp.GetArgumentOperand(0); |
| __ CallApiFunctionAndReturn(function_address, |
| thunk_address, |
| callback_arg, |
| @@ -547,25 +549,21 @@ static void GenerateFastApiCall(MacroAssembler* masm, |
| ASSERT(optimization.is_simple_api_call()); |
| ASSERT(!receiver.is(scratch)); |
| - const int stack_space = kFastApiCallArguments + argc + 1; |
| - const int kHolderIndex = kFastApiCallArguments + |
| - FunctionCallbackArguments::kHolderIndex; |
| - // 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, kHolderIndex * kPointerSize), receiver); |
| - // Write receiver to stack frame. |
| - int index = stack_space; |
| - __ movq(Operand(rsp, index-- * kPointerSize), receiver); |
| + __ movq(args.GetArgumentOperand(fast_api_call_argc - 1), 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, true); |
| @@ -1098,8 +1096,6 @@ Register StubCompiler::CheckPrototypes(Handle<JSObject> object, |
| int save_at_depth, |
| Label* miss, |
| PrototypeCheckType check) { |
| - const int kHolderIndex = kFastApiCallArguments + |
| - FunctionCallbackArguments::kHolderIndex; |
| // Make sure that the type feedback oracle harvests the receiver map. |
| // TODO(svenpanne) Remove this hack when all ICs are reworked. |
| __ Move(scratch1, Handle<Map>(object->map())); |
| @@ -1116,8 +1112,11 @@ Register StubCompiler::CheckPrototypes(Handle<JSObject> object, |
| Register reg = object_reg; |
| int depth = 0; |
| + StackArgumentsAccessor args(rsp, kFastApiCallArguments, |
|
haitao.feng
2013/09/22 09:44:28
This needs review.
|
| + ARGUMENTS_DONT_CONTAIN_RECEIVER); |
| if (save_at_depth == depth) { |
| - __ movq(Operand(rsp, kHolderIndex * kPointerSize), object_reg); |
| + __ movq(args.GetArgumentOperand(-FunctionCallbackArguments::kHolderIndex), |
| + object_reg); |
| } |
| // Check the maps in the prototype chain. |
| @@ -1177,7 +1176,8 @@ Register StubCompiler::CheckPrototypes(Handle<JSObject> object, |
| } |
| if (save_at_depth == depth) { |
| - __ movq(Operand(rsp, kHolderIndex * kPointerSize), reg); |
| + __ movq(args.GetArgumentOperand(-FunctionCallbackArguments::kHolderIndex), |
| + reg); |
| } |
| // Go to the next object in the prototype chain. |
| @@ -1395,11 +1395,15 @@ void BaseLoadStubCompiler::GenerateLoadCallback( |
| Address thunk_address = FUNCTION_ADDR(&InvokeAccessorGetterCallback); |
| + // The name handler is counted as an argument. |
|
haitao.feng
2013/09/22 09:44:28
Line 1398 to 1407 need review.
|
| + StackArgumentsAccessor args(rbp, PropertyCallbackArguments::kArgsLength); |
| + Operand return_value_operand = args.GetArgumentOperand( |
| + -PropertyCallbackArguments::kReturnValueOffset); |
| __ CallApiFunctionAndReturn(getter_address, |
| thunk_address, |
| getter_arg, |
| kStackSpace, |
| - Operand(rbp, 6 * kPointerSize), |
| + return_value_operand, |
| NULL); |
| } |
| @@ -2193,7 +2197,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); |
| @@ -2206,7 +2210,7 @@ Handle<Code> CallStubCompiler::CompileStringFromCharCodeCall( |
| // Load the char code argument. |
| Register code = rbx; |
| - __ movq(code, args.GetArgumentOperand(argc)); |
| + __ movq(code, args.GetArgumentOperand(1)); |
| // Check the code is a smi. |
| Label slow; |
| @@ -2256,6 +2260,7 @@ Handle<Code> CallStubCompiler::CompileMathFloorCall( |
| // -- rsp[(argc + 1) * 4] : receiver |
| // ----------------------------------- |
| 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. |
| @@ -2267,7 +2272,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); |
| @@ -2282,7 +2287,7 @@ Handle<Code> CallStubCompiler::CompileMathFloorCall( |
| } |
| // Load the (only) argument into rax. |
| - __ movq(rax, Operand(rsp, 1 * kPointerSize)); |
| + __ movq(rax, args.GetArgumentOperand(1)); |
| // Check if the argument is a smi. |
| Label smi; |
| @@ -2349,7 +2354,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)); |
| __ ret(2 * kPointerSize); |
| // Tail call the full function. We do not have to patch the receiver |
| @@ -2393,7 +2398,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); |
| @@ -2404,7 +2409,7 @@ Handle<Code> CallStubCompiler::CompileMathAbsCall( |
| GenerateLoadFunctionFromCell(cell, function, &miss); |
| } |
| // Load the (only) argument into rax. |
| - __ movq(rax, args.GetArgumentOperand(argc)); |
| + __ movq(rax, args.GetArgumentOperand(1)); |
| // Check if the argument is a smi. |
| Label not_smi; |