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 939e7fc0fddb759bd275a3a0eaa910717f15904e..82700d34a75a761de8fe0fa70734fbfec18668c5 100644 |
--- a/src/ic/ia32/stub-cache-ia32.cc |
+++ b/src/ic/ia32/stub-cache-ia32.cc |
@@ -22,8 +22,6 @@ static void ProbeTable(StubCache* stub_cache, MacroAssembler* masm, |
ExternalReference key_offset(stub_cache->key_reference(table)); |
ExternalReference value_offset(stub_cache->value_reference(table)); |
ExternalReference map_offset(stub_cache->map_reference(table)); |
- ExternalReference virtual_register = |
- ExternalReference::virtual_handler_register(masm->isolate()); |
Label miss; |
Code::Kind ic_kind = stub_cache->ic_kind(); |
@@ -55,19 +53,15 @@ static void ProbeTable(StubCache* stub_cache, MacroAssembler* masm, |
} |
#endif |
- // 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 = StoreWithVectorDescriptor::VectorRegister(); |
+ // The value, vector and slot were passed to the IC on the stack and |
+ // they are still there. So we can just jump to the handler. |
DCHECK(extra.is(StoreWithVectorDescriptor::SlotRegister())); |
__ add(extra, Immediate(Code::kHeaderSize - kHeapObjectTag)); |
- __ pop(vector); |
- __ mov(Operand::StaticVariable(virtual_register), extra); |
- __ pop(extra); // Pop "slot". |
- // Jump to the first instruction in the code stub. |
- __ jmp(Operand::StaticVariable(virtual_register)); |
+ __ jmp(extra); |
} else { |
+ // The vector and slot were pushed onto the stack before starting the |
+ // probe, and need to be dropped before calling the handler. |
__ pop(LoadWithVectorDescriptor::VectorRegister()); |
__ pop(LoadDescriptor::SlotRegister()); |
__ add(extra, Immediate(Code::kHeaderSize - kHeapObjectTag)); |
@@ -110,19 +104,10 @@ static void ProbeTable(StubCache* stub_cache, MacroAssembler* masm, |
// 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 = StoreWithVectorDescriptor::VectorRegister(); |
DCHECK(offset.is(StoreWithVectorDescriptor::SlotRegister())); |
- __ add(offset, Immediate(Code::kHeaderSize - kHeapObjectTag)); |
- __ mov(Operand::StaticVariable(virtual_register), offset); |
- __ pop(vector); |
- __ pop(offset); // Pop "slot". |
- __ jmp(Operand::StaticVariable(virtual_register)); |
- } else { |
- __ add(offset, Immediate(Code::kHeaderSize - kHeapObjectTag)); |
- __ jmp(offset); |
} |
+ __ add(offset, Immediate(Code::kHeaderSize - kHeapObjectTag)); |
+ __ jmp(offset); |
// Pop at miss. |
__ bind(&miss); |