Chromium Code Reviews| Index: src/ic/ia32/ic-ia32.cc |
| diff --git a/src/ic/ia32/ic-ia32.cc b/src/ic/ia32/ic-ia32.cc |
| index a622ba4faf3bbbeb4c30a8cd0bfac0138950efac..fdb2e3c2c79bddad4966fe349455474a304fff64 100644 |
| --- a/src/ic/ia32/ic-ia32.cc |
| +++ b/src/ic/ia32/ic-ia32.cc |
| @@ -767,31 +767,51 @@ void LoadIC::GenerateNormal(MacroAssembler* masm) { |
| static void LoadIC_PushArgs(MacroAssembler* masm) { |
| Register receiver = LoadDescriptor::ReceiverRegister(); |
| Register name = LoadDescriptor::NameRegister(); |
| - DCHECK(!ebx.is(receiver) && !ebx.is(name)); |
| + if (FLAG_vector_ics) { |
| + Register slot = VectorLoadICDescriptor::SlotRegister(); |
| + Register vector = VectorLoadICDescriptor::VectorRegister(); |
| + DCHECK(!edi.is(receiver) && !edi.is(name)); |
|
Jakob Kummerow
2014/11/26 15:14:14
&& !edi.is(slot) && !edi.is(vector)
mvstanton
2014/11/27 13:09:26
Done, also in x64 which needed this temporary regi
|
| + |
| + __ pop(edi); |
| + __ push(receiver); |
| + __ push(name); |
| + __ push(slot); |
| + __ push(vector); |
| + __ push(edi); |
| + } else { |
| + DCHECK(!ebx.is(receiver) && !ebx.is(name)); |
| - __ pop(ebx); |
| - __ push(receiver); |
| - __ push(name); |
| - __ push(ebx); |
| + __ pop(ebx); |
| + __ push(receiver); |
| + __ push(name); |
| + __ push(ebx); |
| + } |
| } |
| void LoadIC::GenerateMiss(MacroAssembler* masm) { |
| // Return address is on the stack. |
| __ IncrementCounter(masm->isolate()->counters()->load_miss(), 1); |
| - |
| LoadIC_PushArgs(masm); |
| // Perform tail call to the entry. |
| ExternalReference ref = |
| ExternalReference(IC_Utility(kLoadIC_Miss), masm->isolate()); |
| - __ TailCallExternalReference(ref, 2, 1); |
| + int arg_count = FLAG_vector_ics ? 4 : 2; |
| + __ TailCallExternalReference(ref, arg_count, 1); |
| } |
| void LoadIC::GenerateRuntimeGetProperty(MacroAssembler* masm) { |
| // Return address is on the stack. |
| - LoadIC_PushArgs(masm); |
| + Register receiver = LoadDescriptor::ReceiverRegister(); |
| + Register name = LoadDescriptor::NameRegister(); |
| + DCHECK(!ebx.is(receiver) && !ebx.is(name)); |
| + |
| + __ pop(ebx); |
| + __ push(receiver); |
| + __ push(name); |
| + __ push(ebx); |
| // Perform tail call to the entry. |
| __ TailCallRuntime(Runtime::kGetProperty, 2, 1); |
| @@ -807,13 +827,21 @@ void KeyedLoadIC::GenerateMiss(MacroAssembler* masm) { |
| // Perform tail call to the entry. |
| ExternalReference ref = |
| ExternalReference(IC_Utility(kKeyedLoadIC_Miss), masm->isolate()); |
| - __ TailCallExternalReference(ref, 2, 1); |
| + int arg_count = FLAG_vector_ics ? 4 : 2; |
| + __ TailCallExternalReference(ref, arg_count, 1); |
| } |
| void KeyedLoadIC::GenerateRuntimeGetProperty(MacroAssembler* masm) { |
| // Return address is on the stack. |
| - LoadIC_PushArgs(masm); |
| + Register receiver = LoadDescriptor::ReceiverRegister(); |
| + Register name = LoadDescriptor::NameRegister(); |
| + DCHECK(!ebx.is(receiver) && !ebx.is(name)); |
| + |
| + __ pop(ebx); |
| + __ push(receiver); |
| + __ push(name); |
| + __ push(ebx); |
| // Perform tail call to the entry. |
| __ TailCallRuntime(Runtime::kKeyedGetProperty, 2, 1); |