| Index: src/x64/ic-x64.cc
|
| diff --git a/src/x64/ic-x64.cc b/src/x64/ic-x64.cc
|
| index f26b234fed68c324b451c934cb50d568588e9aba..c23f361ea6c0a92c67558e179670072983db9c62 100644
|
| --- a/src/x64/ic-x64.cc
|
| +++ b/src/x64/ic-x64.cc
|
| @@ -870,14 +870,14 @@ static void GenerateFunctionTailCall(MacroAssembler* masm,
|
| int argc,
|
| Label* miss) {
|
| // ----------- S t a t e -------------
|
| - // rcx : function name
|
| - // rdi : function
|
| - // rsp[0] : return address
|
| - // rsp[8] : argument argc
|
| - // rsp[16] : argument argc - 1
|
| + // rcx : function name
|
| + // rdi : function
|
| + // rsp[0] : return address
|
| + // rsp[8] : argument argc
|
| + // rsp[16] : argument argc - 1
|
| // ...
|
| - // rsp[argc * 8] : argument 1
|
| - // rsp[(argc + 1) * 8] : argument 0 = receiver
|
| + // rsp[argc * 8] : argument 1
|
| + // rsp[argc * 8 + kPCOnStackSize] : argument 0 = receiver
|
| // -----------------------------------
|
| __ JumpIfSmi(rdi, miss);
|
| // Check that the value is a JavaScript function.
|
| @@ -894,18 +894,18 @@ static void GenerateFunctionTailCall(MacroAssembler* masm,
|
| // The generated code falls through if the call should be handled by runtime.
|
| void CallICBase::GenerateNormal(MacroAssembler* masm, int argc) {
|
| // ----------- S t a t e -------------
|
| - // rcx : function name
|
| - // rsp[0] : return address
|
| - // rsp[8] : argument argc
|
| - // rsp[16] : argument argc - 1
|
| + // rcx : function name
|
| + // rsp[0] : return address
|
| + // rsp[8] : argument argc
|
| + // rsp[16] : argument argc - 1
|
| // ...
|
| - // rsp[argc * 8] : argument 1
|
| - // rsp[(argc + 1) * 8] : argument 0 = receiver
|
| + // rsp[argc * 8] : argument 1
|
| + // rsp[argc * 8 + kPCOnStackSize] : argument 0 = receiver
|
| // -----------------------------------
|
| Label miss;
|
|
|
| // Get the receiver of the function from the stack.
|
| - __ movq(rdx, Operand(rsp, (argc + 1) * kPointerSize));
|
| + __ movq(rdx, Operand(rsp, kPCOnStackSize + argc * kPointerSize));
|
|
|
| GenerateNameDictionaryReceiverCheck(masm, rdx, rax, rbx, &miss);
|
|
|
| @@ -924,13 +924,13 @@ void CallICBase::GenerateMiss(MacroAssembler* masm,
|
| IC::UtilityId id,
|
| Code::ExtraICState extra_state) {
|
| // ----------- S t a t e -------------
|
| - // rcx : function name
|
| - // rsp[0] : return address
|
| - // rsp[8] : argument argc
|
| - // rsp[16] : argument argc - 1
|
| + // rcx : function name
|
| + // rsp[0] : return address
|
| + // rsp[8] : argument argc
|
| + // rsp[16] : argument argc - 1
|
| // ...
|
| - // rsp[argc * 8] : argument 1
|
| - // rsp[(argc + 1) * 8] : argument 0 = receiver
|
| + // rsp[argc * 8] : argument 1
|
| + // rsp[argc * 8 + kPCOnStackSize] : argument 0 = receiver
|
| // -----------------------------------
|
|
|
| Counters* counters = masm->isolate()->counters();
|
| @@ -941,7 +941,7 @@ void CallICBase::GenerateMiss(MacroAssembler* masm,
|
| }
|
|
|
| // Get the receiver of the function from the stack; 1 ~ return address.
|
| - __ movq(rdx, Operand(rsp, (argc + 1) * kPointerSize));
|
| + __ movq(rdx, Operand(rsp, kPCOnStackSize + argc * kPointerSize));
|
|
|
| // Enter an internal frame.
|
| {
|
| @@ -965,7 +965,8 @@ void CallICBase::GenerateMiss(MacroAssembler* masm,
|
| // This can happen only for regular CallIC but not KeyedCallIC.
|
| if (id == IC::kCallIC_Miss) {
|
| Label invoke, global;
|
| - __ movq(rdx, Operand(rsp, (argc + 1) * kPointerSize)); // receiver
|
| + // receiver
|
| + __ movq(rdx, Operand(rsp, kPCOnStackSize + argc * kPointerSize));
|
| __ JumpIfSmi(rdx, &invoke);
|
| __ CmpObjectType(rdx, JS_GLOBAL_OBJECT_TYPE, rcx);
|
| __ j(equal, &global);
|
| @@ -975,7 +976,7 @@ void CallICBase::GenerateMiss(MacroAssembler* masm,
|
| // Patch the receiver on the stack.
|
| __ bind(&global);
|
| __ movq(rdx, FieldOperand(rdx, GlobalObject::kGlobalReceiverOffset));
|
| - __ movq(Operand(rsp, (argc + 1) * kPointerSize), rdx);
|
| + __ movq(Operand(rsp, kPCOnStackSize + argc * kPointerSize), rdx);
|
| __ bind(&invoke);
|
| }
|
|
|
| @@ -996,17 +997,17 @@ void CallIC::GenerateMegamorphic(MacroAssembler* masm,
|
| int argc,
|
| Code::ExtraICState extra_ic_state) {
|
| // ----------- S t a t e -------------
|
| - // rcx : function name
|
| - // rsp[0] : return address
|
| - // rsp[8] : argument argc
|
| - // rsp[16] : argument argc - 1
|
| + // rcx : function name
|
| + // rsp[0] : return address
|
| + // rsp[8] : argument argc
|
| + // rsp[16] : argument argc - 1
|
| // ...
|
| - // rsp[argc * 8] : argument 1
|
| - // rsp[(argc + 1) * 8] : argument 0 = receiver
|
| + // rsp[argc * 8] : argument 1
|
| + // rsp[argc * 8 + kPCOnStackSize] : argument 0 = receiver
|
| // -----------------------------------
|
|
|
| // Get the receiver of the function from the stack; 1 ~ return address.
|
| - __ movq(rdx, Operand(rsp, (argc + 1) * kPointerSize));
|
| + __ movq(rdx, Operand(rsp, kPCOnStackSize + argc * kPointerSize));
|
| GenerateMonomorphicCacheProbe(masm, argc, Code::CALL_IC, extra_ic_state);
|
| GenerateMiss(masm, argc, extra_ic_state);
|
| }
|
| @@ -1014,17 +1015,17 @@ void CallIC::GenerateMegamorphic(MacroAssembler* masm,
|
|
|
| void KeyedCallIC::GenerateMegamorphic(MacroAssembler* masm, int argc) {
|
| // ----------- S t a t e -------------
|
| - // rcx : function name
|
| - // rsp[0] : return address
|
| - // rsp[8] : argument argc
|
| - // rsp[16] : argument argc - 1
|
| + // rcx : function name
|
| + // rsp[0] : return address
|
| + // rsp[8] : argument argc
|
| + // rsp[16] : argument argc - 1
|
| // ...
|
| - // rsp[argc * 8] : argument 1
|
| - // rsp[(argc + 1) * 8] : argument 0 = receiver
|
| + // rsp[argc * 8] : argument 1
|
| + // rsp[argc * 8 + kPCOnStackSize] : argument 0 = receiver
|
| // -----------------------------------
|
|
|
| // Get the receiver of the function from the stack; 1 ~ return address.
|
| - __ movq(rdx, Operand(rsp, (argc + 1) * kPointerSize));
|
| + __ movq(rdx, Operand(rsp, kPCOnStackSize + argc * kPointerSize));
|
|
|
| Label do_call, slow_call, slow_load;
|
| Label check_number_dictionary, check_name, lookup_monomorphic_cache;
|
| @@ -1125,13 +1126,13 @@ void KeyedCallIC::GenerateMegamorphic(MacroAssembler* masm, int argc) {
|
|
|
| void KeyedCallIC::GenerateNormal(MacroAssembler* masm, int argc) {
|
| // ----------- S t a t e -------------
|
| - // rcx : function name
|
| - // rsp[0] : return address
|
| - // rsp[8] : argument argc
|
| - // rsp[16] : argument argc - 1
|
| + // rcx : function name
|
| + // rsp[0] : return address
|
| + // rsp[8] : argument argc
|
| + // rsp[16] : argument argc - 1
|
| // ...
|
| - // rsp[argc * 8] : argument 1
|
| - // rsp[(argc + 1) * 8] : argument 0 = receiver
|
| + // rsp[argc * 8] : argument 1
|
| + // rsp[argc * 8 + kPCOnStackSize] : argument 0 = receiver
|
| // -----------------------------------
|
|
|
| // Check if the name is really a name.
|
| @@ -1293,16 +1294,16 @@ void KeyedStoreIC::GenerateNonStrictArguments(MacroAssembler* masm) {
|
| void KeyedCallIC::GenerateNonStrictArguments(MacroAssembler* masm,
|
| int argc) {
|
| // ----------- S t a t e -------------
|
| - // rcx : function name
|
| - // rsp[0] : return address
|
| - // rsp[8] : argument argc
|
| - // rsp[16] : argument argc - 1
|
| + // rcx : function name
|
| + // rsp[0] : return address
|
| + // rsp[8] : argument argc
|
| + // rsp[16] : argument argc - 1
|
| // ...
|
| - // rsp[argc * 8] : argument 1
|
| - // rsp[(argc + 1) * 8] : argument 0 = receiver
|
| + // rsp[argc * 8] : argument 1
|
| + // rsp[argc * 8 + kPCOnStackSize] : argument 0 = receiver
|
| // -----------------------------------
|
| Label slow, notin;
|
| - __ movq(rdx, Operand(rsp, (argc + 1) * kPointerSize));
|
| + __ movq(rdx, Operand(rsp, kPCOnStackSize + argc * kPointerSize));
|
| Operand mapped_location = GenerateMappedArgumentsLookup(
|
| masm, rdx, rcx, rbx, rax, r8, ¬in, &slow);
|
| __ movq(rdi, mapped_location);
|
|
|