Index: src/code-stubs.h |
diff --git a/src/code-stubs.h b/src/code-stubs.h |
index ba673c3a6921d5af5a5a629590cf64d4d6a936d9..4c683edef54f422acb5580371e134512f9fa95d9 100644 |
--- a/src/code-stubs.h |
+++ b/src/code-stubs.h |
@@ -89,6 +89,7 @@ namespace internal { |
V(LoadIC) \ |
/* TurboFanCodeStubs */ \ |
V(StringLengthTF) \ |
+ V(StringAddTF) \ |
V(MathFloor) \ |
/* IC Handler stubs */ \ |
V(ArrayBufferViewLoadField) \ |
@@ -354,17 +355,9 @@ struct FakeStubForTesting : public CodeStub { |
Handle<Code> GenerateCode() override; \ |
DEFINE_CODE_STUB(NAME, SUPER) |
-#define DEFINE_TURBOFAN_CODE_STUB(NAME, SUPER, DESC, STACK_PARAMS) \ |
- public: \ |
- NAME##Stub(Isolate* isolate) : SUPER(isolate) {} \ |
- CallInterfaceDescriptor GetCallInterfaceDescriptor() override { \ |
- return DESC(isolate()); \ |
- }; \ |
- virtual const char* GetFunctionName() const override { \ |
- return #NAME "_STUB"; \ |
- } \ |
- int GetStackParameterCount() const override { return STACK_PARAMS; } \ |
- Code::StubType GetStubType() const override { return Code::FAST; } \ |
+#define DEFINE_TURBOFAN_CODE_STUB(NAME, SUPER) \ |
+ public: \ |
+ const char* GetFunctionName() const override { return #NAME "_STUB"; } \ |
DEFINE_CODE_STUB(NAME, SUPER) |
#define DEFINE_HANDLER_CODE_STUB(NAME, SUPER) \ |
@@ -394,8 +387,6 @@ class PlatformCodeStub : public CodeStub { |
// Retrieve the code for the stub. Generate the code if needed. |
Handle<Code> GenerateCode() override; |
- Code::Kind GetCodeKind() const override { return Code::STUB; } |
- |
protected: |
explicit PlatformCodeStub(Isolate* isolate) : CodeStub(isolate) {} |
@@ -494,8 +485,6 @@ class HydrogenCodeStub : public CodeStub { |
INITIALIZED |
}; |
- Code::Kind GetCodeKind() const override { return Code::STUB; } |
- |
template<class SubClass> |
static Handle<Code> GetUninitialized(Isolate* isolate) { |
SubClass::GenerateAheadOfTime(isolate); |
@@ -539,11 +528,11 @@ class HydrogenCodeStub : public CodeStub { |
class TurboFanCodeStub : public CodeStub { |
public: |
- Code::Kind GetCodeKind() const override { return Code::STUB; } |
- |
// Retrieve the code for the stub. Generate the code if needed. |
Handle<Code> GenerateCode() override; |
+ Code::StubType GetStubType() const override { return Code::FAST; } |
+ |
virtual const char* GetFunctionName() const = 0; |
protected: |
@@ -621,19 +610,68 @@ class NopRuntimeCallHelper : public RuntimeCallHelper { |
class MathFloorStub : public TurboFanCodeStub { |
- DEFINE_TURBOFAN_CODE_STUB(MathFloor, TurboFanCodeStub, |
- MathRoundVariantDescriptor, 1); |
+ public: |
+ explicit MathFloorStub(Isolate* isolate) : TurboFanCodeStub(isolate) {} |
+ int GetStackParameterCount() const override { return 1; } |
+ |
+ DEFINE_CALL_INTERFACE_DESCRIPTOR(MathRoundVariant); |
+ DEFINE_TURBOFAN_CODE_STUB(MathFloor, TurboFanCodeStub); |
}; |
class StringLengthTFStub : public TurboFanCodeStub { |
- DEFINE_TURBOFAN_CODE_STUB(StringLengthTF, TurboFanCodeStub, |
- LoadWithVectorDescriptor, 0); |
- |
public: |
+ explicit StringLengthTFStub(Isolate* isolate) : TurboFanCodeStub(isolate) {} |
+ |
Code::Kind GetCodeKind() const override { return Code::HANDLER; } |
InlineCacheState GetICState() const override { return MONOMORPHIC; } |
ExtraICState GetExtraICState() const override { return Code::LOAD_IC; } |
+ |
+ DEFINE_CALL_INTERFACE_DESCRIPTOR(LoadWithVector); |
+ DEFINE_TURBOFAN_CODE_STUB(StringLengthTF, TurboFanCodeStub); |
+}; |
+ |
+ |
+enum StringAddFlags { |
+ // Omit both parameter checks. |
+ STRING_ADD_CHECK_NONE = 0, |
+ // Check left parameter. |
+ STRING_ADD_CHECK_LEFT = 1 << 0, |
+ // Check right parameter. |
+ STRING_ADD_CHECK_RIGHT = 1 << 1, |
+ // Check both parameters. |
+ STRING_ADD_CHECK_BOTH = STRING_ADD_CHECK_LEFT | STRING_ADD_CHECK_RIGHT |
+}; |
+ |
+ |
+std::ostream& operator<<(std::ostream& os, const StringAddFlags& flags); |
+ |
+ |
+class StringAddTFStub : public TurboFanCodeStub { |
+ public: |
+ StringAddTFStub(Isolate* isolate, StringAddFlags flags, |
+ PretenureFlag pretenure_flag) |
+ : TurboFanCodeStub(isolate) { |
+ minor_key_ = StringAddFlagsBits::encode(flags) | |
+ PretenureFlagBits::encode(pretenure_flag); |
+ } |
+ |
+ StringAddFlags flags() const { |
+ return StringAddFlagsBits::decode(MinorKey()); |
+ } |
+ |
+ PretenureFlag pretenure_flag() const { |
+ return PretenureFlagBits::decode(MinorKey()); |
+ } |
+ |
+ private: |
+ class StringAddFlagsBits : public BitField<StringAddFlags, 0, 2> {}; |
+ class PretenureFlagBits : public BitField<PretenureFlag, 2, 1> {}; |
+ |
+ void PrintBaseName(std::ostream& os) const override; // NOLINT |
+ |
+ DEFINE_CALL_INTERFACE_DESCRIPTOR(StringAdd); |
+ DEFINE_TURBOFAN_CODE_STUB(StringAddTF, TurboFanCodeStub); |
}; |
@@ -1473,18 +1511,6 @@ class BinaryOpWithAllocationSiteStub final : public BinaryOpICStub { |
}; |
-enum StringAddFlags { |
- // Omit both parameter checks. |
- STRING_ADD_CHECK_NONE = 0, |
- // Check left parameter. |
- STRING_ADD_CHECK_LEFT = 1 << 0, |
- // Check right parameter. |
- STRING_ADD_CHECK_RIGHT = 1 << 1, |
- // Check both parameters. |
- STRING_ADD_CHECK_BOTH = STRING_ADD_CHECK_LEFT | STRING_ADD_CHECK_RIGHT |
-}; |
- |
- |
class StringAddStub final : public HydrogenCodeStub { |
public: |
StringAddStub(Isolate* isolate, StringAddFlags flags, |
@@ -1791,7 +1817,7 @@ class RestParamAccessStub: public PlatformCodeStub { |
private: |
void GenerateNew(MacroAssembler* masm); |
- virtual void PrintName(std::ostream& os) const override; // NOLINT |
+ void PrintName(std::ostream& os) const override; // NOLINT |
DEFINE_PLATFORM_CODE_STUB(RestParamAccess, PlatformCodeStub); |
}; |
@@ -2177,11 +2203,11 @@ class LoadICStub : public PlatformCodeStub { |
void GenerateForTrampoline(MacroAssembler* masm); |
- virtual Code::Kind GetCodeKind() const override { return Code::LOAD_IC; } |
+ Code::Kind GetCodeKind() const override { return Code::LOAD_IC; } |
- virtual InlineCacheState GetICState() const final override { return DEFAULT; } |
+ InlineCacheState GetICState() const final override { return DEFAULT; } |
- virtual ExtraICState GetExtraICState() const final override { |
+ ExtraICState GetExtraICState() const final override { |
return static_cast<ExtraICState>(minor_key_); |
} |
@@ -2199,11 +2225,9 @@ class KeyedLoadICStub : public PlatformCodeStub { |
void GenerateForTrampoline(MacroAssembler* masm); |
- virtual Code::Kind GetCodeKind() const override { |
- return Code::KEYED_LOAD_IC; |
- } |
+ Code::Kind GetCodeKind() const override { return Code::KEYED_LOAD_IC; } |
- virtual InlineCacheState GetICState() const final override { return DEFAULT; } |
+ InlineCacheState GetICState() const final override { return DEFAULT; } |
DEFINE_CALL_INTERFACE_DESCRIPTOR(LoadWithVector); |
DEFINE_PLATFORM_CODE_STUB(KeyedLoadIC, PlatformCodeStub); |