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