Index: src/ia32/ic-ia32.cc |
diff --git a/src/ia32/ic-ia32.cc b/src/ia32/ic-ia32.cc |
index bde3b7e1a199486a6bdd04159e2215c69fe2bfb4..6952823767419655c52769bbf21e517db2e816b3 100644 |
--- a/src/ia32/ic-ia32.cc |
+++ b/src/ia32/ic-ia32.cc |
@@ -655,7 +655,7 @@ void KeyedLoadIC::GenerateString(MacroAssembler* masm) { |
char_at_generator.GenerateSlow(masm, call_helper); |
__ bind(&miss); |
- GenerateMiss(masm); |
+ GenerateMiss(masm, false); |
} |
@@ -698,7 +698,7 @@ void KeyedLoadIC::GenerateIndexedInterceptor(MacroAssembler* masm) { |
__ TailCallExternalReference(ref, 2, 1); |
__ bind(&slow); |
- GenerateMiss(masm); |
+ GenerateMiss(masm, false); |
} |
@@ -1222,7 +1222,7 @@ void LoadIC::GenerateMiss(MacroAssembler* masm) { |
} |
-void KeyedLoadIC::GenerateMiss(MacroAssembler* masm) { |
+void KeyedLoadIC::GenerateMiss(MacroAssembler* masm, bool force_generic) { |
// ----------- S t a t e ------------- |
// -- eax : key |
// -- edx : receiver |
@@ -1237,8 +1237,10 @@ void KeyedLoadIC::GenerateMiss(MacroAssembler* masm) { |
__ push(ebx); // return address |
// Perform tail call to the entry. |
- ExternalReference ref = |
- ExternalReference(IC_Utility(kKeyedLoadIC_Miss), masm->isolate()); |
+ ExternalReference ref = force_generic |
+ ? ExternalReference(IC_Utility(kKeyedLoadIC_MissForceGeneric), |
+ masm->isolate()) |
+ : ExternalReference(IC_Utility(kKeyedLoadIC_Miss), masm->isolate()); |
__ TailCallExternalReference(ref, 2, 1); |
} |
@@ -1430,7 +1432,7 @@ void KeyedStoreIC::GenerateRuntimeSetProperty(MacroAssembler* masm, |
} |
-void KeyedStoreIC::GenerateMiss(MacroAssembler* masm) { |
+void KeyedStoreIC::GenerateMiss(MacroAssembler* masm, bool force_generic) { |
// ----------- S t a t e ------------- |
// -- eax : value |
// -- ecx : key |
@@ -1445,12 +1447,35 @@ void KeyedStoreIC::GenerateMiss(MacroAssembler* masm) { |
__ push(ebx); |
// Do tail-call to runtime routine. |
- ExternalReference ref = |
- ExternalReference(IC_Utility(kKeyedStoreIC_Miss), masm->isolate()); |
+ ExternalReference ref = force_generic |
+ ? ExternalReference(IC_Utility(kKeyedStoreIC_MissForceGeneric), |
+ masm->isolate()) |
+ : ExternalReference(IC_Utility(kKeyedStoreIC_Miss), masm->isolate()); |
__ TailCallExternalReference(ref, 3, 1); |
} |
+void KeyedStoreIC::GenerateSlow(MacroAssembler* masm) { |
+ // ----------- S t a t e ------------- |
+ // -- eax : value |
+ // -- ecx : key |
+ // -- edx : receiver |
+ // -- esp[0] : return address |
+ // ----------------------------------- |
+ |
+ __ pop(ebx); |
+ __ push(edx); |
+ __ push(ecx); |
+ __ push(eax); |
+ __ push(Immediate(Smi::FromInt(NONE))); // PropertyAttributes |
+ __ push(ebx); // return address |
+ |
+ // Do tail-call to runtime routine. |
+ ExternalReference ref(IC_Utility(kKeyedStoreIC_Slow), masm->isolate()); |
+ __ TailCallExternalReference(ref, 4, 1); |
+} |
+ |
+ |
#undef __ |