Revision: 22387
Author:   [email protected]
Date:     Mon Jul 14 20:43:41 2014 UTC
Log:      Use the same registers for StoreIC and KeyedStoreIC.

Based on https://codereview.chromium.org/389283002 ("Use register parameters in ElementsTransitionGenerator") which must land first.

[email protected]

Review URL: https://codereview.chromium.org/390013002
http://code.google.com/p/v8/source/detail?r=22387

Modified:
 /branches/bleeding_edge/src/arm/code-stubs-arm.cc
 /branches/bleeding_edge/src/arm/ic-arm.cc
 /branches/bleeding_edge/src/arm/stub-cache-arm.cc
 /branches/bleeding_edge/src/arm64/code-stubs-arm64.cc
 /branches/bleeding_edge/src/arm64/ic-arm64.cc
 /branches/bleeding_edge/src/arm64/stub-cache-arm64.cc
 /branches/bleeding_edge/src/code-stubs-hydrogen.cc
 /branches/bleeding_edge/src/code-stubs.cc
 /branches/bleeding_edge/src/code-stubs.h
 /branches/bleeding_edge/src/ia32/code-stubs-ia32.cc
 /branches/bleeding_edge/src/ia32/ic-ia32.cc
 /branches/bleeding_edge/src/ia32/stub-cache-ia32.cc
 /branches/bleeding_edge/src/ic.h
 /branches/bleeding_edge/src/x64/code-stubs-x64.cc
 /branches/bleeding_edge/src/x64/ic-x64.cc
 /branches/bleeding_edge/src/x64/stub-cache-x64.cc

=======================================
--- /branches/bleeding_edge/src/arm/code-stubs-arm.cc Fri Jul 11 14:50:59 2014 UTC +++ /branches/bleeding_edge/src/arm/code-stubs-arm.cc Mon Jul 14 20:43:41 2014 UTC
@@ -219,14 +219,6 @@
     CodeStubInterfaceDescriptor* descriptor) {
   InitializeInternalArrayConstructorDescriptor(descriptor, -1);
 }
-
-
-void ElementsTransitionAndStoreStub::InitializeInterfaceDescriptor(
-    CodeStubInterfaceDescriptor* descriptor) {
-  Register registers[] = { r0, r3, r1, r2 };
-  descriptor->Initialize(ARRAY_SIZE(registers), registers,
-                         FUNCTION_ADDR(ElementsTransitionAndStoreIC_Miss));
-}


 void BinaryOpICStub::InitializeInterfaceDescriptor(
=======================================
--- /branches/bleeding_edge/src/arm/ic-arm.cc   Mon Jul 14 15:03:38 2014 UTC
+++ /branches/bleeding_edge/src/arm/ic-arm.cc   Mon Jul 14 20:43:41 2014 UTC
@@ -500,8 +500,8 @@
   Register receiver = ReceiverRegister();
   Register key = NameRegister();
   Register value = ValueRegister();
-  ASSERT(receiver.is(r2));
-  ASSERT(key.is(r1));
+  ASSERT(receiver.is(r1));
+  ASSERT(key.is(r2));
   ASSERT(value.is(r0));

   Label slow, notin;
@@ -552,9 +552,24 @@
 const Register StoreIC::ValueRegister() { return r0; }


-const Register KeyedStoreIC::ReceiverRegister() { return r2; }
-const Register KeyedStoreIC::NameRegister() { return r1; }
-const Register KeyedStoreIC::ValueRegister() { return r0; }
+const Register KeyedStoreIC::ReceiverRegister() {
+  return StoreIC::ReceiverRegister();
+}
+
+
+const Register KeyedStoreIC::NameRegister() {
+  return StoreIC::NameRegister();
+}
+
+
+const Register KeyedStoreIC::ValueRegister() {
+  return StoreIC::ValueRegister();
+}
+
+
+const Register KeyedStoreIC::MapRegister() {
+  return r3;
+}


 void KeyedLoadIC::GenerateRuntimeGetProperty(MacroAssembler* masm) {
@@ -1027,8 +1042,8 @@
   Register value = ValueRegister();
   Register key = NameRegister();
   Register receiver = ReceiverRegister();
-  ASSERT(receiver.is(r2));
-  ASSERT(key.is(r1));
+  ASSERT(receiver.is(r1));
+  ASSERT(key.is(r2));
   ASSERT(value.is(r0));
   Register receiver_map = r3;
   Register elements_map = r6;
=======================================
--- /branches/bleeding_edge/src/arm/stub-cache-arm.cc Fri Jul 11 14:50:59 2014 UTC +++ /branches/bleeding_edge/src/arm/stub-cache-arm.cc Mon Jul 14 20:43:41 2014 UTC
@@ -1294,10 +1294,11 @@


 Register* KeyedStoreStubCompiler::registers() {
-  // receiver, name, scratch1, scratch2, scratch3.
+  // receiver, name, scratch1/map, scratch2, scratch3.
   Register receiver = KeyedStoreIC::ReceiverRegister();
   Register name = KeyedStoreIC::NameRegister();
-  static Register registers[] = { receiver, name, r3, r4, r5 };
+  Register map = KeyedStoreIC::MapRegister();
+  static Register registers[] = { receiver, name, map, r4, r5 };
   return registers;
 }

@@ -1397,7 +1398,10 @@
   Label* smi_target = IncludesNumberType(types) ? &number_case : &miss;
   __ JumpIfSmi(receiver(), smi_target);

+  // Polymorphic keyed stores may use the map register
   Register map_reg = scratch1();
+  ASSERT(kind() != Code::KEYED_STORE_IC ||
+         map_reg.is(KeyedStoreIC::MapRegister()));

   int receiver_count = types->length();
   int number_of_handled_maps = 0;
=======================================
--- /branches/bleeding_edge/src/arm64/code-stubs-arm64.cc Fri Jul 11 14:50:59 2014 UTC +++ /branches/bleeding_edge/src/arm64/code-stubs-arm64.cc Mon Jul 14 20:43:41 2014 UTC
@@ -236,18 +236,6 @@
   descriptor->SetMissHandler(
       ExternalReference(IC_Utility(IC::kToBooleanIC_Miss), isolate()));
 }
-
-
-void ElementsTransitionAndStoreStub::InitializeInterfaceDescriptor(
-    CodeStubInterfaceDescriptor* descriptor) {
-  // x0: value
-  // x3: target map
-  // x1: key
-  // x2: receiver
-  Register registers[] = { x0, x3, x1, x2 };
-  descriptor->Initialize(ARRAY_SIZE(registers), registers,
-                         FUNCTION_ADDR(ElementsTransitionAndStoreIC_Miss));
-}


 void BinaryOpICStub::InitializeInterfaceDescriptor(
=======================================
--- /branches/bleeding_edge/src/arm64/ic-arm64.cc Mon Jul 14 15:03:38 2014 UTC +++ /branches/bleeding_edge/src/arm64/ic-arm64.cc Mon Jul 14 20:43:41 2014 UTC
@@ -506,8 +506,8 @@
   Register value = ValueRegister();
   Register key = NameRegister();
   Register receiver = ReceiverRegister();
-  ASSERT(receiver.is(x2));
-  ASSERT(key.is(x1));
+  ASSERT(receiver.is(x1));
+  ASSERT(key.is(x2));
   ASSERT(value.is(x0));

   Register map = x3;
@@ -574,9 +574,24 @@
 const Register StoreIC::ValueRegister() { return x0; }


-const Register KeyedStoreIC::ReceiverRegister() { return x2; }
-const Register KeyedStoreIC::NameRegister() { return x1; }
-const Register KeyedStoreIC::ValueRegister() { return x0; }
+const Register KeyedStoreIC::ReceiverRegister() {
+  return StoreIC::ReceiverRegister();
+}
+
+
+const Register KeyedStoreIC::NameRegister() {
+  return StoreIC::NameRegister();
+}
+
+
+const Register KeyedStoreIC::ValueRegister() {
+  return StoreIC::ValueRegister();
+}
+
+
+const Register KeyedStoreIC::MapRegister() {
+  return x3;
+}


 void KeyedLoadIC::GenerateRuntimeGetProperty(MacroAssembler* masm) {
@@ -1068,8 +1083,8 @@
   Register value = ValueRegister();
   Register key = NameRegister();
   Register receiver = ReceiverRegister();
-  ASSERT(receiver.is(x2));
-  ASSERT(key.is(x1));
+  ASSERT(receiver.is(x1));
+  ASSERT(key.is(x2));
   ASSERT(value.is(x0));

   Register receiver_map = x3;
=======================================
--- /branches/bleeding_edge/src/arm64/stub-cache-arm64.cc Fri Jul 11 14:50:59 2014 UTC +++ /branches/bleeding_edge/src/arm64/stub-cache-arm64.cc Mon Jul 14 20:43:41 2014 UTC
@@ -1276,10 +1276,11 @@


 Register* KeyedStoreStubCompiler::registers() {
-  // receiver, name, scratch1, scratch2, scratch3.
+  // receiver, name, scratch1/map, scratch2, scratch3.
   Register receiver = KeyedStoreIC::ReceiverRegister();
   Register name = KeyedStoreIC::NameRegister();
-  static Register registers[] = { receiver, name, x3, x4, x5 };
+  Register map = KeyedStoreIC::MapRegister();
+  static Register registers[] = { receiver, name, map, x4, x5 };
   return registers;
 }

@@ -1370,7 +1371,10 @@
   Label* smi_target = IncludesNumberType(types) ? &number_case : &miss;
   __ JumpIfSmi(receiver(), smi_target);

+  // Polymorphic keyed stores may use the map register
   Register map_reg = scratch1();
+  ASSERT(kind() != Code::KEYED_STORE_IC ||
+         map_reg.is(KeyedStoreIC::MapRegister()));
   __ Ldr(map_reg, FieldMemOperand(receiver(), HeapObject::kMapOffset));
   int receiver_count = types->length();
   int number_of_handled_maps = 0;
=======================================
--- /branches/bleeding_edge/src/code-stubs-hydrogen.cc Fri Jul 11 14:50:59 2014 UTC +++ /branches/bleeding_edge/src/code-stubs-hydrogen.cc Mon Jul 14 20:43:41 2014 UTC
@@ -1077,10 +1077,10 @@

 template<>
HValue* CodeStubGraphBuilder<ElementsTransitionAndStoreStub>::BuildCodeStub() {
-  HValue* value = GetParameter(0);
-  HValue* map = GetParameter(1);
-  HValue* key = GetParameter(2);
-  HValue* object = GetParameter(3);
+ HValue* value = GetParameter(ElementsTransitionAndStoreStub::kValueIndex);
+  HValue* map = GetParameter(ElementsTransitionAndStoreStub::kMapIndex);
+  HValue* key = GetParameter(ElementsTransitionAndStoreStub::kKeyIndex);
+ HValue* object = GetParameter(ElementsTransitionAndStoreStub::kObjectIndex);

   if (FLAG_trace_elements_transitions) {
     // Tracing elements transitions is the job of the runtime.
=======================================
--- /branches/bleeding_edge/src/code-stubs.cc   Fri Jul 11 14:50:59 2014 UTC
+++ /branches/bleeding_edge/src/code-stubs.cc   Mon Jul 14 20:43:41 2014 UTC
@@ -642,6 +642,17 @@
       ARRAY_SIZE(registers), registers,
       FUNCTION_ADDR(KeyedStoreIC_MissFromStubFailure));
 }
+
+
+void ElementsTransitionAndStoreStub::InitializeInterfaceDescriptor(
+    CodeStubInterfaceDescriptor* descriptor) {
+  Register registers[] = { ValueRegister(),
+                           MapRegister(),
+                           KeyRegister(),
+                           ObjectRegister() };
+  descriptor->Initialize(ARRAY_SIZE(registers), registers,
+                         FUNCTION_ADDR(ElementsTransitionAndStoreIC_Miss));
+}


 void StoreGlobalStub::InitializeInterfaceDescriptor(
=======================================
--- /branches/bleeding_edge/src/code-stubs.h    Fri Jul 11 14:50:59 2014 UTC
+++ /branches/bleeding_edge/src/code-stubs.h    Mon Jul 14 20:43:41 2014 UTC
@@ -2455,6 +2455,23 @@
   virtual void InitializeInterfaceDescriptor(
       CodeStubInterfaceDescriptor* descriptor) V8_OVERRIDE;

+  enum RegisterInfo {
+    kValueIndex,
+    kMapIndex,
+    kKeyIndex,
+    kObjectIndex,
+    kRegisterArgumentCount
+  };
+
+  static const Register ValueRegister() {
+    return KeyedStoreIC::ValueRegister();
+  }
+ static const Register MapRegister() { return KeyedStoreIC::MapRegister(); } + static const Register KeyRegister() { return KeyedStoreIC::NameRegister(); }
+  static const Register ObjectRegister() {
+    return KeyedStoreIC::ReceiverRegister();
+  }
+
  private:
   class FromBits:      public BitField<ElementsKind,          0, 8> {};
   class ToBits:        public BitField<ElementsKind,          8, 8> {};
=======================================
--- /branches/bleeding_edge/src/ia32/code-stubs-ia32.cc Fri Jul 11 14:50:59 2014 UTC +++ /branches/bleeding_edge/src/ia32/code-stubs-ia32.cc Mon Jul 14 20:43:41 2014 UTC
@@ -223,14 +223,6 @@
   descriptor->SetMissHandler(
       ExternalReference(IC_Utility(IC::kToBooleanIC_Miss), isolate()));
 }
-
-
-void ElementsTransitionAndStoreStub::InitializeInterfaceDescriptor(
-    CodeStubInterfaceDescriptor* descriptor) {
-  Register registers[] = { eax, ebx, ecx, edx };
-  descriptor->Initialize(ARRAY_SIZE(registers), registers,
-                         FUNCTION_ADDR(ElementsTransitionAndStoreIC_Miss));
-}


 void BinaryOpICStub::InitializeInterfaceDescriptor(
=======================================
--- /branches/bleeding_edge/src/ia32/ic-ia32.cc Mon Jul 14 15:03:38 2014 UTC
+++ /branches/bleeding_edge/src/ia32/ic-ia32.cc Mon Jul 14 20:43:41 2014 UTC
@@ -1039,6 +1039,11 @@
 const Register KeyedStoreIC::ValueRegister() {
   return StoreIC::ValueRegister();
 }
+
+
+const Register KeyedStoreIC::MapRegister() {
+  return ebx;
+}


 void KeyedLoadIC::GenerateRuntimeGetProperty(MacroAssembler* masm) {
=======================================
--- /branches/bleeding_edge/src/ia32/stub-cache-ia32.cc Fri Jul 11 14:50:59 2014 UTC +++ /branches/bleeding_edge/src/ia32/stub-cache-ia32.cc Mon Jul 14 20:43:41 2014 UTC
@@ -1314,10 +1314,11 @@


 Register* KeyedStoreStubCompiler::registers() {
-  // receiver, name, scratch1, scratch2, scratch3.
+  // receiver, name, scratch1/map, scratch2, scratch3.
   Register receiver = KeyedStoreIC::ReceiverRegister();
   Register name = KeyedStoreIC::NameRegister();
-  static Register registers[] = { receiver, name, ebx, edi, no_reg };
+  Register map = KeyedStoreIC::MapRegister();
+  static Register registers[] = { receiver, name, map, edi, no_reg };
   return registers;
 }

@@ -1418,7 +1419,10 @@
   Label* smi_target = IncludesNumberType(types) ? &number_case : &miss;
   __ JumpIfSmi(receiver(), smi_target);

+  // Polymorphic keyed stores may use the map register
   Register map_reg = scratch1();
+  ASSERT(kind() != Code::KEYED_STORE_IC ||
+         map_reg.is(KeyedStoreIC::MapRegister()));
   __ mov(map_reg, FieldOperand(receiver(), HeapObject::kMapOffset));
   int receiver_count = types->length();
   int number_of_handled_maps = 0;
=======================================
--- /branches/bleeding_edge/src/ic.h    Fri Jul 11 14:50:59 2014 UTC
+++ /branches/bleeding_edge/src/ic.h    Mon Jul 14 20:43:41 2014 UTC
@@ -705,6 +705,11 @@
   static const Register NameRegister();
   static const Register ValueRegister();

+  // The map register isn't part of the normal call specification, but
+  // ElementsTransitionAndStoreStub, used in polymorphic keyed store
+  // stub implementations requires it to be initialized.
+  static const Register MapRegister();
+
   KeyedStoreIC(FrameDepth depth, Isolate* isolate)
       : StoreIC(depth, isolate) {
     ASSERT(target()->is_keyed_store_stub());
=======================================
--- /branches/bleeding_edge/src/x64/code-stubs-x64.cc Fri Jul 11 14:50:59 2014 UTC +++ /branches/bleeding_edge/src/x64/code-stubs-x64.cc Mon Jul 14 20:43:41 2014 UTC
@@ -220,14 +220,6 @@
   descriptor->SetMissHandler(
       ExternalReference(IC_Utility(IC::kToBooleanIC_Miss), isolate()));
 }
-
-
-void ElementsTransitionAndStoreStub::InitializeInterfaceDescriptor(
-    CodeStubInterfaceDescriptor* descriptor) {
-  Register registers[] = { rax, rbx, rcx, rdx };
-  descriptor->Initialize(ARRAY_SIZE(registers), registers,
-                         FUNCTION_ADDR(ElementsTransitionAndStoreIC_Miss));
-}


 void BinaryOpICStub::InitializeInterfaceDescriptor(
=======================================
--- /branches/bleeding_edge/src/x64/ic-x64.cc   Mon Jul 14 15:03:38 2014 UTC
+++ /branches/bleeding_edge/src/x64/ic-x64.cc   Mon Jul 14 20:43:41 2014 UTC
@@ -1065,6 +1065,11 @@
 const Register KeyedStoreIC::ValueRegister() {
   return StoreIC::ValueRegister();
 }
+
+
+const Register KeyedStoreIC::MapRegister() {
+  return rbx;
+}


 void KeyedLoadIC::GenerateRuntimeGetProperty(MacroAssembler* masm) {
=======================================
--- /branches/bleeding_edge/src/x64/stub-cache-x64.cc Fri Jul 11 14:50:59 2014 UTC +++ /branches/bleeding_edge/src/x64/stub-cache-x64.cc Mon Jul 14 20:43:41 2014 UTC
@@ -1253,10 +1253,11 @@


 Register* KeyedStoreStubCompiler::registers() {
-  // receiver, name, scratch1, scratch2, scratch3.
+  // receiver, name, scratch1/map, scratch2, scratch3.
   Register receiver = KeyedStoreIC::ReceiverRegister();
   Register name = KeyedStoreIC::NameRegister();
-  static Register registers[] = { receiver, name, rbx, rdi, r8 };
+  Register map = KeyedStoreIC::MapRegister();
+  static Register registers[] = { receiver, name, map, rdi, r8 };
   return registers;
 }

@@ -1361,7 +1362,10 @@
   Label* smi_target = IncludesNumberType(types) ? &number_case : &miss;
   __ JumpIfSmi(receiver(), smi_target);

+  // Polymorphic keyed stores may use the map register
   Register map_reg = scratch1();
+  ASSERT(kind() != Code::KEYED_STORE_IC ||
+         map_reg.is(KeyedStoreIC::MapRegister()));
   __ movp(map_reg, FieldOperand(receiver(), HeapObject::kMapOffset));
   int receiver_count = types->length();
   int number_of_handled_maps = 0;

--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
--- You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to