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; |