Index: src/ic/ia32/stub-cache-ia32.cc |
diff --git a/src/ic/ia32/stub-cache-ia32.cc b/src/ic/ia32/stub-cache-ia32.cc |
index 68b30e7bdba1305ef1084336b5f5490005937928..e5791793f5de72f3cda573bdec84486399b5b108 100644 |
--- a/src/ic/ia32/stub-cache-ia32.cc |
+++ b/src/ic/ia32/stub-cache-ia32.cc |
@@ -25,6 +25,9 @@ static void ProbeTable(Isolate* isolate, MacroAssembler* masm, |
ExternalReference map_offset(isolate->stub_cache()->map_reference(table)); |
Label miss; |
+ bool is_vector_store = |
+ IC::ICUseVector(ic_kind) && |
+ (ic_kind == Code::STORE_IC || ic_kind == Code::KEYED_STORE_IC); |
// Multiply by 3 because there are 3 fields per entry (name, code, map). |
__ lea(offset, Operand(offset, offset, times_2, 0)); |
@@ -56,19 +59,28 @@ static void ProbeTable(Isolate* isolate, MacroAssembler* masm, |
} |
#endif |
- if (IC::ICUseVector(ic_kind)) { |
- // The vector and slot were pushed onto the stack before starting the |
- // probe, and need to be dropped before calling the handler. |
+ // The vector and slot were pushed onto the stack before starting the |
+ // probe, and need to be dropped before calling the handler. |
+ if (is_vector_store) { |
+ // The overlap here is rather embarrassing. One does what one must. |
+ Register vector = VectorStoreICDescriptor::VectorRegister(); |
+ DCHECK(extra.is(VectorStoreICDescriptor::SlotRegister())); |
+ __ add(extra, Immediate(Code::kHeaderSize - kHeapObjectTag)); |
+ __ pop(vector); |
+ __ xchg(extra, Operand(esp, 0)); |
+ // Jump to the first instruction in the code stub. |
+ __ ret(0); |
+ } else { |
__ pop(LoadWithVectorDescriptor::VectorRegister()); |
__ pop(LoadDescriptor::SlotRegister()); |
+ __ add(extra, Immediate(Code::kHeaderSize - kHeapObjectTag)); |
+ __ jmp(extra); |
} |
- // Jump to the first instruction in the code stub. |
- __ add(extra, Immediate(Code::kHeaderSize - kHeapObjectTag)); |
- __ jmp(extra); |
- |
__ bind(&miss); |
} else { |
+ DCHECK(ic_kind == Code::STORE_IC || ic_kind == Code::KEYED_STORE_IC); |
+ |
// Save the offset on the stack. |
__ push(offset); |
@@ -105,21 +117,21 @@ static void ProbeTable(Isolate* isolate, MacroAssembler* masm, |
__ pop(offset); |
__ mov(offset, Operand::StaticArray(offset, times_1, value_offset)); |
- if (IC::ICUseVector(ic_kind)) { |
+ // Jump to the first instruction in the code stub. |
+ if (is_vector_store) { |
// The vector and slot were pushed onto the stack before starting the |
// probe, and need to be dropped before calling the handler. |
- Register vector = LoadWithVectorDescriptor::VectorRegister(); |
- Register slot = LoadDescriptor::SlotRegister(); |
- DCHECK(!offset.is(vector) && !offset.is(slot)); |
- |
+ Register vector = VectorStoreICDescriptor::VectorRegister(); |
+ DCHECK(offset.is(VectorStoreICDescriptor::SlotRegister())); |
+ __ add(offset, Immediate(Code::kHeaderSize - kHeapObjectTag)); |
__ pop(vector); |
- __ pop(slot); |
+ __ xchg(offset, Operand(esp, 0)); |
+ __ ret(0); |
+ } else { |
+ __ add(offset, Immediate(Code::kHeaderSize - kHeapObjectTag)); |
+ __ jmp(offset); |
} |
- // Jump to the first instruction in the code stub. |
- __ add(offset, Immediate(Code::kHeaderSize - kHeapObjectTag)); |
- __ jmp(offset); |
- |
// Pop at miss. |
__ bind(&miss); |
__ pop(offset); |