Revision: 22899
Author:   [email protected]
Date:     Wed Aug  6 08:02:21 2014 UTC
Log:      Load constants from the DescriptorArray

BUG=
[email protected]

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

Modified:
 /branches/bleeding_edge/src/arm/stub-cache-arm.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/stub-cache-ia32.cc
 /branches/bleeding_edge/src/ic.cc
 /branches/bleeding_edge/src/lookup.cc
 /branches/bleeding_edge/src/lookup.h
 /branches/bleeding_edge/src/mips/stub-cache-mips.cc
 /branches/bleeding_edge/src/mips64/stub-cache-mips64.cc
 /branches/bleeding_edge/src/objects-inl.h
 /branches/bleeding_edge/src/objects.h
 /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/x87/stub-cache-x87.cc

=======================================
--- /branches/bleeding_edge/src/arm/stub-cache-arm.cc Tue Aug 5 10:44:17 2014 UTC +++ /branches/bleeding_edge/src/arm/stub-cache-arm.cc Wed Aug 6 08:02:21 2014 UTC
@@ -839,14 +839,6 @@
     __ bind(&success);
   }
 }
-
-
-void NamedLoadHandlerCompiler::GenerateLoadField(
-    Register reg, FieldIndex field, Representation representation) {
-  if (!reg.is(receiver())) __ mov(receiver(), reg);
-  LoadFieldStub stub(isolate(), field);
-  GenerateTailCall(masm(), stub.GetCode());
-}


 void NamedLoadHandlerCompiler::GenerateLoadConstant(Handle<Object> value) {
=======================================
--- /branches/bleeding_edge/src/arm64/stub-cache-arm64.cc Tue Aug 5 10:44:17 2014 UTC +++ /branches/bleeding_edge/src/arm64/stub-cache-arm64.cc Wed Aug 6 08:02:21 2014 UTC
@@ -795,21 +795,6 @@
     __ Bind(&success);
   }
 }
-
-
-void NamedLoadHandlerCompiler::GenerateLoadField(
-    Register reg, FieldIndex field, Representation representation) {
-  __ Mov(receiver(), reg);
-  LoadFieldStub stub(isolate(), field);
-  GenerateTailCall(masm(), stub.GetCode());
-}
-
-
-void NamedLoadHandlerCompiler::GenerateLoadConstant(Handle<Object> value) {
-  // Return the constant value.
-  __ LoadObject(x0, value);
-  __ Ret();
-}


 void NamedLoadHandlerCompiler::GenerateLoadCallback(
=======================================
--- /branches/bleeding_edge/src/code-stubs-hydrogen.cc Mon Aug 4 11:34:54 2014 UTC +++ /branches/bleeding_edge/src/code-stubs-hydrogen.cc Wed Aug 6 08:02:21 2014 UTC
@@ -590,7 +590,24 @@
 }


-template<>
+template <>
+HValue* CodeStubGraphBuilder<LoadConstantStub>::BuildCodeStub() {
+  HValue* map = AddLoadMap(GetParameter(0), NULL);
+ HObjectAccess descriptors_access = HObjectAccess::ForObservableJSObjectOffset(
+      Map::kDescriptorsOffset, Representation::Tagged());
+  HValue* descriptors =
+ Add<HLoadNamedField>(map, static_cast<HValue*>(NULL), descriptors_access);
+  HObjectAccess value_access = HObjectAccess::ForObservableJSObjectOffset(
+      DescriptorArray::GetValueOffset(casted_stub()->descriptor()));
+  return Add<HLoadNamedField>(descriptors, static_cast<HValue*>(NULL),
+                              value_access);
+}
+
+
+Handle<Code> LoadConstantStub::GenerateCode() { return DoGenerateCode(this); }
+
+
+template <>
 HValue* CodeStubGraphBuilder<StringLengthStub>::BuildCodeStub() {
   HValue* string = BuildLoadNamedField(GetParameter(0),
       FieldIndex::ForInObjectOffset(JSValue::kValueOffset));
=======================================
--- /branches/bleeding_edge/src/code-stubs.cc   Mon Aug  4 11:34:54 2014 UTC
+++ /branches/bleeding_edge/src/code-stubs.cc   Wed Aug  6 08:02:21 2014 UTC
@@ -613,20 +613,20 @@
 }


-void LoadFieldStub::InitializeInterfaceDescriptor(
+void HandlerStub::InitializeInterfaceDescriptor(
     CodeStubInterfaceDescriptor* descriptor) {
-  Register registers[] = { InterfaceDescriptor::ContextRegister(),
-                           LoadIC::ReceiverRegister() };
-  descriptor->Initialize(MajorKey(), ARRAY_SIZE(registers), registers);
-}
-
-
-void StringLengthStub::InitializeInterfaceDescriptor(
-    CodeStubInterfaceDescriptor* descriptor) {
-  Register registers[] = { InterfaceDescriptor::ContextRegister(),
-                           LoadIC::ReceiverRegister(),
-                           LoadIC::NameRegister() };
-  descriptor->Initialize(MajorKey(), ARRAY_SIZE(registers), registers);
+  if (kind() == Code::LOAD_IC) {
+    Register registers[] = {InterfaceDescriptor::ContextRegister(),
+ LoadIC::ReceiverRegister(), LoadIC::NameRegister()};
+    descriptor->Initialize(MajorKey(), ARRAY_SIZE(registers), registers);
+  } else {
+    DCHECK_EQ(Code::STORE_IC, kind());
+    Register registers[] = {InterfaceDescriptor::ContextRegister(),
+                            StoreIC::ReceiverRegister(),
+ StoreIC::NameRegister(), StoreIC::ValueRegister()};
+    descriptor->Initialize(MajorKey(), ARRAY_SIZE(registers), registers,
+                           FUNCTION_ADDR(StoreIC_MissFromStubFailure));
+  }
 }


@@ -651,17 +651,6 @@
   descriptor->Initialize(MajorKey(), ARRAY_SIZE(registers), registers,
                          FUNCTION_ADDR(ElementsTransitionAndStoreIC_Miss));
 }
-
-
-void StoreGlobalStub::InitializeInterfaceDescriptor(
-    CodeStubInterfaceDescriptor* descriptor) {
-  Register registers[] = { InterfaceDescriptor::ContextRegister(),
-                           StoreIC::ReceiverRegister(),
-                           StoreIC::NameRegister(),
-                           StoreIC::ValueRegister() };
-  descriptor->Initialize(MajorKey(), ARRAY_SIZE(registers), registers,
-                         FUNCTION_ADDR(StoreIC_MissFromStubFailure));
-}


 void InstanceofStub::InitializeInterfaceDescriptor(
=======================================
--- /branches/bleeding_edge/src/code-stubs.h    Tue Aug  5 12:32:49 2014 UTC
+++ /branches/bleeding_edge/src/code-stubs.h    Wed Aug  6 08:02:21 2014 UTC
@@ -76,6 +76,7 @@
   V(CallApiGetter)                          \
   /* IC Handler stubs */                    \
   V(LoadField)                              \
+  V(LoadConstant)                           \
   V(StringLength)

 // List of code stubs only used on ARM 32 bits platforms.
@@ -902,6 +903,9 @@
   virtual Code::Kind GetCodeKind() const { return Code::HANDLER; }
   virtual ExtraICState GetExtraICState() const { return kind(); }
   virtual InlineCacheState GetICState() { return MONOMORPHIC; }
+
+  virtual void InitializeInterfaceDescriptor(
+      CodeStubInterfaceDescriptor* descriptor) V8_OVERRIDE;

  protected:
   explicit HandlerStub(Isolate* isolate)
@@ -922,9 +926,6 @@

   virtual Handle<Code> GenerateCode() V8_OVERRIDE;

-  virtual void InitializeInterfaceDescriptor(
-      CodeStubInterfaceDescriptor* descriptor) V8_OVERRIDE;
-
   Representation representation() {
     if (unboxed_double()) return Representation::Double();
     return Representation::Tagged();
@@ -945,12 +946,30 @@
 };


+class LoadConstantStub : public HandlerStub {
+ public:
+ LoadConstantStub(Isolate* isolate, int descriptor) : HandlerStub(isolate) {
+    bit_field_ = descriptor;
+  }
+
+  virtual Handle<Code> GenerateCode() V8_OVERRIDE;
+
+  int descriptor() const { return bit_field_; }
+
+ protected:
+  explicit LoadConstantStub(Isolate* isolate);
+  virtual Code::Kind kind() const { return Code::LOAD_IC; }
+  virtual Code::StubType GetStubType() { return Code::FAST; }
+
+ private:
+  virtual CodeStub::Major MajorKey() const { return LoadConstant; }
+};
+
+
 class StringLengthStub: public HandlerStub {
  public:
   explicit StringLengthStub(Isolate* isolate) : HandlerStub(isolate) {}
   virtual Handle<Code> GenerateCode() V8_OVERRIDE;
-  virtual void InitializeInterfaceDescriptor(
-      CodeStubInterfaceDescriptor* descriptor) V8_OVERRIDE;

  protected:
   virtual Code::Kind kind() const { return Code::LOAD_IC; }
@@ -992,9 +1011,6 @@

   virtual Handle<Code> GenerateCode() V8_OVERRIDE;

-  virtual void InitializeInterfaceDescriptor(
-      CodeStubInterfaceDescriptor* descriptor) V8_OVERRIDE;
-
   bool is_constant() const {
     return IsConstantBits::decode(bit_field_);
   }
=======================================
--- /branches/bleeding_edge/src/ia32/stub-cache-ia32.cc Tue Aug 5 10:44:17 2014 UTC +++ /branches/bleeding_edge/src/ia32/stub-cache-ia32.cc Wed Aug 6 08:02:21 2014 UTC
@@ -808,14 +808,6 @@
     __ bind(&success);
   }
 }
-
-
-void NamedLoadHandlerCompiler::GenerateLoadField(
-    Register reg, FieldIndex field, Representation representation) {
-  if (!reg.is(receiver())) __ mov(receiver(), reg);
-  LoadFieldStub stub(isolate(), field);
-  GenerateTailCall(masm(), stub.GetCode());
-}


 void NamedLoadHandlerCompiler::GenerateLoadCallback(
=======================================
--- /branches/bleeding_edge/src/ic.cc   Tue Aug  5 17:06:01 2014 UTC
+++ /branches/bleeding_edge/src/ic.cc   Wed Aug  6 08:02:21 2014 UTC
@@ -1089,13 +1089,16 @@
     if (receiver_is_holder) {
       return SimpleFieldLoad(field);
     }
- return compiler.CompileLoadField(name, field, lookup->representation());
+    return compiler.CompileLoadField(name, field);
   }

   // -------------- Constant properties --------------
   DCHECK(lookup->property_details().type() == CONSTANT);
-  Handle<Object> constant = lookup->GetDataValue();
-  return compiler.CompileLoadConstant(name, constant);
+  if (receiver_is_holder) {
+    LoadConstantStub stub(isolate(), lookup->GetConstantIndex());
+    return stub.GetCode();
+  }
+  return compiler.CompileLoadConstant(name, lookup->GetConstantIndex());
 }


=======================================
--- /branches/bleeding_edge/src/lookup.cc       Tue Aug  5 09:32:55 2014 UTC
+++ /branches/bleeding_edge/src/lookup.cc       Wed Aug  6 08:02:21 2014 UTC
@@ -203,10 +203,20 @@
   }
   return handle(result, isolate_);
 }
+
+
+int LookupIterator::GetConstantIndex() const {
+  DCHECK(has_property_);
+  DCHECK_EQ(DESCRIPTOR, property_encoding_);
+  DCHECK_EQ(v8::internal::CONSTANT, property_details_.type());
+  return descriptor_number();
+}


 FieldIndex LookupIterator::GetFieldIndex() const {
-  DCHECK_EQ(PROPERTY, state_);
+  DCHECK(has_property_);
+  DCHECK_EQ(DESCRIPTOR, property_encoding_);
+  DCHECK_EQ(v8::internal::FIELD, property_details_.type());
   int index =
holder_map()->instance_descriptors()->GetFieldIndex(descriptor_number());
   bool is_double = representation().IsDouble();
=======================================
--- /branches/bleeding_edge/src/lookup.h        Tue Aug  5 09:32:55 2014 UTC
+++ /branches/bleeding_edge/src/lookup.h        Wed Aug  6 08:02:21 2014 UTC
@@ -140,6 +140,7 @@
     return property_details().representation();
   }
   FieldIndex GetFieldIndex() const;
+  int GetConstantIndex() const;
   Handle<PropertyCell> GetPropertyCell() const;
   Handle<Object> GetAccessors() const;
   Handle<Object> GetDataValue() const;
=======================================
--- /branches/bleeding_edge/src/mips/stub-cache-mips.cc Tue Aug 5 10:44:17 2014 UTC +++ /branches/bleeding_edge/src/mips/stub-cache-mips.cc Wed Aug 6 08:02:21 2014 UTC
@@ -838,14 +838,6 @@
     __ bind(&success);
   }
 }
-
-
-void NamedLoadHandlerCompiler::GenerateLoadField(
-    Register reg, FieldIndex field, Representation representation) {
-  if (!reg.is(receiver())) __ mov(receiver(), reg);
-  LoadFieldStub stub(isolate(), field);
-  GenerateTailCall(masm(), stub.GetCode());
-}


 void NamedLoadHandlerCompiler::GenerateLoadConstant(Handle<Object> value) {
=======================================
--- /branches/bleeding_edge/src/mips64/stub-cache-mips64.cc Tue Aug 5 10:44:17 2014 UTC +++ /branches/bleeding_edge/src/mips64/stub-cache-mips64.cc Wed Aug 6 08:02:21 2014 UTC
@@ -842,14 +842,6 @@
     __ bind(&success);
   }
 }
-
-
-void NamedLoadHandlerCompiler::GenerateLoadField(
-    Register reg, FieldIndex field, Representation representation) {
-  if (!reg.is(receiver())) __ mov(receiver(), reg);
-  LoadFieldStub stub(isolate(), field);
-  GenerateTailCall(masm(), stub.GetCode());
-}


 void NamedLoadHandlerCompiler::GenerateLoadConstant(Handle<Object> value) {
=======================================
--- /branches/bleeding_edge/src/objects-inl.h   Tue Aug  5 17:06:01 2014 UTC
+++ /branches/bleeding_edge/src/objects-inl.h   Wed Aug  6 08:02:21 2014 UTC
@@ -2980,6 +2980,11 @@
   DCHECK(descriptor_number < number_of_descriptors());
   return RawFieldOfElementAt(ToValueIndex(descriptor_number));
 }
+
+
+int DescriptorArray::GetValueOffset(int descriptor_number) {
+  return OffsetOfElementAt(ToValueIndex(descriptor_number));
+}


 Object* DescriptorArray::GetValue(int descriptor_number) {
=======================================
--- /branches/bleeding_edge/src/objects.h       Tue Aug  5 17:06:01 2014 UTC
+++ /branches/bleeding_edge/src/objects.h       Wed Aug  6 08:02:21 2014 UTC
@@ -3417,6 +3417,7 @@
   inline Object* GetValue(int descriptor_number);
   inline void SetValue(int descriptor_number, Object* value);
   inline Object** GetValueSlot(int descriptor_number);
+  static inline int GetValueOffset(int descriptor_number);
   inline Object** GetDescriptorStartSlot(int descriptor_number);
   inline Object** GetDescriptorEndSlot(int descriptor_number);
   inline PropertyDetails GetDetails(int descriptor_number);
=======================================
--- /branches/bleeding_edge/src/stub-cache.cc   Tue Aug  5 10:27:10 2014 UTC
+++ /branches/bleeding_edge/src/stub-cache.cc   Wed Aug  6 08:02:21 2014 UTC
@@ -842,18 +842,22 @@
 }


-Handle<Code> NamedLoadHandlerCompiler::CompileLoadField(
-    Handle<Name> name, FieldIndex field, Representation representation) {
+Handle<Code> NamedLoadHandlerCompiler::CompileLoadField(Handle<Name> name,
+                                                        FieldIndex field) {
   Register reg = Frontend(receiver(), name);
-  GenerateLoadField(reg, field, representation);
+  __ Move(receiver(), reg);
+  LoadFieldStub stub(isolate(), field);
+  GenerateTailCall(masm(), stub.GetCode());
   return GetCode(kind(), Code::FAST, name);
 }


-Handle<Code> NamedLoadHandlerCompiler::CompileLoadConstant(
-    Handle<Name> name, Handle<Object> value) {
-  Frontend(receiver(), name);
-  GenerateLoadConstant(value);
+Handle<Code> NamedLoadHandlerCompiler::CompileLoadConstant(Handle<Name> name, + int constant_index) {
+  Register reg = Frontend(receiver(), name);
+  __ Move(receiver(), reg);
+  LoadConstantStub stub(isolate(), constant_index);
+  GenerateTailCall(masm(), stub.GetCode());
   return GetCode(kind(), Code::FAST, name);
 }

@@ -917,7 +921,9 @@
   Register reg = Frontend(interceptor_reg, name);

   if (lookup->IsField()) {
- GenerateLoadField(reg, lookup->GetFieldIndex(), lookup->representation());
+    __ Move(receiver(), reg);
+    LoadFieldStub stub(isolate(), lookup->GetFieldIndex());
+    GenerateTailCall(masm(), stub.GetCode());
   } else {
     DCHECK(lookup->type() == CALLBACKS);
     Handle<ExecutableAccessorInfo> callback(
=======================================
--- /branches/bleeding_edge/src/stub-cache.h    Tue Aug  5 10:27:10 2014 UTC
+++ /branches/bleeding_edge/src/stub-cache.h    Wed Aug  6 08:02:21 2014 UTC
@@ -463,8 +463,7 @@

   virtual ~NamedLoadHandlerCompiler() {}

-  Handle<Code> CompileLoadField(Handle<Name> name, FieldIndex index,
-                                Representation representation);
+  Handle<Code> CompileLoadField(Handle<Name> name, FieldIndex index);

   Handle<Code> CompileLoadCallback(Handle<Name> name,
Handle<ExecutableAccessorInfo> callback);
@@ -472,7 +471,7 @@
   Handle<Code> CompileLoadCallback(Handle<Name> name,
const CallOptimization& call_optimization);

- Handle<Code> CompileLoadConstant(Handle<Name> name, Handle<Object> value);
+  Handle<Code> CompileLoadConstant(Handle<Name> name, int constant_index);

   Handle<Code> CompileLoadInterceptor(Handle<Name> name);

@@ -519,9 +518,6 @@

  private:
   Handle<Code> CompileLoadNonexistent(Handle<Name> name);
-  void GenerateLoadField(Register reg,
-                         FieldIndex field,
-                         Representation representation);
   void GenerateLoadConstant(Handle<Object> value);
   void GenerateLoadCallback(Register reg,
                             Handle<ExecutableAccessorInfo> callback);
=======================================
--- /branches/bleeding_edge/src/x64/stub-cache-x64.cc Tue Aug 5 10:44:17 2014 UTC +++ /branches/bleeding_edge/src/x64/stub-cache-x64.cc Wed Aug 6 08:02:21 2014 UTC
@@ -749,14 +749,6 @@
     __ bind(&success);
   }
 }
-
-
-void NamedLoadHandlerCompiler::GenerateLoadField(
-    Register reg, FieldIndex field, Representation representation) {
-  if (!reg.is(receiver())) __ movp(receiver(), reg);
-  LoadFieldStub stub(isolate(), field);
-  GenerateTailCall(masm(), stub.GetCode());
-}


 void NamedLoadHandlerCompiler::GenerateLoadCallback(
=======================================
--- /branches/bleeding_edge/src/x87/stub-cache-x87.cc Tue Aug 5 10:44:17 2014 UTC +++ /branches/bleeding_edge/src/x87/stub-cache-x87.cc Wed Aug 6 08:02:21 2014 UTC
@@ -807,14 +807,6 @@
     __ bind(&success);
   }
 }
-
-
-void NamedLoadHandlerCompiler::GenerateLoadField(
-    Register reg, FieldIndex field, Representation representation) {
-  if (!reg.is(receiver())) __ mov(receiver(), reg);
-  LoadFieldStub stub(isolate(), field);
-  GenerateTailCall(masm(), stub.GetCode());
-}


 void NamedLoadHandlerCompiler::GenerateLoadCallback(

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