Commit d2efbf25 authored by danno's avatar danno Committed by Commit bot

[stubs] Convert InternalArrayNoArgumentsConstructor to a TurboFan stub

BUG=chromium:608675
LOG=N

Review-Url: https://codereview.chromium.org/1948433002
Cr-Commit-Position: refs/heads/master@{#36000}
parent e69bc6ed
...@@ -67,11 +67,6 @@ void ArrayNArgumentsConstructorStub::InitializeDescriptor( ...@@ -67,11 +67,6 @@ void ArrayNArgumentsConstructorStub::InitializeDescriptor(
} }
void InternalArrayNoArgumentConstructorStub::InitializeDescriptor(
CodeStubDescriptor* descriptor) {
InitializeInternalArrayConstructorDescriptor(isolate(), descriptor, 0);
}
void FastArrayPushStub::InitializeDescriptor(CodeStubDescriptor* descriptor) { void FastArrayPushStub::InitializeDescriptor(CodeStubDescriptor* descriptor) {
Address deopt_handler = Runtime::FunctionForId(Runtime::kArrayPush)->entry; Address deopt_handler = Runtime::FunctionForId(Runtime::kArrayPush)->entry;
descriptor->Initialize(r0, deopt_handler, -1, JS_FUNCTION_STUB_MODE); descriptor->Initialize(r0, deopt_handler, -1, JS_FUNCTION_STUB_MODE);
......
...@@ -71,11 +71,6 @@ static void InitializeInternalArrayConstructorDescriptor( ...@@ -71,11 +71,6 @@ static void InitializeInternalArrayConstructorDescriptor(
} }
void InternalArrayNoArgumentConstructorStub::InitializeDescriptor(
CodeStubDescriptor* descriptor) {
InitializeInternalArrayConstructorDescriptor(isolate(), descriptor, 0);
}
void FastArrayPushStub::InitializeDescriptor(CodeStubDescriptor* descriptor) { void FastArrayPushStub::InitializeDescriptor(CodeStubDescriptor* descriptor) {
Address deopt_handler = Runtime::FunctionForId(Runtime::kArrayPush)->entry; Address deopt_handler = Runtime::FunctionForId(Runtime::kArrayPush)->entry;
descriptor->Initialize(x0, deopt_handler, -1, JS_FUNCTION_STUB_MODE); descriptor->Initialize(x0, deopt_handler, -1, JS_FUNCTION_STUB_MODE);
......
...@@ -560,6 +560,12 @@ Node* CodeStubAssembler::LoadNativeContext(Node* context) { ...@@ -560,6 +560,12 @@ Node* CodeStubAssembler::LoadNativeContext(Node* context) {
Context::NATIVE_CONTEXT_INDEX); Context::NATIVE_CONTEXT_INDEX);
} }
Node* CodeStubAssembler::LoadJSArrayElementsMap(ElementsKind kind,
Node* native_context) {
return LoadFixedArrayElementConstantIndex(native_context,
Context::ArrayMapIndex(kind));
}
Node* CodeStubAssembler::StoreHeapNumberValue(Node* object, Node* value) { Node* CodeStubAssembler::StoreHeapNumberValue(Node* object, Node* value) {
return StoreNoWriteBarrier( return StoreNoWriteBarrier(
MachineRepresentation::kFloat64, object, MachineRepresentation::kFloat64, object,
...@@ -674,9 +680,8 @@ Node* CodeStubAssembler::AllocateSeqTwoByteString(int length) { ...@@ -674,9 +680,8 @@ Node* CodeStubAssembler::AllocateSeqTwoByteString(int length) {
return result; return result;
} }
Node* CodeStubAssembler::AllocateJSArray(ElementsKind kind, Node* CodeStubAssembler::AllocateJSArray(ElementsKind kind, Node* array_map,
Node* native_context, int capacity, int capacity, int length,
int length,
compiler::Node* allocation_site) { compiler::Node* allocation_site) {
bool is_double = IsFastDoubleElementsKind(kind); bool is_double = IsFastDoubleElementsKind(kind);
int element_size = is_double ? kDoubleSize : kPointerSize; int element_size = is_double ? kDoubleSize : kPointerSize;
...@@ -692,8 +697,6 @@ Node* CodeStubAssembler::AllocateJSArray(ElementsKind kind, ...@@ -692,8 +697,6 @@ Node* CodeStubAssembler::AllocateJSArray(ElementsKind kind,
// Allocate both array and elements object, and initialize the JSArray. // Allocate both array and elements object, and initialize the JSArray.
Heap* heap = isolate()->heap(); Heap* heap = isolate()->heap();
Node* array = Allocate(total_size); Node* array = Allocate(total_size);
Node* array_map = LoadFixedArrayElementConstantIndex(
native_context, Context::ArrayMapIndex(kind));
StoreMapNoWriteBarrier(array, array_map); StoreMapNoWriteBarrier(array, array_map);
Node* empty_properties = Node* empty_properties =
HeapConstant(Handle<HeapObject>(heap->empty_fixed_array())); HeapConstant(Handle<HeapObject>(heap->empty_fixed_array()));
......
...@@ -144,6 +144,9 @@ class CodeStubAssembler : public compiler::CodeAssembler { ...@@ -144,6 +144,9 @@ class CodeStubAssembler : public compiler::CodeAssembler {
// Context manipulation // Context manipulation
compiler::Node* LoadNativeContext(compiler::Node* context); compiler::Node* LoadNativeContext(compiler::Node* context);
compiler::Node* LoadJSArrayElementsMap(ElementsKind kind,
compiler::Node* native_context);
// Store the floating point value of a HeapNumber. // Store the floating point value of a HeapNumber.
compiler::Node* StoreHeapNumberValue(compiler::Node* object, compiler::Node* StoreHeapNumberValue(compiler::Node* object,
compiler::Node* value); compiler::Node* value);
...@@ -185,9 +188,8 @@ class CodeStubAssembler : public compiler::CodeAssembler { ...@@ -185,9 +188,8 @@ class CodeStubAssembler : public compiler::CodeAssembler {
// Allocate a SeqTwoByteString with the given length. // Allocate a SeqTwoByteString with the given length.
compiler::Node* AllocateSeqTwoByteString(int length); compiler::Node* AllocateSeqTwoByteString(int length);
// Allocated an JSArray // Allocated an JSArray
compiler::Node* AllocateJSArray(ElementsKind kind, compiler::Node* AllocateJSArray(ElementsKind kind, compiler::Node* array_map,
compiler::Node* native_context, int capacity, int capacity, int length,
int length,
compiler::Node* allocation_site = nullptr); compiler::Node* allocation_site = nullptr);
// Allocation site manipulation // Allocation site manipulation
......
...@@ -1443,11 +1443,6 @@ HValue* CodeStubGraphBuilder<InternalArrayNoArgumentConstructorStub>:: ...@@ -1443,11 +1443,6 @@ HValue* CodeStubGraphBuilder<InternalArrayNoArgumentConstructorStub>::
} }
Handle<Code> InternalArrayNoArgumentConstructorStub::GenerateCode() {
return DoGenerateCode(this);
}
template <> template <>
HValue* CodeStubGraphBuilder<InternalArraySingleArgumentConstructorStub>:: HValue* CodeStubGraphBuilder<InternalArraySingleArgumentConstructorStub>::
BuildCodeStub() { BuildCodeStub() {
......
...@@ -4382,12 +4382,27 @@ void ArrayNoArgumentConstructorStub::GenerateAssembly( ...@@ -4382,12 +4382,27 @@ void ArrayNoArgumentConstructorStub::GenerateAssembly(
? assembler->Parameter( ? assembler->Parameter(
ArrayNoArgumentConstructorDescriptor::kAllocationSiteIndex) ArrayNoArgumentConstructorDescriptor::kAllocationSiteIndex)
: nullptr; : nullptr;
Node* array = assembler->AllocateJSArray(elements_kind(), native_context, Node* array_map =
assembler->LoadJSArrayElementsMap(elements_kind(), native_context);
Node* array = assembler->AllocateJSArray(elements_kind(), array_map,
JSArray::kPreallocatedArrayElements, JSArray::kPreallocatedArrayElements,
0, allocation_site); 0, allocation_site);
assembler->Return(array); assembler->Return(array);
} }
void InternalArrayNoArgumentConstructorStub::GenerateAssembly(
CodeStubAssembler* assembler) const {
typedef compiler::Node Node;
Node* array_map = assembler->LoadObjectField(
assembler->Parameter(
ArrayNoArgumentConstructorDescriptor::kFunctionIndex),
JSFunction::kPrototypeOrInitialMapOffset);
Node* array = assembler->AllocateJSArray(elements_kind(), array_map,
JSArray::kPreallocatedArrayElements,
0, nullptr);
assembler->Return(array);
}
ArrayConstructorStub::ArrayConstructorStub(Isolate* isolate) ArrayConstructorStub::ArrayConstructorStub(Isolate* isolate)
: PlatformCodeStub(isolate) { : PlatformCodeStub(isolate) {
minor_key_ = ArgumentCountBits::encode(ANY); minor_key_ = ArgumentCountBits::encode(ANY);
......
...@@ -58,7 +58,6 @@ namespace internal { ...@@ -58,7 +58,6 @@ namespace internal {
V(VectorKeyedStoreIC) \ V(VectorKeyedStoreIC) \
/* HydrogenCodeStubs */ \ /* HydrogenCodeStubs */ \
V(ArrayNArgumentsConstructor) \ V(ArrayNArgumentsConstructor) \
V(ArrayNoArgumentConstructor) \
V(ArraySingleArgumentConstructor) \ V(ArraySingleArgumentConstructor) \
V(BinaryOpIC) \ V(BinaryOpIC) \
V(BinaryOpWithAllocationSite) \ V(BinaryOpWithAllocationSite) \
...@@ -76,7 +75,6 @@ namespace internal { ...@@ -76,7 +75,6 @@ namespace internal {
V(FastNewStrictArguments) \ V(FastNewStrictArguments) \
V(GrowArrayElements) \ V(GrowArrayElements) \
V(InternalArrayNArgumentsConstructor) \ V(InternalArrayNArgumentsConstructor) \
V(InternalArrayNoArgumentConstructor) \
V(InternalArraySingleArgumentConstructor) \ V(InternalArraySingleArgumentConstructor) \
V(KeyedLoadGeneric) \ V(KeyedLoadGeneric) \
V(LoadGlobalViaContext) \ V(LoadGlobalViaContext) \
...@@ -107,6 +105,7 @@ namespace internal { ...@@ -107,6 +105,7 @@ namespace internal {
V(AllocateInt8x16) \ V(AllocateInt8x16) \
V(AllocateUint8x16) \ V(AllocateUint8x16) \
V(AllocateBool8x16) \ V(AllocateBool8x16) \
V(ArrayNoArgumentConstructor) \
V(StringLength) \ V(StringLength) \
V(Add) \ V(Add) \
V(Subtract) \ V(Subtract) \
...@@ -120,6 +119,7 @@ namespace internal { ...@@ -120,6 +119,7 @@ namespace internal {
V(BitwiseOr) \ V(BitwiseOr) \
V(BitwiseXor) \ V(BitwiseXor) \
V(Inc) \ V(Inc) \
V(InternalArrayNoArgumentConstructor) \
V(Dec) \ V(Dec) \
V(FastCloneShallowObject) \ V(FastCloneShallowObject) \
V(LessThan) \ V(LessThan) \
...@@ -2811,11 +2811,10 @@ class ArrayConstructorStubBase : public HydrogenCodeStub { ...@@ -2811,11 +2811,10 @@ class ArrayConstructorStubBase : public HydrogenCodeStub {
DEFINE_CODE_STUB_BASE(ArrayConstructorStubBase, HydrogenCodeStub); DEFINE_CODE_STUB_BASE(ArrayConstructorStubBase, HydrogenCodeStub);
}; };
class ArrayNoArgumentConstructorStub : public TurboFanCodeStub { class CommonArrayConstructorStub : public TurboFanCodeStub {
public: protected:
ArrayNoArgumentConstructorStub( CommonArrayConstructorStub(Isolate* isolate, ElementsKind kind,
Isolate* isolate, ElementsKind kind, AllocationSiteOverrideMode override_mode)
AllocationSiteOverrideMode override_mode = DONT_OVERRIDE)
: TurboFanCodeStub(isolate) { : TurboFanCodeStub(isolate) {
// It only makes sense to override local allocation site behavior // It only makes sense to override local allocation site behavior
// if there is a difference between the global allocation site policy // if there is a difference between the global allocation site policy
...@@ -2830,6 +2829,10 @@ class ArrayNoArgumentConstructorStub : public TurboFanCodeStub { ...@@ -2830,6 +2829,10 @@ class ArrayNoArgumentConstructorStub : public TurboFanCodeStub {
uint32_t sub_minor_key() const { return minor_key_; } uint32_t sub_minor_key() const { return minor_key_; }
CommonArrayConstructorStub(uint32_t key, Isolate* isolate)
: TurboFanCodeStub(key, isolate) {}
public:
ElementsKind elements_kind() const { ElementsKind elements_kind() const {
return ElementsKindBits::decode(sub_minor_key()); return ElementsKindBits::decode(sub_minor_key());
} }
...@@ -2839,19 +2842,45 @@ class ArrayNoArgumentConstructorStub : public TurboFanCodeStub { ...@@ -2839,19 +2842,45 @@ class ArrayNoArgumentConstructorStub : public TurboFanCodeStub {
} }
private: private:
void PrintName(std::ostream& os) const override { // NOLINT
os << "ArrayNoArgumentConstructorStub";
}
// Ensure data fits within available bits. // Ensure data fits within available bits.
STATIC_ASSERT(LAST_ALLOCATION_SITE_OVERRIDE_MODE == 1); STATIC_ASSERT(LAST_ALLOCATION_SITE_OVERRIDE_MODE == 1);
class ElementsKindBits : public BitField<ElementsKind, 0, 8> {}; class ElementsKindBits : public BitField<ElementsKind, 0, 8> {};
class AllocationSiteOverrideModeBits class AllocationSiteOverrideModeBits
: public BitField<AllocationSiteOverrideMode, 8, 1> {}; // NOLINT : public BitField<AllocationSiteOverrideMode, 8, 1> {}; // NOLINT
};
class ArrayNoArgumentConstructorStub : public CommonArrayConstructorStub {
public:
ArrayNoArgumentConstructorStub(
Isolate* isolate, ElementsKind kind,
AllocationSiteOverrideMode override_mode = DONT_OVERRIDE)
: CommonArrayConstructorStub(isolate, kind, override_mode) {}
private:
void PrintName(std::ostream& os) const override { // NOLINT
os << "ArrayNoArgumentConstructorStub";
}
DEFINE_CALL_INTERFACE_DESCRIPTOR(ArrayNoArgumentConstructor); DEFINE_CALL_INTERFACE_DESCRIPTOR(ArrayNoArgumentConstructor);
DEFINE_TURBOFAN_CODE_STUB(ArrayNoArgumentConstructor, TurboFanCodeStub); DEFINE_TURBOFAN_CODE_STUB(ArrayNoArgumentConstructor,
CommonArrayConstructorStub);
};
class InternalArrayNoArgumentConstructorStub
: public CommonArrayConstructorStub {
public:
InternalArrayNoArgumentConstructorStub(Isolate* isolate, ElementsKind kind)
: CommonArrayConstructorStub(isolate, kind, DONT_OVERRIDE) {}
private:
void PrintName(std::ostream& os) const override { // NOLINT
os << "InternalArrayNoArgumentConstructorStub";
}
DEFINE_CALL_INTERFACE_DESCRIPTOR(ArrayNoArgumentConstructor);
DEFINE_TURBOFAN_CODE_STUB(InternalArrayNoArgumentConstructor,
CommonArrayConstructorStub);
}; };
class ArraySingleArgumentConstructorStub : public ArrayConstructorStubBase { class ArraySingleArgumentConstructorStub : public ArrayConstructorStubBase {
...@@ -2917,19 +2946,6 @@ class InternalArrayConstructorStubBase : public HydrogenCodeStub { ...@@ -2917,19 +2946,6 @@ class InternalArrayConstructorStubBase : public HydrogenCodeStub {
}; };
class InternalArrayNoArgumentConstructorStub : public
InternalArrayConstructorStubBase {
public:
InternalArrayNoArgumentConstructorStub(Isolate* isolate,
ElementsKind kind)
: InternalArrayConstructorStubBase(isolate, kind) { }
DEFINE_CALL_INTERFACE_DESCRIPTOR(InternalArrayConstructorConstantArgCount);
DEFINE_HYDROGEN_CODE_STUB(InternalArrayNoArgumentConstructor,
InternalArrayConstructorStubBase);
};
class InternalArraySingleArgumentConstructorStub : public class InternalArraySingleArgumentConstructorStub : public
InternalArrayConstructorStubBase { InternalArrayConstructorStubBase {
public: public:
......
...@@ -74,11 +74,6 @@ void ArrayNArgumentsConstructorStub::InitializeDescriptor( ...@@ -74,11 +74,6 @@ void ArrayNArgumentsConstructorStub::InitializeDescriptor(
} }
void InternalArrayNoArgumentConstructorStub::InitializeDescriptor(
CodeStubDescriptor* descriptor) {
InitializeInternalArrayConstructorDescriptor(isolate(), descriptor, 0);
}
void FastArrayPushStub::InitializeDescriptor(CodeStubDescriptor* descriptor) { void FastArrayPushStub::InitializeDescriptor(CodeStubDescriptor* descriptor) {
Address deopt_handler = Runtime::FunctionForId(Runtime::kArrayPush)->entry; Address deopt_handler = Runtime::FunctionForId(Runtime::kArrayPush)->entry;
descriptor->Initialize(eax, deopt_handler, -1, JS_FUNCTION_STUB_MODE); descriptor->Initialize(eax, deopt_handler, -1, JS_FUNCTION_STUB_MODE);
......
...@@ -66,11 +66,6 @@ void ArrayNArgumentsConstructorStub::InitializeDescriptor( ...@@ -66,11 +66,6 @@ void ArrayNArgumentsConstructorStub::InitializeDescriptor(
} }
void InternalArrayNoArgumentConstructorStub::InitializeDescriptor(
CodeStubDescriptor* descriptor) {
InitializeInternalArrayConstructorDescriptor(isolate(), descriptor, 0);
}
void FastArrayPushStub::InitializeDescriptor(CodeStubDescriptor* descriptor) { void FastArrayPushStub::InitializeDescriptor(CodeStubDescriptor* descriptor) {
Address deopt_handler = Runtime::FunctionForId(Runtime::kArrayPush)->entry; Address deopt_handler = Runtime::FunctionForId(Runtime::kArrayPush)->entry;
descriptor->Initialize(a0, deopt_handler, -1, JS_FUNCTION_STUB_MODE); descriptor->Initialize(a0, deopt_handler, -1, JS_FUNCTION_STUB_MODE);
......
...@@ -65,11 +65,6 @@ void ArrayNArgumentsConstructorStub::InitializeDescriptor( ...@@ -65,11 +65,6 @@ void ArrayNArgumentsConstructorStub::InitializeDescriptor(
} }
void InternalArrayNoArgumentConstructorStub::InitializeDescriptor(
CodeStubDescriptor* descriptor) {
InitializeInternalArrayConstructorDescriptor(isolate(), descriptor, 0);
}
void FastArrayPushStub::InitializeDescriptor(CodeStubDescriptor* descriptor) { void FastArrayPushStub::InitializeDescriptor(CodeStubDescriptor* descriptor) {
Address deopt_handler = Runtime::FunctionForId(Runtime::kArrayPush)->entry; Address deopt_handler = Runtime::FunctionForId(Runtime::kArrayPush)->entry;
descriptor->Initialize(a0, deopt_handler, -1, JS_FUNCTION_STUB_MODE); descriptor->Initialize(a0, deopt_handler, -1, JS_FUNCTION_STUB_MODE);
......
...@@ -65,11 +65,6 @@ void ArrayNArgumentsConstructorStub::InitializeDescriptor( ...@@ -65,11 +65,6 @@ void ArrayNArgumentsConstructorStub::InitializeDescriptor(
} }
void InternalArrayNoArgumentConstructorStub::InitializeDescriptor(
CodeStubDescriptor* descriptor) {
InitializeInternalArrayConstructorDescriptor(isolate(), descriptor, 0);
}
void FastArrayPushStub::InitializeDescriptor(CodeStubDescriptor* descriptor) { void FastArrayPushStub::InitializeDescriptor(CodeStubDescriptor* descriptor) {
Address deopt_handler = Runtime::FunctionForId(Runtime::kArrayPush)->entry; Address deopt_handler = Runtime::FunctionForId(Runtime::kArrayPush)->entry;
descriptor->Initialize(rax, deopt_handler, -1, JS_FUNCTION_STUB_MODE); descriptor->Initialize(rax, deopt_handler, -1, JS_FUNCTION_STUB_MODE);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment