| Index: src/x64/ic-x64.cc
|
| diff --git a/src/x64/ic-x64.cc b/src/x64/ic-x64.cc
|
| index f05e6a2479ee21befc8c8d241912e975ab8dd0e0..8f4f9f98b5d4e1c15cccb528b7b6a427401900b8 100644
|
| --- a/src/x64/ic-x64.cc
|
| +++ b/src/x64/ic-x64.cc
|
| @@ -813,7 +813,8 @@ void KeyedStoreIC::GenerateGeneric(MacroAssembler* masm,
|
| // The generated code falls through if both probes miss.
|
| static void GenerateMonomorphicCacheProbe(MacroAssembler* masm,
|
| int argc,
|
| - Code::Kind kind) {
|
| + Code::Kind kind,
|
| + Code::ExtraICState extra_ic_state) {
|
| // ----------- S t a t e -------------
|
| // rcx : function name
|
| // rdx : receiver
|
| @@ -824,7 +825,7 @@ static void GenerateMonomorphicCacheProbe(MacroAssembler* masm,
|
| Code::Flags flags = Code::ComputeFlags(kind,
|
| NOT_IN_LOOP,
|
| MONOMORPHIC,
|
| - Code::kNoExtraICState,
|
| + extra_ic_state,
|
| NORMAL,
|
| argc);
|
| Isolate::Current()->stub_cache()->GenerateProbe(masm, flags, rdx, rcx, rbx,
|
| @@ -923,7 +924,10 @@ static void GenerateCallNormal(MacroAssembler* masm, int argc) {
|
| }
|
|
|
|
|
| -static void GenerateCallMiss(MacroAssembler* masm, int argc, IC::UtilityId id) {
|
| +static void GenerateCallMiss(MacroAssembler* masm,
|
| + int argc,
|
| + IC::UtilityId id,
|
| + Code::ExtraICState extra_ic_state) {
|
| // ----------- S t a t e -------------
|
| // rcx : function name
|
| // rsp[0] : return address
|
| @@ -980,12 +984,21 @@ static void GenerateCallMiss(MacroAssembler* masm, int argc, IC::UtilityId id) {
|
| }
|
|
|
| // Invoke the function.
|
| + CallKind call_kind = CallICBase::Contextual::decode(extra_ic_state)
|
| + ? CALL_AS_FUNCTION
|
| + : CALL_AS_METHOD;
|
| ParameterCount actual(argc);
|
| - __ InvokeFunction(rdi, actual, JUMP_FUNCTION);
|
| + __ InvokeFunction(rdi,
|
| + actual,
|
| + JUMP_FUNCTION,
|
| + NullCallWrapper(),
|
| + call_kind);
|
| }
|
|
|
|
|
| -void CallIC::GenerateMegamorphic(MacroAssembler* masm, int argc) {
|
| +void CallIC::GenerateMegamorphic(MacroAssembler* masm,
|
| + int argc,
|
| + Code::ExtraICState extra_ic_state) {
|
| // ----------- S t a t e -------------
|
| // rcx : function name
|
| // rsp[0] : return address
|
| @@ -998,8 +1011,8 @@ void CallIC::GenerateMegamorphic(MacroAssembler* masm, int argc) {
|
|
|
| // Get the receiver of the function from the stack; 1 ~ return address.
|
| __ movq(rdx, Operand(rsp, (argc + 1) * kPointerSize));
|
| - GenerateMonomorphicCacheProbe(masm, argc, Code::CALL_IC);
|
| - GenerateMiss(masm, argc);
|
| + GenerateMonomorphicCacheProbe(masm, argc, Code::CALL_IC, extra_ic_state);
|
| + GenerateMiss(masm, argc, extra_ic_state);
|
| }
|
|
|
|
|
| @@ -1015,11 +1028,13 @@ void CallIC::GenerateNormal(MacroAssembler* masm, int argc) {
|
| // -----------------------------------
|
|
|
| GenerateCallNormal(masm, argc);
|
| - GenerateMiss(masm, argc);
|
| + GenerateMiss(masm, argc, Code::kNoExtraICState);
|
| }
|
|
|
|
|
| -void CallIC::GenerateMiss(MacroAssembler* masm, int argc) {
|
| +void CallIC::GenerateMiss(MacroAssembler* masm,
|
| + int argc,
|
| + Code::ExtraICState extra_ic_state) {
|
| // ----------- S t a t e -------------
|
| // rcx : function name
|
| // rsp[0] : return address
|
| @@ -1030,7 +1045,7 @@ void CallIC::GenerateMiss(MacroAssembler* masm, int argc) {
|
| // rsp[(argc + 1) * 8] : argument 0 = receiver
|
| // -----------------------------------
|
|
|
| - GenerateCallMiss(masm, argc, IC::kCallIC_Miss);
|
| + GenerateCallMiss(masm, argc, IC::kCallIC_Miss, extra_ic_state);
|
| }
|
|
|
|
|
| @@ -1121,7 +1136,10 @@ void KeyedCallIC::GenerateMegamorphic(MacroAssembler* masm, int argc) {
|
|
|
| __ bind(&lookup_monomorphic_cache);
|
| __ IncrementCounter(counters->keyed_call_generic_lookup_cache(), 1);
|
| - GenerateMonomorphicCacheProbe(masm, argc, Code::KEYED_CALL_IC);
|
| + GenerateMonomorphicCacheProbe(masm,
|
| + argc,
|
| + Code::KEYED_CALL_IC,
|
| + Code::kNoExtraICState);
|
| // Fall through on miss.
|
|
|
| __ bind(&slow_call);
|
| @@ -1174,7 +1192,7 @@ void KeyedCallIC::GenerateMiss(MacroAssembler* masm, int argc) {
|
| // rsp[(argc + 1) * 8] : argument 0 = receiver
|
| // -----------------------------------
|
|
|
| - GenerateCallMiss(masm, argc, IC::kKeyedCallIC_Miss);
|
| + GenerateCallMiss(masm, argc, IC::kKeyedCallIC_Miss, Code::kNoExtraICState);
|
| }
|
|
|
|
|
|
|