| Index: src/ic/ia32/ic-ia32.cc
|
| diff --git a/src/ic/ia32/ic-ia32.cc b/src/ic/ia32/ic-ia32.cc
|
| index 2b0e43a6b6fa0e2c171b40762a84625a1aacf2f7..0e0f34e0e93315b302719272f40564a961dcbc81 100644
|
| --- a/src/ic/ia32/ic-ia32.cc
|
| +++ b/src/ic/ia32/ic-ia32.cc
|
| @@ -751,13 +751,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); // 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);
|
| + }
|
| }
|
|
|
|
|
| @@ -766,7 +777,8 @@ void StoreIC::GenerateMiss(MacroAssembler* masm) {
|
| StoreIC_PushArgs(masm);
|
|
|
| // Perform tail call to the entry.
|
| - __ TailCallRuntime(Runtime::kStoreIC_Miss, 3, 1);
|
| + int args = FLAG_vector_stores ? 5 : 3;
|
| + __ TailCallRuntime(Runtime::kStoreIC_Miss, args, 1);
|
| }
|
|
|
|
|
| @@ -802,7 +814,8 @@ void KeyedStoreIC::GenerateMiss(MacroAssembler* masm) {
|
| StoreIC_PushArgs(masm);
|
|
|
| // Do tail-call to runtime routine.
|
| - __ TailCallRuntime(Runtime::kKeyedStoreIC_Miss, 3, 1);
|
| + int args = FLAG_vector_stores ? 5 : 3;
|
| + __ TailCallRuntime(Runtime::kKeyedStoreIC_Miss, args, 1);
|
| }
|
|
|
|
|
|
|