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.