Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(426)

Unified Diff: src/ia32/code-stubs-ia32.cc

Issue 2357163003: [ic][ia32][x87] Pass value, slot and vector to StoreIC and KeyedStoreIC through the stack. (Closed)
Patch Set: Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/ia32/code-stubs-ia32.cc
diff --git a/src/ia32/code-stubs-ia32.cc b/src/ia32/code-stubs-ia32.cc
index 5fbc0b8fccc7ed39b9f99c3c0c625490f6db037b..1c45e97fe1bc8878f9074c2b7279cee21e67b468 100644
--- a/src/ia32/code-stubs-ia32.cc
+++ b/src/ia32/code-stubs-ia32.cc
@@ -3671,6 +3671,28 @@ void StoreICStub::GenerateImpl(MacroAssembler* masm, bool in_frame) {
Register slot = StoreWithVectorDescriptor::SlotRegister(); // edi
Label miss;
+ if (StoreWithVectorDescriptor::kPassLastArgsOnStack) {
+ // Current stack layout:
+ // - esp[8] -- value
+ // - esp[4] -- slot
+ // - esp[0] -- return address
+ STATIC_ASSERT(StoreDescriptor::kStackArgumentsCount == 2);
+ STATIC_ASSERT(StoreWithVectorDescriptor::kStackArgumentsCount == 3);
+ if (in_frame) {
+ __ RecordComment("[ StoreDescriptor -> StoreWithVectorDescriptor");
+ // If the vector is not on the stack, then insert the vector beneath
+ // return address in order to prepare for calling handler with
+ // StoreWithVector calling convention.
+ __ push(Operand(esp, 0));
+ __ mov(Operand(esp, 4), StoreWithVectorDescriptor::VectorRegister());
+ __ RecordComment("]");
+ } else {
+ __ mov(vector, Operand(esp, 1 * kPointerSize));
+ }
+ __ mov(slot, Operand(esp, 2 * kPointerSize));
+ __ mov(value, Operand(esp, 3 * kPointerSize));
+ }
+
__ push(value);
Register scratch = value;
@@ -3812,12 +3834,23 @@ static void HandlePolymorphicKeyedStoreCase(MacroAssembler* masm,
__ pop(vector);
__ pop(receiver);
__ pop(value);
- {
- // Put vector and slot beneath return address.
- __ push(vector);
- __ push(Operand(esp, 1 * kPointerSize)); // push return address
- __ mov(Operand(esp, 2 * kPointerSize), slot);
- }
+ // 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.
+ STATIC_ASSERT(StoreWithVectorDescriptor::kStackArgumentsCount == 3);
+ STATIC_ASSERT(StoreTransitionDescriptor::kStackArgumentsCount == 3);
+ STATIC_ASSERT(StoreWithVectorDescriptor::kParameterCount -
+ StoreWithVectorDescriptor::kValue ==
+ StoreTransitionDescriptor::kParameterCount -
+ StoreTransitionDescriptor::kValue);
+ STATIC_ASSERT(StoreWithVectorDescriptor::kParameterCount -
+ StoreWithVectorDescriptor::kSlot ==
+ StoreTransitionDescriptor::kParameterCount -
+ StoreTransitionDescriptor::kSlot);
+ STATIC_ASSERT(StoreWithVectorDescriptor::kParameterCount -
+ StoreWithVectorDescriptor::kVector ==
+ StoreTransitionDescriptor::kParameterCount -
+ StoreTransitionDescriptor::kVector);
__ jmp(Operand::StaticVariable(virtual_register));
__ bind(&prepare_next);
@@ -3845,6 +3878,28 @@ void KeyedStoreICStub::GenerateImpl(MacroAssembler* masm, bool in_frame) {
Register slot = StoreWithVectorDescriptor::SlotRegister(); // edi
Label miss;
+ if (StoreWithVectorDescriptor::kPassLastArgsOnStack) {
+ // Current stack layout:
+ // - esp[8] -- value
+ // - esp[4] -- slot
+ // - esp[0] -- return address
+ STATIC_ASSERT(StoreDescriptor::kStackArgumentsCount == 2);
+ STATIC_ASSERT(StoreWithVectorDescriptor::kStackArgumentsCount == 3);
+ if (in_frame) {
+ __ RecordComment("[ StoreDescriptor -> StoreWithVectorDescriptor");
+ // If the vector is not on the stack, then insert the vector beneath
+ // return address in order to prepare for calling handler with
+ // StoreWithVector calling convention.
+ __ push(Operand(esp, 0));
+ __ mov(Operand(esp, 4), StoreWithVectorDescriptor::VectorRegister());
+ __ RecordComment("]");
+ } else {
+ __ mov(vector, Operand(esp, 1 * kPointerSize));
+ }
+ __ mov(slot, Operand(esp, 2 * kPointerSize));
+ __ mov(value, Operand(esp, 3 * kPointerSize));
+ }
+
__ push(value);
Register scratch = value;

Powered by Google App Engine
This is Rietveld 408576698