Index: src/x87/code-stubs-x87.cc |
diff --git a/src/x87/code-stubs-x87.cc b/src/x87/code-stubs-x87.cc |
index 4d14535604db2d8ac33414924e2b7fdfdd359ad7..1d72ab3a6880808ad885ddb88334a6a007ed5600 100644 |
--- a/src/x87/code-stubs-x87.cc |
+++ b/src/x87/code-stubs-x87.cc |
@@ -3354,11 +3354,10 @@ static void HandlePolymorphicStoreCase(MacroAssembler* masm, Register receiver, |
Label load_smi_map, compare_map; |
Label start_polymorphic; |
Label pop_and_miss; |
- ExternalReference virtual_register = |
- ExternalReference::virtual_handler_register(masm->isolate()); |
__ push(receiver); |
- __ push(vector); |
+ // Value, vector and slot are passed on the stack, so no need to save/restore |
+ // them. |
Register receiver_map = receiver; |
Register cached_map = vector; |
@@ -3379,12 +3378,9 @@ static void HandlePolymorphicStoreCase(MacroAssembler* masm, Register receiver, |
Register handler = feedback; |
DCHECK(handler.is(StoreWithVectorDescriptor::ValueRegister())); |
__ mov(handler, FieldOperand(feedback, FixedArray::OffsetOfElementAt(1))); |
- __ pop(vector); |
__ pop(receiver); |
__ lea(handler, FieldOperand(handler, Code::kHeaderSize)); |
- __ mov(Operand::StaticVariable(virtual_register), handler); |
- __ pop(handler); // Pop "value". |
- __ jmp(Operand::StaticVariable(virtual_register)); |
+ __ jmp(handler); |
// Polymorphic, we have to loop from 2 to N |
__ bind(&start_polymorphic); |
@@ -3408,11 +3404,8 @@ static void HandlePolymorphicStoreCase(MacroAssembler* masm, Register receiver, |
FixedArray::kHeaderSize + kPointerSize)); |
__ lea(handler, FieldOperand(handler, Code::kHeaderSize)); |
__ pop(key); |
- __ pop(vector); |
__ pop(receiver); |
- __ mov(Operand::StaticVariable(virtual_register), handler); |
- __ pop(handler); // Pop "value". |
- __ jmp(Operand::StaticVariable(virtual_register)); |
+ __ jmp(handler); |
__ bind(&prepare_next); |
__ add(counter, Immediate(Smi::FromInt(2))); |
@@ -3422,7 +3415,6 @@ static void HandlePolymorphicStoreCase(MacroAssembler* masm, Register receiver, |
// We exhausted our array of map handler pairs. |
__ bind(&pop_and_miss); |
__ pop(key); |
- __ pop(vector); |
__ pop(receiver); |
__ jmp(miss); |
@@ -3438,8 +3430,6 @@ static void HandleMonomorphicStoreCase(MacroAssembler* masm, Register receiver, |
Label* miss) { |
// The store ic value is on the stack. |
DCHECK(weak_cell.is(StoreWithVectorDescriptor::ValueRegister())); |
- ExternalReference virtual_register = |
- ExternalReference::virtual_handler_register(masm->isolate()); |
// feedback initially contains the feedback array |
Label compare_smi_map; |
@@ -3455,11 +3445,8 @@ static void HandleMonomorphicStoreCase(MacroAssembler* masm, Register receiver, |
__ mov(weak_cell, FieldOperand(vector, slot, times_half_pointer_size, |
FixedArray::kHeaderSize + kPointerSize)); |
__ lea(weak_cell, FieldOperand(weak_cell, Code::kHeaderSize)); |
- // Put the store ic value back in it's register. |
- __ mov(Operand::StaticVariable(virtual_register), weak_cell); |
- __ pop(weak_cell); // Pop "value". |
// jump to the handler. |
- __ jmp(Operand::StaticVariable(virtual_register)); |
+ __ jmp(weak_cell); |
// In microbenchmarks, it made sense to unroll this code so that the call to |
// the handler is duplicated for a HeapObject receiver and a Smi receiver. |
@@ -3469,10 +3456,8 @@ static void HandleMonomorphicStoreCase(MacroAssembler* masm, Register receiver, |
__ mov(weak_cell, FieldOperand(vector, slot, times_half_pointer_size, |
FixedArray::kHeaderSize + kPointerSize)); |
__ lea(weak_cell, FieldOperand(weak_cell, Code::kHeaderSize)); |
- __ mov(Operand::StaticVariable(virtual_register), weak_cell); |
- __ pop(weak_cell); // Pop "value". |
// jump to the handler. |
- __ jmp(Operand::StaticVariable(virtual_register)); |
+ __ jmp(weak_cell); |
} |
void StoreICStub::GenerateImpl(MacroAssembler* masm, bool in_frame) { |
@@ -3502,11 +3487,8 @@ void StoreICStub::GenerateImpl(MacroAssembler* masm, bool in_frame) { |
__ mov(vector, Operand(esp, 1 * kPointerSize)); |
} |
__ mov(slot, Operand(esp, 2 * kPointerSize)); |
- __ mov(value, Operand(esp, 3 * kPointerSize)); |
} |
- __ push(value); |
- |
Register scratch = value; |
__ mov(scratch, FieldOperand(vector, slot, times_half_pointer_size, |
FixedArray::kHeaderSize)); |
@@ -3529,19 +3511,9 @@ void StoreICStub::GenerateImpl(MacroAssembler* masm, bool in_frame) { |
__ CompareRoot(scratch, Heap::kmegamorphic_symbolRootIndex); |
__ j(not_equal, &miss); |
- __ pop(value); |
- __ push(slot); |
- __ push(vector); |
masm->isolate()->store_stub_cache()->GenerateProbe(masm, receiver, key, slot, |
no_reg); |
- __ pop(vector); |
- __ pop(slot); |
- Label no_pop_miss; |
- __ jmp(&no_pop_miss); |
- |
__ bind(&miss); |
- __ pop(value); |
- __ bind(&no_pop_miss); |
StoreIC::GenerateMiss(masm); |
} |
@@ -3563,17 +3535,13 @@ static void HandlePolymorphicKeyedStoreCase(MacroAssembler* masm, |
Label load_smi_map, compare_map; |
Label transition_call; |
Label pop_and_miss; |
- ExternalReference virtual_register = |
- ExternalReference::virtual_handler_register(masm->isolate()); |
- ExternalReference virtual_slot = |
- ExternalReference::virtual_slot_register(masm->isolate()); |
__ push(receiver); |
- __ push(vector); |
+ // Value, vector and slot are passed on the stack, so no need to save/restore |
+ // them. |
Register receiver_map = receiver; |
Register cached_map = vector; |
- Register value = StoreDescriptor::ValueRegister(); |
// Receiver might not be a heap object. |
__ JumpIfSmi(receiver, &load_smi_map); |
@@ -3584,15 +3552,18 @@ static void HandlePolymorphicKeyedStoreCase(MacroAssembler* masm, |
__ push(key); |
// Current stack layout: |
// - esp[0] -- key |
- // - esp[4] -- vector |
- // - esp[8] -- receiver |
- // - esp[12] -- value |
- // - esp[16] -- return address |
+ // - esp[4] -- receiver |
+ // - esp[8] -- return address |
+ // - esp[12] -- vector |
+ // - esp[16] -- slot |
+ // - esp[20] -- value |
// |
- // Required stack layout for handler call: |
+ // Required stack layout for handler call (see StoreWithVectorDescriptor): |
// - esp[0] -- return address |
- // - receiver, key, value, vector, slot in registers. |
- // - handler in virtual register. |
+ // - esp[4] -- vector |
+ // - esp[8] -- slot |
+ // - esp[12] -- value |
+ // - receiver, key, handler in registers. |
Register counter = key; |
__ mov(counter, Immediate(Smi::FromInt(0))); |
__ bind(&next_loop); |
@@ -3607,32 +3578,28 @@ static void HandlePolymorphicKeyedStoreCase(MacroAssembler* masm, |
__ mov(feedback, FieldOperand(feedback, counter, times_half_pointer_size, |
FixedArray::kHeaderSize + 2 * kPointerSize)); |
__ pop(key); |
- __ pop(vector); |
__ pop(receiver); |
__ lea(feedback, FieldOperand(feedback, Code::kHeaderSize)); |
- __ mov(Operand::StaticVariable(virtual_register), feedback); |
- __ pop(value); |
- |
- // Call store handler using StoreWithVectorDescriptor calling convention. |
- __ jmp(Operand::StaticVariable(virtual_register)); |
+ __ jmp(feedback); |
__ bind(&transition_call); |
// Current stack layout: |
// - esp[0] -- key |
- // - esp[4] -- vector |
- // - esp[8] -- receiver |
- // - esp[12] -- value |
- // - esp[16] -- return address |
+ // - esp[4] -- receiver |
+ // - esp[8] -- return address |
+ // - esp[12] -- vector |
+ // - esp[16] -- slot |
+ // - esp[20] -- value |
// |
- // Required stack layout for handler call: |
+ // Required stack layout for handler call (see StoreTransitionDescriptor): |
// - esp[0] -- return address |
- // - receiver, key, value, map, vector in registers. |
- // - handler and slot in virtual registers. |
- __ mov(Operand::StaticVariable(virtual_slot), slot); |
+ // - esp[4] -- vector |
+ // - esp[8] -- slot |
+ // - esp[12] -- value |
+ // - receiver, key, map, handler in registers. |
__ mov(feedback, FieldOperand(feedback, counter, times_half_pointer_size, |
FixedArray::kHeaderSize + 2 * kPointerSize)); |
__ lea(feedback, FieldOperand(feedback, Code::kHeaderSize)); |
- __ mov(Operand::StaticVariable(virtual_register), feedback); |
__ mov(cached_map, FieldOperand(cached_map, WeakCell::kValueOffset)); |
// The weak cell may have been cleared. |
@@ -3643,9 +3610,7 @@ static void HandlePolymorphicKeyedStoreCase(MacroAssembler* masm, |
// Call store transition handler using StoreTransitionDescriptor calling |
// convention. |
__ pop(key); |
- __ pop(vector); |
__ pop(receiver); |
- __ pop(value); |
// Ensure that the transition handler we are going to call has the same |
// number of stack arguments which means that we don't have to adapt them |
// before the call. |
@@ -3663,7 +3628,7 @@ static void HandlePolymorphicKeyedStoreCase(MacroAssembler* masm, |
StoreWithVectorDescriptor::kVector == |
StoreTransitionDescriptor::kParameterCount - |
StoreTransitionDescriptor::kVector); |
- __ jmp(Operand::StaticVariable(virtual_register)); |
+ __ jmp(feedback); |
__ bind(&prepare_next); |
__ add(counter, Immediate(Smi::FromInt(3))); |
@@ -3673,7 +3638,6 @@ static void HandlePolymorphicKeyedStoreCase(MacroAssembler* masm, |
// We exhausted our array of map handler pairs. |
__ bind(&pop_and_miss); |
__ pop(key); |
- __ pop(vector); |
__ pop(receiver); |
__ jmp(miss); |
@@ -3709,11 +3673,8 @@ void KeyedStoreICStub::GenerateImpl(MacroAssembler* masm, bool in_frame) { |
__ mov(vector, Operand(esp, 1 * kPointerSize)); |
} |
__ mov(slot, Operand(esp, 2 * kPointerSize)); |
- __ mov(value, Operand(esp, 3 * kPointerSize)); |
} |
- __ push(value); |
- |
Register scratch = value; |
__ mov(scratch, FieldOperand(vector, slot, times_half_pointer_size, |
FixedArray::kHeaderSize)); |
@@ -3737,8 +3698,6 @@ void KeyedStoreICStub::GenerateImpl(MacroAssembler* masm, bool in_frame) { |
__ CompareRoot(scratch, Heap::kmegamorphic_symbolRootIndex); |
__ j(not_equal, &try_poly_name); |
- __ pop(value); |
- |
Handle<Code> megamorphic_stub = |
KeyedStoreIC::ChooseMegamorphicStub(masm->isolate(), GetExtraICState()); |
__ jmp(megamorphic_stub, RelocInfo::CODE_TARGET); |
@@ -3755,7 +3714,6 @@ void KeyedStoreICStub::GenerateImpl(MacroAssembler* masm, bool in_frame) { |
&miss); |
__ bind(&miss); |
- __ pop(value); |
KeyedStoreIC::GenerateMiss(masm); |
} |