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