Revision: 19744
Author:   [email protected]
Date:     Mon Mar 10 08:40:03 2014 UTC
Log:      allowed keyed store callbacks ic generation

[email protected]

BUG=

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

Modified:
 /branches/bleeding_edge/src/a64/stub-cache-a64.cc
 /branches/bleeding_edge/src/arm/stub-cache-arm.cc
 /branches/bleeding_edge/src/builtins.cc
 /branches/bleeding_edge/src/ia32/stub-cache-ia32.cc
 /branches/bleeding_edge/src/ic.cc
 /branches/bleeding_edge/src/stub-cache.cc
 /branches/bleeding_edge/src/stub-cache.h
 /branches/bleeding_edge/src/x64/stub-cache-x64.cc

=======================================
--- /branches/bleeding_edge/src/a64/stub-cache-a64.cc Tue Mar 4 12:48:17 2014 UTC +++ /branches/bleeding_edge/src/a64/stub-cache-a64.cc Mon Mar 10 08:40:03 2014 UTC
@@ -1239,22 +1239,18 @@
 void StoreStubCompiler::GenerateStoreViaSetter(
     MacroAssembler* masm,
     Handle<HeapType> type,
+    Register receiver,
     Handle<JSFunction> setter) {
   // ----------- S t a t e -------------
-  //  -- x0    : value
-  //  -- x1    : receiver
-  //  -- x2    : name
   //  -- lr    : return address
   // -----------------------------------
-  Register value = x0;
-  Register receiver = x1;
   Label miss;

   {
     FrameScope scope(masm, StackFrame::INTERNAL);

     // Save value register, so we can restore it later.
-    __ Push(value);
+    __ Push(value());

     if (!setter.is_null()) {
       // Call the JavaScript setter with receiver and value on the stack.
@@ -1264,7 +1260,7 @@
                FieldMemOperand(
                    receiver, JSGlobalObject::kGlobalReceiverOffset));
       }
-      __ Push(receiver, value);
+      __ Push(receiver, value());
       ParameterCount actual(1);
       ParameterCount expected(setter);
       __ InvokeFunction(setter, expected, actual,
@@ -1276,7 +1272,7 @@
     }

// We have to return the passed value, not the return value of the setter.
-    __ Pop(value);
+    __ Pop(x0);

     // Restore context register.
     __ Ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset));
@@ -1341,18 +1337,23 @@
   static Register registers[] = { x1, x0, x2, x3, x4, x5 };
   return registers;
 }
+
+
+Register StoreStubCompiler::value() {
+  return x0;
+}


 Register* StoreStubCompiler::registers() {
-  // receiver, name, value, scratch1, scratch2, scratch3.
-  static Register registers[] = { x1, x2, x0, x3, x4, x5 };
+  // receiver, value, scratch1, scratch2, scratch3.
+  static Register registers[] = { x1, x2, x3, x4, x5 };
   return registers;
 }


 Register* KeyedStoreStubCompiler::registers() {
-  // receiver, name, value, scratch1, scratch2, scratch3.
-  static Register registers[] = { x2, x1, x0, x3, x4, x5 };
+  // receiver, name, scratch1, scratch2, scratch3.
+  static Register registers[] = { x2, x1, x3, x4, x5 };
   return registers;
 }

=======================================
--- /branches/bleeding_edge/src/arm/stub-cache-arm.cc Tue Mar 4 12:48:17 2014 UTC +++ /branches/bleeding_edge/src/arm/stub-cache-arm.cc Mon Mar 10 08:40:03 2014 UTC
@@ -1256,20 +1256,16 @@
 void StoreStubCompiler::GenerateStoreViaSetter(
     MacroAssembler* masm,
     Handle<HeapType> type,
+    Register receiver,
     Handle<JSFunction> setter) {
   // ----------- S t a t e -------------
-  //  -- r0    : value
-  //  -- r1    : receiver
-  //  -- r2    : name
   //  -- lr    : return address
   // -----------------------------------
   {
     FrameScope scope(masm, StackFrame::INTERNAL);
-    Register receiver = r1;
-    Register value = r0;

     // Save value register, so we can restore it later.
-    __ push(value);
+    __ push(value());

     if (!setter.is_null()) {
       // Call the JavaScript setter with receiver and value on the stack.
@@ -1279,7 +1275,7 @@
                FieldMemOperand(
                    receiver, JSGlobalObject::kGlobalReceiverOffset));
       }
-      __ Push(receiver, value);
+      __ Push(receiver, value());
       ParameterCount actual(1);
       ParameterCount expected(setter);
       __ InvokeFunction(setter, expected, actual,
@@ -1365,18 +1361,23 @@
   static Register registers[] = { r1, r0, r2, r3, r4, r5 };
   return registers;
 }
+
+
+Register StoreStubCompiler::value() {
+  return r0;
+}


 Register* StoreStubCompiler::registers() {
-  // receiver, name, value, scratch1, scratch2, scratch3.
-  static Register registers[] = { r1, r2, r0, r3, r4, r5 };
+  // receiver, name, scratch1, scratch2, scratch3.
+  static Register registers[] = { r1, r2, r3, r4, r5 };
   return registers;
 }


 Register* KeyedStoreStubCompiler::registers() {
-  // receiver, name, value, scratch1, scratch2, scratch3.
-  static Register registers[] = { r2, r1, r0, r3, r4, r5 };
+  // receiver, name, scratch1, scratch2, scratch3.
+  static Register registers[] = { r2, r1, r3, r4, r5 };
   return registers;
 }

=======================================
--- /branches/bleeding_edge/src/builtins.cc     Fri Feb 14 15:15:08 2014 UTC
+++ /branches/bleeding_edge/src/builtins.cc     Mon Mar 10 08:40:03 2014 UTC
@@ -1320,9 +1320,7 @@


 static void Generate_LoadIC_Getter_ForDeopt(MacroAssembler* masm) {
-  LoadStubCompiler::GenerateLoadViaGetter(
-      masm, Handle<HeapType>::null(),
-      LoadStubCompiler::registers()[0], Handle<JSFunction>());
+  LoadStubCompiler::GenerateLoadViaGetterForDeopt(masm);
 }


@@ -1387,8 +1385,7 @@


 static void Generate_StoreIC_Setter_ForDeopt(MacroAssembler* masm) {
-  StoreStubCompiler::GenerateStoreViaSetter(
-      masm, Handle<HeapType>::null(), Handle<JSFunction>());
+  StoreStubCompiler::GenerateStoreViaSetterForDeopt(masm);
 }


=======================================
--- /branches/bleeding_edge/src/ia32/stub-cache-ia32.cc Tue Mar 4 12:48:17 2014 UTC +++ /branches/bleeding_edge/src/ia32/stub-cache-ia32.cc Mon Mar 10 08:40:03 2014 UTC
@@ -1259,30 +1259,26 @@
 void StoreStubCompiler::GenerateStoreViaSetter(
     MacroAssembler* masm,
     Handle<HeapType> type,
+    Register receiver,
     Handle<JSFunction> setter) {
   // ----------- S t a t e -------------
-  //  -- eax    : value
-  //  -- ecx    : name
-  //  -- edx    : receiver
   //  -- esp[0] : return address
   // -----------------------------------
   {
     FrameScope scope(masm, StackFrame::INTERNAL);
-    Register receiver = edx;
-    Register value = eax;

     // Save value register, so we can restore it later.
-    __ push(value);
+    __ push(value());

     if (!setter.is_null()) {
       // Call the JavaScript setter with receiver and value on the stack.
       if (IC::TypeToMap(*type, masm->isolate())->IsJSGlobalObjectMap()) {
         // Swap in the global receiver.
         __ mov(receiver,
- FieldOperand(receiver, JSGlobalObject::kGlobalReceiverOffset)); + FieldOperand(receiver, JSGlobalObject::kGlobalReceiverOffset));
       }
       __ push(receiver);
-      __ push(value);
+      __ push(value());
       ParameterCount actual(1);
       ParameterCount expected(setter);
       __ InvokeFunction(setter, expected, actual,
@@ -1381,18 +1377,23 @@
   static Register registers[] = { edx, ecx, ebx, eax, edi, no_reg };
   return registers;
 }
+
+
+Register StoreStubCompiler::value() {
+  return eax;
+}


 Register* StoreStubCompiler::registers() {
-  // receiver, name, value, scratch1, scratch2, scratch3.
-  static Register registers[] = { edx, ecx, eax, ebx, edi, no_reg };
+  // receiver, name, scratch1, scratch2, scratch3.
+  static Register registers[] = { edx, ecx, ebx, edi, no_reg };
   return registers;
 }


 Register* KeyedStoreStubCompiler::registers() {
-  // receiver, name, value, scratch1, scratch2, scratch3.
-  static Register registers[] = { edx, ecx, eax, ebx, edi, no_reg };
+  // receiver, name, scratch1, scratch2, scratch3.
+  static Register registers[] = { edx, ecx, ebx, edi, no_reg };
   return registers;
 }

=======================================
--- /branches/bleeding_edge/src/ic.cc   Sat Mar  8 04:41:06 2014 UTC
+++ /branches/bleeding_edge/src/ic.cc   Mon Mar 10 08:40:03 2014 UTC
@@ -1353,7 +1353,6 @@
       ASSERT(holder.is_identical_to(receiver));
       return isolate()->builtins()->StoreIC_Normal();
     case CALLBACKS: {
-      if (kind() == Code::KEYED_STORE_IC) break;
       Handle<Object> callback(lookup->GetCallbackObject(), isolate());
       if (callback->IsExecutableAccessorInfo()) {
         Handle<ExecutableAccessorInfo> info =
=======================================
--- /branches/bleeding_edge/src/stub-cache.cc   Tue Mar  4 12:43:05 2014 UTC
+++ /branches/bleeding_edge/src/stub-cache.cc   Mon Mar 10 08:40:03 2014 UTC
@@ -1125,7 +1125,7 @@
     Handle<JSFunction> setter) {
   Handle<HeapType> type = IC::CurrentTypeOf(object, isolate());
   HandlerFrontend(type, receiver(), holder, name);
-  GenerateStoreViaSetter(masm(), type, setter);
+  GenerateStoreViaSetter(masm(), type, receiver(), setter);

   return GetCode(kind(), Code::FAST, name);
 }
=======================================
--- /branches/bleeding_edge/src/stub-cache.h    Thu Feb 20 12:40:34 2014 UTC
+++ /branches/bleeding_edge/src/stub-cache.h    Mon Mar 10 08:40:03 2014 UTC
@@ -522,11 +522,11 @@
   }
   void JitEvent(Handle<Name> name, Handle<Code> code);

-  virtual Register receiver() = 0;
-  virtual Register name() = 0;
-  virtual Register scratch1() = 0;
-  virtual Register scratch2() = 0;
-  virtual Register scratch3() = 0;
+  Register receiver() { return registers_[0]; }
+  Register name()     { return registers_[1]; }
+  Register scratch1() { return registers_[2]; }
+  Register scratch2() { return registers_[3]; }
+  Register scratch3() { return registers_[4]; }

   void InitializeRegisters();

@@ -583,6 +583,11 @@
                                     Register receiver,
                                     Handle<JSFunction> getter);

+  static void GenerateLoadViaGetterForDeopt(MacroAssembler* masm) {
+    GenerateLoadViaGetter(
+        masm, Handle<HeapType>::null(), no_reg, Handle<JSFunction>());
+  }
+
   Handle<Code> CompileLoadNonexistent(Handle<HeapType> type,
                                       Handle<JSObject> last,
                                       Handle<Name> name);
@@ -593,8 +598,6 @@
                                  Handle<Name> name,
                                  bool is_dont_delete);

-  static Register* registers();
-
  protected:
   ContextualMode contextual_mode() {
     return LoadIC::GetContextualMode(extra_state());
@@ -636,12 +639,10 @@
                                    Handle<Name> name,
                                    LookupResult* lookup);

-  virtual Register receiver() { return registers_[0]; }
-  virtual Register name()     { return registers_[1]; }
-  virtual Register scratch1() { return registers_[2]; }
-  virtual Register scratch2() { return registers_[3]; }
-  virtual Register scratch3() { return registers_[4]; }
+ private:
+  static Register* registers();
   Register scratch4() { return registers_[5]; }
+  friend class BaseLoadStoreStubCompiler;
 };


@@ -726,8 +727,14 @@

   static void GenerateStoreViaSetter(MacroAssembler* masm,
                                      Handle<HeapType> type,
+                                     Register receiver,
                                      Handle<JSFunction> setter);

+  static void GenerateStoreViaSetterForDeopt(MacroAssembler* masm) {
+    GenerateStoreViaSetter(
+        masm, Handle<HeapType>::null(), no_reg, Handle<JSFunction>());
+  }
+
   Handle<Code> CompileStoreViaSetter(Handle<JSObject> object,
                                      Handle<JSObject> holder,
                                      Handle<Name> name,
@@ -757,17 +764,9 @@
                            Label* label,
                            Handle<Name> name);

-  virtual Register receiver() { return registers_[0]; }
-  virtual Register name()     { return registers_[1]; }
-  Register value()    { return registers_[2]; }
-  virtual Register scratch1() { return registers_[3]; }
-  virtual Register scratch2() { return registers_[4]; }
-  virtual Register scratch3() { return registers_[5]; }
-
- protected:
-  static Register* registers();
-
  private:
+  static Register* registers();
+  static Register value();
   friend class BaseLoadStoreStubCompiler;
 };

@@ -795,9 +794,7 @@
     return KeyedStoreIC::GetKeyedAccessStoreMode(extra_state());
   }

-  Register transition_map() {
-    return registers()[3];
-  }
+  Register transition_map() { return scratch1(); }

   friend class BaseLoadStoreStubCompiler;
 };
=======================================
--- /branches/bleeding_edge/src/x64/stub-cache-x64.cc Tue Mar 4 12:48:17 2014 UTC +++ /branches/bleeding_edge/src/x64/stub-cache-x64.cc Mon Mar 10 08:40:03 2014 UTC
@@ -1154,20 +1154,16 @@
 void StoreStubCompiler::GenerateStoreViaSetter(
     MacroAssembler* masm,
     Handle<HeapType> type,
+    Register receiver,
     Handle<JSFunction> setter) {
   // ----------- S t a t e -------------
-  //  -- rax    : value
-  //  -- rcx    : name
-  //  -- rdx    : receiver
   //  -- rsp[0] : return address
   // -----------------------------------
   {
     FrameScope scope(masm, StackFrame::INTERNAL);
-    Register receiver = rdx;
-    Register value = rax;

     // Save value register, so we can restore it later.
-    __ push(value);
+    __ push(value());

     if (!setter.is_null()) {
       // Call the JavaScript setter with receiver and value on the stack.
@@ -1177,7 +1173,7 @@
FieldOperand(receiver, JSGlobalObject::kGlobalReceiverOffset));
       }
       __ push(receiver);
-      __ push(value);
+      __ push(value());
       ParameterCount actual(1);
       ParameterCount expected(setter);
       __ InvokeFunction(setter, expected, actual,
@@ -1283,18 +1279,23 @@
   static Register registers[] = { rdx, rax, rbx, rcx, rdi, r8 };
   return registers;
 }
+
+
+Register StoreStubCompiler::value() {
+  return rax;
+}


 Register* StoreStubCompiler::registers() {
-  // receiver, name, value, scratch1, scratch2, scratch3.
-  static Register registers[] = { rdx, rcx, rax, rbx, rdi, r8 };
+  // receiver, name, scratch1, scratch2, scratch3.
+  static Register registers[] = { rdx, rcx, rbx, rdi, r8 };
   return registers;
 }


 Register* KeyedStoreStubCompiler::registers() {
-  // receiver, name, value, scratch1, scratch2, scratch3.
-  static Register registers[] = { rdx, rcx, rax, rbx, rdi, r8 };
+  // receiver, name, scratch1, scratch2, scratch3.
+  static Register registers[] = { rdx, rcx, rbx, rdi, r8 };
   return registers;
 }

--
--
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