Index: src/ic/ia32/handler-compiler-ia32.cc |
diff --git a/src/ic/ia32/handler-compiler-ia32.cc b/src/ic/ia32/handler-compiler-ia32.cc |
index 5845abf00f52347885c2f200fcfa8cffbfebd2f2..1d019092c7b91812cda2ad26c38e9f86d2625d18 100644 |
--- a/src/ic/ia32/handler-compiler-ia32.cc |
+++ b/src/ic/ia32/handler-compiler-ia32.cc |
@@ -304,13 +304,24 @@ static void StoreIC_PushArgs(MacroAssembler* masm) { |
Register name = StoreDescriptor::NameRegister(); |
Register value = StoreDescriptor::ValueRegister(); |
- DCHECK(!ebx.is(receiver) && !ebx.is(name) && !ebx.is(value)); |
- |
- __ pop(ebx); |
- __ push(receiver); |
- __ push(name); |
- __ push(value); |
- __ push(ebx); |
+ if (FLAG_vector_stores) { |
+ Register slot = VectorStoreICDescriptor::SlotRegister(); |
+ Register vector = VectorStoreICDescriptor::VectorRegister(); |
+ |
+ __ xchg(receiver, Operand(esp, 0)); |
+ __ push(name); |
+ __ push(value); |
+ __ push(slot); |
+ __ push(vector); |
+ __ push(receiver); // which contains the return address. |
+ } else { |
+ DCHECK(!ebx.is(receiver) && !ebx.is(name) && !ebx.is(value)); |
+ __ pop(ebx); |
+ __ push(receiver); |
+ __ push(name); |
+ __ push(value); |
+ __ push(ebx); |
+ } |
} |
@@ -319,7 +330,7 @@ void NamedStoreHandlerCompiler::GenerateSlow(MacroAssembler* masm) { |
StoreIC_PushArgs(masm); |
// Do tail-call to runtime routine. |
- __ TailCallRuntime(Runtime::kStoreIC_Slow, 3, 1); |
+ __ TailCallRuntime(Runtime::kStoreIC_Slow, FLAG_vector_stores ? 5 : 3, 1); |
} |
@@ -328,7 +339,8 @@ void ElementHandlerCompiler::GenerateStoreSlow(MacroAssembler* masm) { |
StoreIC_PushArgs(masm); |
// Do tail-call to runtime routine. |
- __ TailCallRuntime(Runtime::kKeyedStoreIC_Slow, 3, 1); |
+ __ TailCallRuntime(Runtime::kKeyedStoreIC_Slow, FLAG_vector_stores ? 5 : 3, |
+ 1); |
} |
@@ -352,10 +364,16 @@ void NamedStoreHandlerCompiler::GenerateRestoreName(Handle<Name> name) { |
void NamedStoreHandlerCompiler::GeneratePushMap(Register map_reg, |
Register scratch) { |
- // Get the return address, push the argument and then continue. |
- __ pop(scratch); |
+ // current after GeneratePushMap |
+ // ------------------------------------------------- |
+ // ret addr slot |
+ // vector vector |
+ // sp -> slot map |
+ // sp -> ret addr |
+ // |
+ __ xchg(map_reg, Operand(esp, 0)); |
+ __ xchg(map_reg, Operand(esp, 2 * kPointerSize)); |
__ push(map_reg); |
- __ push(scratch); |
} |
@@ -575,6 +593,7 @@ void NamedStoreHandlerCompiler::FrontendFooter(Handle<Name> name, Label* miss) { |
Label success; |
__ jmp(&success); |
GenerateRestoreName(miss, name); |
+ if (IC::ICUseVector(kind())) PopVectorAndSlot(); |
TailCallBuiltin(masm(), MissBuiltin(kind())); |
__ bind(&success); |
} |