Merge V8 5.2.361.47 DO NOT MERGE
https://chromium.googlesource.com/v8/v8/+/5.2.361.47
FPIIM-449
Change-Id: Ibec421b85a9b88cb3a432ada642e469fe7e78346
(cherry picked from commit bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8)
diff --git a/src/code-stubs.h b/src/code-stubs.h
index ace4aae..7bccaa9 100644
--- a/src/code-stubs.h
+++ b/src/code-stubs.h
@@ -7,8 +7,8 @@
#include "src/allocation.h"
#include "src/assembler.h"
+#include "src/code-stub-assembler.h"
#include "src/codegen.h"
-#include "src/compiler/code-stub-assembler.h"
#include "src/globals.h"
#include "src/ic/ic-state.h"
#include "src/interface-descriptors.h"
@@ -31,7 +31,6 @@
V(CompareIC) \
V(DoubleToI) \
V(FunctionPrototype) \
- V(InstanceOf) \
V(InternalArrayConstructor) \
V(JSEntry) \
V(KeyedLoadICTrampoline) \
@@ -57,9 +56,7 @@
V(VectorStoreIC) \
V(VectorKeyedStoreIC) \
/* HydrogenCodeStubs */ \
- V(AllocateInNewSpace) \
V(ArrayNArgumentsConstructor) \
- V(ArrayNoArgumentConstructor) \
V(ArraySingleArgumentConstructor) \
V(BinaryOpIC) \
V(BinaryOpWithAllocationSite) \
@@ -69,7 +66,6 @@
V(FastArrayPush) \
V(FastCloneRegExp) \
V(FastCloneShallowArray) \
- V(FastCloneShallowObject) \
V(FastNewClosure) \
V(FastNewContext) \
V(FastNewObject) \
@@ -78,7 +74,6 @@
V(FastNewStrictArguments) \
V(GrowArrayElements) \
V(InternalArrayNArgumentsConstructor) \
- V(InternalArrayNoArgumentConstructor) \
V(InternalArraySingleArgumentConstructor) \
V(KeyedLoadGeneric) \
V(LoadGlobalViaContext) \
@@ -98,7 +93,6 @@
V(LoadIC) \
/* TurboFanCodeStubs */ \
V(AllocateHeapNumber) \
- V(AllocateMutableHeapNumber) \
V(AllocateFloat32x4) \
V(AllocateInt32x4) \
V(AllocateUint32x4) \
@@ -109,12 +103,24 @@
V(AllocateInt8x16) \
V(AllocateUint8x16) \
V(AllocateBool8x16) \
+ V(ArrayNoArgumentConstructor) \
V(StringLength) \
V(Add) \
V(Subtract) \
+ V(Multiply) \
+ V(Divide) \
+ V(Modulus) \
+ V(ShiftRight) \
+ V(ShiftRightLogical) \
+ V(ShiftLeft) \
V(BitwiseAnd) \
V(BitwiseOr) \
V(BitwiseXor) \
+ V(Inc) \
+ V(InternalArrayNoArgumentConstructor) \
+ V(Dec) \
+ V(FastCloneShallowObject) \
+ V(InstanceOf) \
V(LessThan) \
V(LessThanOrEqual) \
V(GreaterThan) \
@@ -132,17 +138,19 @@
V(ToBoolean) \
V(ToInteger) \
V(ToLength) \
+ V(HasProperty) \
/* IC Handler stubs */ \
V(ArrayBufferViewLoadField) \
+ V(KeyedLoadSloppyArguments) \
+ V(KeyedStoreSloppyArguments) \
+ V(LoadApiGetter) \
V(LoadConstant) \
V(LoadFastElement) \
V(LoadField) \
V(LoadIndexedInterceptor) \
- V(KeyedLoadSloppyArguments) \
- V(KeyedStoreSloppyArguments) \
V(StoreField) \
- V(StoreInterceptor) \
V(StoreGlobal) \
+ V(StoreInterceptor) \
V(StoreTransition)
// List of code stubs only used on ARM 32 bits platforms.
@@ -284,7 +292,6 @@
virtual InlineCacheState GetICState() const { return UNINITIALIZED; }
virtual ExtraICState GetExtraICState() const { return kNoExtraICState; }
- virtual Code::StubType GetStubType() const { return Code::NORMAL; }
Code::Flags GetCodeFlags() const;
@@ -390,10 +397,32 @@
Handle<Code> GenerateCode() override; \
DEFINE_CODE_STUB(NAME, SUPER)
-#define DEFINE_TURBOFAN_CODE_STUB(NAME, SUPER) \
- public: \
- void GenerateAssembly(compiler::CodeStubAssembler* assembler) \
- const override; \
+#define DEFINE_TURBOFAN_CODE_STUB(NAME, SUPER) \
+ public: \
+ void GenerateAssembly(CodeStubAssembler* assembler) const override; \
+ DEFINE_CODE_STUB(NAME, SUPER)
+
+#define DEFINE_TURBOFAN_BINARY_OP_CODE_STUB(NAME, SUPER) \
+ public: \
+ static compiler::Node* Generate(CodeStubAssembler* assembler, \
+ compiler::Node* left, compiler::Node* right, \
+ compiler::Node* context); \
+ void GenerateAssembly(CodeStubAssembler* assembler) const override { \
+ assembler->Return(Generate(assembler, assembler->Parameter(0), \
+ assembler->Parameter(1), \
+ assembler->Parameter(2))); \
+ } \
+ DEFINE_CODE_STUB(NAME, SUPER)
+
+#define DEFINE_TURBOFAN_UNARY_OP_CODE_STUB(NAME, SUPER) \
+ public: \
+ static compiler::Node* Generate(CodeStubAssembler* assembler, \
+ compiler::Node* value, \
+ compiler::Node* context); \
+ void GenerateAssembly(CodeStubAssembler* assembler) const override { \
+ assembler->Return(Generate(assembler, assembler->Parameter(0), \
+ assembler->Parameter(1))); \
+ } \
DEFINE_CODE_STUB(NAME, SUPER)
#define DEFINE_HANDLER_CODE_STUB(NAME, SUPER) \
@@ -579,13 +608,10 @@
return GetCallInterfaceDescriptor().GetStackParameterCount();
}
- Code::StubType GetStubType() const override { return Code::FAST; }
-
protected:
explicit TurboFanCodeStub(Isolate* isolate) : CodeStub(isolate) {}
- virtual void GenerateAssembly(
- compiler::CodeStubAssembler* assembler) const = 0;
+ virtual void GenerateAssembly(CodeStubAssembler* assembler) const = 0;
private:
DEFINE_CODE_STUB_BASE(TurboFanCodeStub, CodeStub);
@@ -678,7 +704,7 @@
explicit AddStub(Isolate* isolate) : TurboFanCodeStub(isolate) {}
DEFINE_CALL_INTERFACE_DESCRIPTOR(BinaryOp);
- DEFINE_TURBOFAN_CODE_STUB(Add, TurboFanCodeStub);
+ DEFINE_TURBOFAN_BINARY_OP_CODE_STUB(Add, TurboFanCodeStub);
};
class SubtractStub final : public TurboFanCodeStub {
@@ -686,7 +712,56 @@
explicit SubtractStub(Isolate* isolate) : TurboFanCodeStub(isolate) {}
DEFINE_CALL_INTERFACE_DESCRIPTOR(BinaryOp);
- DEFINE_TURBOFAN_CODE_STUB(Subtract, TurboFanCodeStub);
+ DEFINE_TURBOFAN_BINARY_OP_CODE_STUB(Subtract, TurboFanCodeStub);
+};
+
+class MultiplyStub final : public TurboFanCodeStub {
+ public:
+ explicit MultiplyStub(Isolate* isolate) : TurboFanCodeStub(isolate) {}
+
+ DEFINE_CALL_INTERFACE_DESCRIPTOR(BinaryOp);
+ DEFINE_TURBOFAN_BINARY_OP_CODE_STUB(Multiply, TurboFanCodeStub);
+};
+
+class DivideStub final : public TurboFanCodeStub {
+ public:
+ explicit DivideStub(Isolate* isolate) : TurboFanCodeStub(isolate) {}
+
+ DEFINE_CALL_INTERFACE_DESCRIPTOR(BinaryOp);
+ DEFINE_TURBOFAN_BINARY_OP_CODE_STUB(Divide, TurboFanCodeStub);
+};
+
+class ModulusStub final : public TurboFanCodeStub {
+ public:
+ explicit ModulusStub(Isolate* isolate) : TurboFanCodeStub(isolate) {}
+
+ DEFINE_CALL_INTERFACE_DESCRIPTOR(BinaryOp);
+ DEFINE_TURBOFAN_BINARY_OP_CODE_STUB(Modulus, TurboFanCodeStub);
+};
+
+class ShiftRightStub final : public TurboFanCodeStub {
+ public:
+ explicit ShiftRightStub(Isolate* isolate) : TurboFanCodeStub(isolate) {}
+
+ DEFINE_CALL_INTERFACE_DESCRIPTOR(BinaryOp);
+ DEFINE_TURBOFAN_BINARY_OP_CODE_STUB(ShiftRight, TurboFanCodeStub);
+};
+
+class ShiftRightLogicalStub final : public TurboFanCodeStub {
+ public:
+ explicit ShiftRightLogicalStub(Isolate* isolate)
+ : TurboFanCodeStub(isolate) {}
+
+ DEFINE_CALL_INTERFACE_DESCRIPTOR(BinaryOp);
+ DEFINE_TURBOFAN_BINARY_OP_CODE_STUB(ShiftRightLogical, TurboFanCodeStub);
+};
+
+class ShiftLeftStub final : public TurboFanCodeStub {
+ public:
+ explicit ShiftLeftStub(Isolate* isolate) : TurboFanCodeStub(isolate) {}
+
+ DEFINE_CALL_INTERFACE_DESCRIPTOR(BinaryOp);
+ DEFINE_TURBOFAN_BINARY_OP_CODE_STUB(ShiftLeft, TurboFanCodeStub);
};
class BitwiseAndStub final : public TurboFanCodeStub {
@@ -694,7 +769,7 @@
explicit BitwiseAndStub(Isolate* isolate) : TurboFanCodeStub(isolate) {}
DEFINE_CALL_INTERFACE_DESCRIPTOR(BinaryOp);
- DEFINE_TURBOFAN_CODE_STUB(BitwiseAnd, TurboFanCodeStub);
+ DEFINE_TURBOFAN_BINARY_OP_CODE_STUB(BitwiseAnd, TurboFanCodeStub);
};
class BitwiseOrStub final : public TurboFanCodeStub {
@@ -702,7 +777,7 @@
explicit BitwiseOrStub(Isolate* isolate) : TurboFanCodeStub(isolate) {}
DEFINE_CALL_INTERFACE_DESCRIPTOR(BinaryOp);
- DEFINE_TURBOFAN_CODE_STUB(BitwiseOr, TurboFanCodeStub);
+ DEFINE_TURBOFAN_BINARY_OP_CODE_STUB(BitwiseOr, TurboFanCodeStub);
};
class BitwiseXorStub final : public TurboFanCodeStub {
@@ -710,7 +785,32 @@
explicit BitwiseXorStub(Isolate* isolate) : TurboFanCodeStub(isolate) {}
DEFINE_CALL_INTERFACE_DESCRIPTOR(BinaryOp);
- DEFINE_TURBOFAN_CODE_STUB(BitwiseXor, TurboFanCodeStub);
+ DEFINE_TURBOFAN_BINARY_OP_CODE_STUB(BitwiseXor, TurboFanCodeStub);
+};
+
+class IncStub final : public TurboFanCodeStub {
+ public:
+ explicit IncStub(Isolate* isolate) : TurboFanCodeStub(isolate) {}
+
+ DEFINE_CALL_INTERFACE_DESCRIPTOR(CountOp);
+ DEFINE_TURBOFAN_UNARY_OP_CODE_STUB(Inc, TurboFanCodeStub);
+};
+
+class DecStub final : public TurboFanCodeStub {
+ public:
+ explicit DecStub(Isolate* isolate) : TurboFanCodeStub(isolate) {}
+
+ DEFINE_CALL_INTERFACE_DESCRIPTOR(CountOp);
+ DEFINE_TURBOFAN_UNARY_OP_CODE_STUB(Dec, TurboFanCodeStub);
+};
+
+class InstanceOfStub final : public TurboFanCodeStub {
+ public:
+ explicit InstanceOfStub(Isolate* isolate) : TurboFanCodeStub(isolate) {}
+
+ private:
+ DEFINE_CALL_INTERFACE_DESCRIPTOR(Compare);
+ DEFINE_TURBOFAN_CODE_STUB(InstanceOf, TurboFanCodeStub);
};
class LessThanStub final : public TurboFanCodeStub {
@@ -857,9 +957,11 @@
public:
explicit StoreInterceptorStub(Isolate* isolate) : TurboFanCodeStub(isolate) {}
- void GenerateAssembly(compiler::CodeStubAssembler* assember) const override;
+ void GenerateAssembly(CodeStubAssembler* assember) const override;
Code::Kind GetCodeKind() const override { return Code::HANDLER; }
+ ExtraICState GetExtraICState() const override { return Code::STORE_IC; }
+ InlineCacheState GetICState() const override { return MONOMORPHIC; }
DEFINE_CALL_INTERFACE_DESCRIPTOR(Store);
DEFINE_CODE_STUB(StoreInterceptor, TurboFanCodeStub);
@@ -871,11 +973,22 @@
: TurboFanCodeStub(isolate) {}
Code::Kind GetCodeKind() const override { return Code::HANDLER; }
+ ExtraICState GetExtraICState() const override { return Code::KEYED_LOAD_IC; }
+ InlineCacheState GetICState() const override { return MONOMORPHIC; }
DEFINE_CALL_INTERFACE_DESCRIPTOR(LoadWithVector);
DEFINE_TURBOFAN_CODE_STUB(LoadIndexedInterceptor, TurboFanCodeStub);
};
+// ES6 section 12.10.3 "in" operator evaluation.
+class HasPropertyStub : public TurboFanCodeStub {
+ public:
+ explicit HasPropertyStub(Isolate* isolate) : TurboFanCodeStub(isolate) {}
+
+ DEFINE_CALL_INTERFACE_DESCRIPTOR(HasProperty);
+ DEFINE_TURBOFAN_CODE_STUB(HasProperty, TurboFanCodeStub);
+};
+
enum StringAddFlags {
// Omit both parameter checks.
STRING_ADD_CHECK_NONE = 0,
@@ -942,7 +1055,7 @@
private:
STATIC_ASSERT(LANGUAGE_END == 3);
class LanguageModeBits : public BitField<LanguageMode, 0, 2> {};
- class FunctionKindBits : public BitField<FunctionKind, 2, 8> {};
+ class FunctionKindBits : public BitField<FunctionKind, 2, 9> {};
DEFINE_CALL_INTERFACE_DESCRIPTOR(FastNewClosure);
DEFINE_HYDROGEN_CODE_STUB(FastNewClosure, HydrogenCodeStub);
@@ -986,11 +1099,19 @@
// of the strict arguments object materialization code.
class FastNewRestParameterStub final : public PlatformCodeStub {
public:
- explicit FastNewRestParameterStub(Isolate* isolate)
- : PlatformCodeStub(isolate) {}
+ explicit FastNewRestParameterStub(Isolate* isolate,
+ bool skip_stub_frame = false)
+ : PlatformCodeStub(isolate) {
+ minor_key_ = SkipStubFrameBits::encode(skip_stub_frame);
+ }
DEFINE_CALL_INTERFACE_DESCRIPTOR(FastNewRestParameter);
DEFINE_PLATFORM_CODE_STUB(FastNewRestParameter, PlatformCodeStub);
+
+ int skip_stub_frame() const { return SkipStubFrameBits::decode(minor_key_); }
+
+ private:
+ class SkipStubFrameBits : public BitField<bool, 0, 1> {};
};
@@ -999,11 +1120,19 @@
// and easy as the current handwritten version.
class FastNewSloppyArgumentsStub final : public PlatformCodeStub {
public:
- explicit FastNewSloppyArgumentsStub(Isolate* isolate)
- : PlatformCodeStub(isolate) {}
+ explicit FastNewSloppyArgumentsStub(Isolate* isolate,
+ bool skip_stub_frame = false)
+ : PlatformCodeStub(isolate) {
+ minor_key_ = SkipStubFrameBits::encode(skip_stub_frame);
+ }
+
+ int skip_stub_frame() const { return SkipStubFrameBits::decode(minor_key_); }
DEFINE_CALL_INTERFACE_DESCRIPTOR(FastNewSloppyArguments);
DEFINE_PLATFORM_CODE_STUB(FastNewSloppyArguments, PlatformCodeStub);
+
+ private:
+ class SkipStubFrameBits : public BitField<bool, 0, 1> {};
};
@@ -1012,11 +1141,19 @@
// and easy as the current handwritten version.
class FastNewStrictArgumentsStub final : public PlatformCodeStub {
public:
- explicit FastNewStrictArgumentsStub(Isolate* isolate)
- : PlatformCodeStub(isolate) {}
+ explicit FastNewStrictArgumentsStub(Isolate* isolate,
+ bool skip_stub_frame = false)
+ : PlatformCodeStub(isolate) {
+ minor_key_ = SkipStubFrameBits::encode(skip_stub_frame);
+ }
DEFINE_CALL_INTERFACE_DESCRIPTOR(FastNewStrictArguments);
DEFINE_PLATFORM_CODE_STUB(FastNewStrictArguments, PlatformCodeStub);
+
+ int skip_stub_frame() const { return SkipStubFrameBits::decode(minor_key_); }
+
+ private:
+ class SkipStubFrameBits : public BitField<bool, 0, 1> {};
};
@@ -1049,26 +1186,33 @@
DEFINE_HYDROGEN_CODE_STUB(FastCloneShallowArray, HydrogenCodeStub);
};
-
-class FastCloneShallowObjectStub : public HydrogenCodeStub {
+class FastCloneShallowObjectStub : public TurboFanCodeStub {
public:
// Maximum number of properties in copied object.
static const int kMaximumClonedProperties = 6;
FastCloneShallowObjectStub(Isolate* isolate, int length)
- : HydrogenCodeStub(isolate) {
+ : TurboFanCodeStub(isolate) {
DCHECK_GE(length, 0);
DCHECK_LE(length, kMaximumClonedProperties);
- set_sub_minor_key(LengthBits::encode(length));
+ minor_key_ = LengthBits::encode(LengthBits::encode(length));
}
- int length() const { return LengthBits::decode(sub_minor_key()); }
+ static compiler::Node* GenerateFastPath(
+ CodeStubAssembler* assembler,
+ compiler::CodeAssembler::Label* call_runtime, compiler::Node* closure,
+ compiler::Node* literals_index, compiler::Node* properties_count);
+
+ static bool IsSupported(ObjectLiteral* expr);
+ static int PropertiesCount(int literal_length);
+
+ int length() const { return LengthBits::decode(minor_key_); }
private:
class LengthBits : public BitField<int, 0, 4> {};
DEFINE_CALL_INTERFACE_DESCRIPTOR(FastCloneShallowObject);
- DEFINE_HYDROGEN_CODE_STUB(FastCloneShallowObject, HydrogenCodeStub);
+ DEFINE_TURBOFAN_CODE_STUB(FastCloneShallowObject, TurboFanCodeStub);
};
@@ -1126,24 +1270,6 @@
DEFINE_HYDROGEN_CODE_STUB(FastArrayPush, HydrogenCodeStub);
};
-class InstanceOfStub final : public PlatformCodeStub {
- public:
- explicit InstanceOfStub(Isolate* isolate, bool es6_instanceof = false)
- : PlatformCodeStub(isolate) {
- minor_key_ = IsES6InstanceOfBits::encode(es6_instanceof);
- }
-
- bool is_es6_instanceof() const {
- return IsES6InstanceOfBits::decode(minor_key_);
- }
-
- private:
- class IsES6InstanceOfBits : public BitField<bool, 0, 1> {};
-
- DEFINE_CALL_INTERFACE_DESCRIPTOR(InstanceOf);
- DEFINE_PLATFORM_CODE_STUB(InstanceOf, PlatformCodeStub);
-};
-
enum AllocationSiteOverrideMode {
DONT_OVERRIDE,
@@ -1280,7 +1406,6 @@
: PlatformCodeStub(isolate) {}
Code::Kind GetCodeKind() const override { return Code::HANDLER; }
- Code::StubType GetStubType() const override { return Code::FAST; }
DEFINE_CALL_INTERFACE_DESCRIPTOR(Load);
DEFINE_PLATFORM_CODE_STUB(LoadIndexedString, PlatformCodeStub);
@@ -1320,7 +1445,6 @@
protected:
Code::Kind kind() const override { return Code::LOAD_IC; }
- Code::StubType GetStubType() const override { return Code::FAST; }
private:
class LoadFieldByIndexBits : public BitField<int, 0, 13> {};
@@ -1346,7 +1470,6 @@
protected:
Code::Kind kind() const override { return Code::LOAD_IC; }
- Code::StubType GetStubType() const override { return Code::FAST; }
private:
class ArrayBufferViewLoadFieldByIndexBits : public BitField<int, 0, 13> {};
@@ -1362,7 +1485,6 @@
protected:
Code::Kind kind() const override { return Code::KEYED_LOAD_IC; }
- Code::StubType GetStubType() const override { return Code::FAST; }
private:
DEFINE_HANDLER_CODE_STUB(KeyedLoadSloppyArguments, HandlerStub);
@@ -1381,7 +1503,6 @@
protected:
Code::Kind kind() const override { return Code::KEYED_STORE_IC; }
- Code::StubType GetStubType() const override { return Code::FAST; }
private:
DEFINE_HANDLER_CODE_STUB(KeyedStoreSloppyArguments, HandlerStub);
@@ -1401,7 +1522,6 @@
protected:
Code::Kind kind() const override { return Code::LOAD_IC; }
- Code::StubType GetStubType() const override { return Code::FAST; }
private:
class ConstantIndexBits : public BitField<int, 0, kSubMinorKeyBits> {};
@@ -1409,6 +1529,33 @@
DEFINE_HANDLER_CODE_STUB(LoadConstant, HandlerStub);
};
+class LoadApiGetterStub : public TurboFanCodeStub {
+ public:
+ LoadApiGetterStub(Isolate* isolate, bool receiver_is_holder, int index)
+ : TurboFanCodeStub(isolate) {
+ // If that's not true, we need to ensure that the receiver is actually a
+ // JSReceiver. http://crbug.com/609134
+ DCHECK(receiver_is_holder);
+ minor_key_ = IndexBits::encode(index) |
+ ReceiverIsHolderBits::encode(receiver_is_holder);
+ }
+
+ Code::Kind GetCodeKind() const override { return Code::HANDLER; }
+ ExtraICState GetExtraICState() const override { return Code::LOAD_IC; }
+ InlineCacheState GetICState() const override { return MONOMORPHIC; }
+
+ int index() const { return IndexBits::decode(minor_key_); }
+ bool receiver_is_holder() const {
+ return ReceiverIsHolderBits::decode(minor_key_);
+ }
+
+ private:
+ class ReceiverIsHolderBits : public BitField<bool, 0, 1> {};
+ class IndexBits : public BitField<int, 1, kDescriptorIndexBitCount> {};
+
+ DEFINE_CALL_INTERFACE_DESCRIPTOR(Load);
+ DEFINE_TURBOFAN_CODE_STUB(LoadApiGetter, TurboFanCodeStub);
+};
class StoreFieldStub : public HandlerStub {
public:
@@ -1433,7 +1580,6 @@
protected:
Code::Kind kind() const override { return Code::STORE_IC; }
- Code::StubType GetStubType() const override { return Code::FAST; }
private:
class StoreFieldByIndexBits : public BitField<int, 0, 13> {};
@@ -1543,7 +1689,6 @@
protected:
Code::Kind kind() const override { return Code::STORE_IC; }
- Code::StubType GetStubType() const override { return Code::FAST; }
private:
class StoreFieldByIndexBits : public BitField<int, 0, 13> {};
@@ -2492,13 +2637,11 @@
private:
static const int kContextIndexBits = 9;
- static const int kSlotIndexBits = 13;
+ static const int kSlotIndexBits = 12;
class ContextIndexBits : public BitField<int, 0, kContextIndexBits> {};
class SlotIndexBits
: public BitField<int, kContextIndexBits, kSlotIndexBits> {};
- Code::StubType GetStubType() const override { return Code::FAST; }
-
DEFINE_CODE_STUB_BASE(ScriptContextFieldStub, HandlerStub);
};
@@ -2631,24 +2774,12 @@
: TurboFanCodeStub(isolate) {}
void InitializeDescriptor(CodeStubDescriptor* descriptor) override;
- void GenerateAssembly(compiler::CodeStubAssembler* assembler) const override;
+ void GenerateAssembly(CodeStubAssembler* assembler) const override;
DEFINE_CALL_INTERFACE_DESCRIPTOR(AllocateHeapNumber);
DEFINE_CODE_STUB(AllocateHeapNumber, TurboFanCodeStub);
};
-class AllocateMutableHeapNumberStub : public TurboFanCodeStub {
- public:
- explicit AllocateMutableHeapNumberStub(Isolate* isolate)
- : TurboFanCodeStub(isolate) {}
-
- void InitializeDescriptor(CodeStubDescriptor* descriptor) override;
- void GenerateAssembly(compiler::CodeStubAssembler* assembler) const override;
-
- DEFINE_CALL_INTERFACE_DESCRIPTOR(AllocateMutableHeapNumber);
- DEFINE_CODE_STUB(AllocateMutableHeapNumber, TurboFanCodeStub);
-};
-
#define SIMD128_ALLOC_STUB(TYPE, Type, type, lane_count, lane_type) \
class Allocate##Type##Stub : public TurboFanCodeStub { \
public: \
@@ -2656,8 +2787,7 @@
: TurboFanCodeStub(isolate) {} \
\
void InitializeDescriptor(CodeStubDescriptor* descriptor) override; \
- void GenerateAssembly( \
- compiler::CodeStubAssembler* assembler) const override; \
+ void GenerateAssembly(CodeStubAssembler* assembler) const override; \
\
DEFINE_CALL_INTERFACE_DESCRIPTOR(Allocate##Type); \
DEFINE_CODE_STUB(Allocate##Type, TurboFanCodeStub); \
@@ -2665,17 +2795,6 @@
SIMD128_TYPES(SIMD128_ALLOC_STUB)
#undef SIMD128_ALLOC_STUB
-class AllocateInNewSpaceStub final : public HydrogenCodeStub {
- public:
- explicit AllocateInNewSpaceStub(Isolate* isolate)
- : HydrogenCodeStub(isolate) {}
-
- private:
- DEFINE_CALL_INTERFACE_DESCRIPTOR(AllocateInNewSpace);
- DEFINE_HYDROGEN_CODE_STUB(AllocateInNewSpace, HydrogenCodeStub);
-};
-
-
class ArrayConstructorStubBase : public HydrogenCodeStub {
public:
ArrayConstructorStubBase(Isolate* isolate,
@@ -2720,26 +2839,77 @@
DEFINE_CODE_STUB_BASE(ArrayConstructorStubBase, HydrogenCodeStub);
};
+class CommonArrayConstructorStub : public TurboFanCodeStub {
+ protected:
+ CommonArrayConstructorStub(Isolate* isolate, ElementsKind kind,
+ AllocationSiteOverrideMode override_mode)
+ : TurboFanCodeStub(isolate) {
+ // It only makes sense to override local allocation site behavior
+ // if there is a difference between the global allocation site policy
+ // for an ElementsKind and the desired usage of the stub.
+ DCHECK(override_mode != DISABLE_ALLOCATION_SITES ||
+ AllocationSite::GetMode(kind) == TRACK_ALLOCATION_SITE);
+ set_sub_minor_key(ElementsKindBits::encode(kind) |
+ AllocationSiteOverrideModeBits::encode(override_mode));
+ }
-class ArrayNoArgumentConstructorStub : public ArrayConstructorStubBase {
+ void set_sub_minor_key(uint32_t key) { minor_key_ = key; }
+
+ uint32_t sub_minor_key() const { return minor_key_; }
+
+ CommonArrayConstructorStub(uint32_t key, Isolate* isolate)
+ : TurboFanCodeStub(key, isolate) {}
+
public:
- ArrayNoArgumentConstructorStub(
- Isolate* isolate,
- ElementsKind kind,
- AllocationSiteOverrideMode override_mode = DONT_OVERRIDE)
- : ArrayConstructorStubBase(isolate, kind, override_mode) {
+ ElementsKind elements_kind() const {
+ return ElementsKindBits::decode(sub_minor_key());
+ }
+
+ AllocationSiteOverrideMode override_mode() const {
+ return AllocationSiteOverrideModeBits::decode(sub_minor_key());
}
private:
- void PrintName(std::ostream& os) const override { // NOLINT
- BasePrintName(os, "ArrayNoArgumentConstructorStub");
- }
+ // Ensure data fits within available bits.
+ STATIC_ASSERT(LAST_ALLOCATION_SITE_OVERRIDE_MODE == 1);
- DEFINE_CALL_INTERFACE_DESCRIPTOR(ArrayConstructorConstantArgCount);
- DEFINE_HYDROGEN_CODE_STUB(ArrayNoArgumentConstructor,
- ArrayConstructorStubBase);
+ class ElementsKindBits : public BitField<ElementsKind, 0, 8> {};
+ class AllocationSiteOverrideModeBits
+ : 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_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 {
public:
@@ -2804,19 +2974,6 @@
};
-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
InternalArrayConstructorStubBase {
public: