aboutsummaryrefslogtreecommitdiff
path: root/deps/v8/src/code-stubs.h
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/code-stubs.h')
-rw-r--r--deps/v8/src/code-stubs.h220
1 files changed, 50 insertions, 170 deletions
diff --git a/deps/v8/src/code-stubs.h b/deps/v8/src/code-stubs.h
index d69e9263e1..21e21356bb 100644
--- a/deps/v8/src/code-stubs.h
+++ b/deps/v8/src/code-stubs.h
@@ -8,6 +8,7 @@
#include "src/allocation.h"
#include "src/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"
@@ -43,8 +44,8 @@ namespace internal {
V(MathPow) \
V(ProfileEntryHook) \
V(RecordWrite) \
+ V(RestParamAccess) \
V(RegExpExec) \
- V(StoreArrayLiteralElement) \
V(StoreBufferOverflow) \
V(StoreElement) \
V(StringCompare) \
@@ -71,6 +72,7 @@ namespace internal {
V(CreateAllocationSite) \
V(CreateWeakCell) \
V(ElementsTransitionAndStore) \
+ V(FastCloneRegExp) \
V(FastCloneShallowArray) \
V(FastCloneShallowObject) \
V(FastNewClosure) \
@@ -96,10 +98,7 @@ namespace internal {
V(KeyedLoadIC) \
V(LoadIC) \
/* TurboFanCodeStubs */ \
- V(StringLengthTF) \
- V(StringAddTF) \
- /* TurboFanICs */ \
- V(MathFloor) \
+ V(StringLength) \
/* IC Handler stubs */ \
V(ArrayBufferViewLoadField) \
V(LoadConstant) \
@@ -109,8 +108,7 @@ namespace internal {
V(KeyedStoreSloppyArguments) \
V(StoreField) \
V(StoreGlobal) \
- V(StoreTransition) \
- V(StringLength)
+ V(StoreTransition)
// List of code stubs only used on ARM 32 bits platforms.
#if V8_TARGET_ARCH_ARM
@@ -349,19 +347,6 @@ class CodeStub BASE_EMBEDDED {
}; \
DEFINE_CODE_STUB(NAME, SUPER)
-#define DEFINE_TURBOFAN_IC(NAME, SUPER, DESC) \
- public: \
- CallInterfaceDescriptor GetCallInterfaceDescriptor() const override { \
- if (GetCallMode() == CALL_FROM_OPTIMIZED_CODE) { \
- return DESC##CallFromOptimizedCodeDescriptor(isolate()); \
- } else { \
- return DESC##CallFromUnoptimizedCodeDescriptor(isolate()); \
- } \
- }; \
- \
- protected: \
- DEFINE_CODE_STUB(NAME, SUPER)
-
#define DEFINE_HANDLER_CODE_STUB(NAME, SUPER) \
public: \
Handle<Code> GenerateCode() override; \
@@ -550,35 +535,11 @@ class TurboFanCodeStub : public CodeStub {
protected:
explicit TurboFanCodeStub(Isolate* isolate) : CodeStub(isolate) {}
- private:
- DEFINE_CODE_STUB_BASE(TurboFanCodeStub, CodeStub);
-};
-
-
-class TurboFanIC : public TurboFanCodeStub {
- public:
- enum CallMode { CALL_FROM_UNOPTIMIZED_CODE, CALL_FROM_OPTIMIZED_CODE };
-
- protected:
- explicit TurboFanIC(Isolate* isolate, CallMode mode)
- : TurboFanCodeStub(isolate) {
- minor_key_ = CallModeBits::encode(mode);
- }
-
- CallMode GetCallMode() const { return CallModeBits::decode(minor_key_); }
-
- void set_sub_minor_key(uint32_t key) {
- minor_key_ = SubMinorKeyBits::update(minor_key_, key);
- }
-
- uint32_t sub_minor_key() const { return SubMinorKeyBits::decode(minor_key_); }
-
- static const int kSubMinorKeyBits = kStubMinorKeyBits - 1;
+ virtual void GenerateAssembly(
+ compiler::CodeStubAssembler* assembler) const = 0;
private:
- class CallModeBits : public BitField<CallMode, 0, 1> {};
- class SubMinorKeyBits : public BitField<int, 1, kSubMinorKeyBits> {};
- DEFINE_CODE_STUB_BASE(TurboFanIC, TurboFanCodeStub);
+ DEFINE_CODE_STUB_BASE(TurboFanCodeStub, CodeStub);
};
@@ -649,25 +610,18 @@ class NopRuntimeCallHelper : public RuntimeCallHelper {
};
-class MathFloorStub : public TurboFanIC {
- public:
- explicit MathFloorStub(Isolate* isolate, TurboFanIC::CallMode mode)
- : TurboFanIC(isolate, mode) {}
- Code::Kind GetCodeKind() const override { return Code::CALL_IC; }
- DEFINE_TURBOFAN_IC(MathFloor, TurboFanIC, MathRoundVariant);
-};
-
-
-class StringLengthTFStub : public TurboFanCodeStub {
+class StringLengthStub : public TurboFanCodeStub {
public:
- explicit StringLengthTFStub(Isolate* isolate) : TurboFanCodeStub(isolate) {}
+ explicit StringLengthStub(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; }
+ void GenerateAssembly(compiler::CodeStubAssembler* assembler) const override;
+
DEFINE_CALL_INTERFACE_DESCRIPTOR(LoadWithVector);
- DEFINE_CODE_STUB(StringLengthTF, TurboFanCodeStub);
+ DEFINE_CODE_STUB(StringLength, TurboFanCodeStub);
};
@@ -690,34 +644,6 @@ enum StringAddFlags {
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, 3> {};
- class PretenureFlagBits : public BitField<PretenureFlag, 3, 1> {};
-
- void PrintBaseName(std::ostream& os) const override; // NOLINT
-
- DEFINE_CALL_INTERFACE_DESCRIPTOR(StringAdd);
- DEFINE_CODE_STUB(StringAddTF, TurboFanCodeStub);
-};
-
-
class NumberToStringStub final : public HydrogenCodeStub {
public:
explicit NumberToStringStub(Isolate* isolate) : HydrogenCodeStub(isolate) {}
@@ -794,6 +720,16 @@ class FastNewContextStub final : public HydrogenCodeStub {
};
+class FastCloneRegExpStub final : public HydrogenCodeStub {
+ public:
+ explicit FastCloneRegExpStub(Isolate* isolate) : HydrogenCodeStub(isolate) {}
+
+ private:
+ DEFINE_CALL_INTERFACE_DESCRIPTOR(FastCloneRegExp);
+ DEFINE_HYDROGEN_CODE_STUB(FastCloneRegExp, HydrogenCodeStub);
+};
+
+
class FastCloneShallowArrayStub : public HydrogenCodeStub {
public:
FastCloneShallowArrayStub(Isolate* isolate,
@@ -983,6 +919,7 @@ class CallICStub: public PlatformCodeStub {
protected:
int arg_count() const { return state().argc(); }
+ ConvertReceiverMode convert_mode() const { return state().convert_mode(); }
CallICState state() const {
return CallICState(static_cast<ExtraICState>(minor_key_));
@@ -1169,18 +1106,6 @@ class LoadConstantStub : public HandlerStub {
};
-class StringLengthStub: public HandlerStub {
- public:
- explicit StringLengthStub(Isolate* isolate) : HandlerStub(isolate) {}
-
- protected:
- Code::Kind kind() const override { return Code::LOAD_IC; }
- Code::StubType GetStubType() const override { return Code::FAST; }
-
- DEFINE_HANDLER_CODE_STUB(StringLength, HandlerStub);
-};
-
-
class StoreFieldStub : public HandlerStub {
public:
StoreFieldStub(Isolate* isolate, FieldIndex index,
@@ -1232,20 +1157,15 @@ class StoreTransitionHelper {
}
static Register SlotRegister() {
- DCHECK(FLAG_vector_stores);
return VectorStoreTransitionDescriptor::SlotRegister();
}
static Register VectorRegister() {
- DCHECK(FLAG_vector_stores);
return VectorStoreTransitionDescriptor::VectorRegister();
}
static Register MapRegister() {
- if (FLAG_vector_stores) {
- return VectorStoreTransitionDescriptor::MapRegister();
- }
- return StoreTransitionDescriptor::MapRegister();
+ return VectorStoreTransitionDescriptor::MapRegister();
}
static int ReceiverIndex() {
@@ -1263,7 +1183,6 @@ class StoreTransitionHelper {
}
static int VectorIndex() {
- DCHECK(FLAG_vector_stores);
if (HasVirtualSlotArg()) {
return VectorStoreTransitionDescriptor::kVirtualSlotVectorIndex;
}
@@ -1272,7 +1191,6 @@ class StoreTransitionHelper {
// Some platforms don't have a slot arg.
static bool HasVirtualSlotArg() {
- if (!FLAG_vector_stores) return false;
return SlotRegister().is(no_reg);
}
};
@@ -1703,9 +1621,9 @@ class CompareICStub : public PlatformCodeStub {
void GenerateInternalizedStrings(MacroAssembler* masm);
void GenerateStrings(MacroAssembler* masm);
void GenerateUniqueNames(MacroAssembler* masm);
- void GenerateObjects(MacroAssembler* masm);
+ void GenerateReceivers(MacroAssembler* masm);
void GenerateMiss(MacroAssembler* masm);
- void GenerateKnownObjects(MacroAssembler* masm);
+ void GenerateKnownReceivers(MacroAssembler* masm);
void GenerateGeneric(MacroAssembler* masm);
bool strict() const { return op() == Token::EQ_STRICT; }
@@ -1714,7 +1632,7 @@ class CompareICStub : public PlatformCodeStub {
void AddToSpecialCache(Handle<Code> new_object) override;
bool FindCodeInSpecialCache(Code** code_out) override;
bool UseSpecialCache() override {
- return state() == CompareICState::KNOWN_OBJECT;
+ return state() == CompareICState::KNOWN_RECEIVER;
}
class OpBits : public BitField<int, 0, 3> {};
@@ -1934,6 +1852,20 @@ class ArgumentsAccessStub: public PlatformCodeStub {
};
+class RestParamAccessStub : public PlatformCodeStub {
+ public:
+ explicit RestParamAccessStub(Isolate* isolate) : PlatformCodeStub(isolate) {}
+
+ private:
+ void GenerateNew(MacroAssembler* masm);
+
+ void PrintName(std::ostream& os) const override; // NOLINT
+
+ DEFINE_CALL_INTERFACE_DESCRIPTOR(RestParamAccess);
+ DEFINE_PLATFORM_CODE_STUB(RestParamAccess, PlatformCodeStub);
+};
+
+
class RegExpExecStub: public PlatformCodeStub {
public:
explicit RegExpExecStub(Isolate* isolate) : PlatformCodeStub(isolate) { }
@@ -1958,31 +1890,10 @@ class RegExpConstructResultStub final : public HydrogenCodeStub {
};
-class CallConstructStub: public PlatformCodeStub {
+// TODO(bmeurer/mvstanton): Turn CallConstructStub into ConstructICStub.
+class CallConstructStub final : public PlatformCodeStub {
public:
- CallConstructStub(Isolate* isolate, CallConstructorFlags flags)
- : PlatformCodeStub(isolate) {
- minor_key_ = FlagBits::encode(flags);
- }
-
- void FinishCode(Handle<Code> code) override {
- code->set_has_function_cache(RecordCallTarget());
- }
-
- private:
- CallConstructorFlags flags() const { return FlagBits::decode(minor_key_); }
-
- bool RecordCallTarget() const {
- return (flags() & RECORD_CONSTRUCTOR_TARGET) != 0;
- }
-
- bool IsSuperConstructorCall() const {
- return (flags() & SUPER_CONSTRUCTOR_CALL) != 0;
- }
-
- void PrintName(std::ostream& os) const override; // NOLINT
-
- class FlagBits : public BitField<CallConstructorFlags, 0, 2> {};
+ explicit CallConstructStub(Isolate* isolate) : PlatformCodeStub(isolate) {}
DEFINE_CALL_INTERFACE_DESCRIPTOR(CallConstruct);
DEFINE_PLATFORM_CODE_STUB(CallConstruct, PlatformCodeStub);
@@ -2457,6 +2368,7 @@ class ScriptContextFieldStub : public HandlerStub {
const ScriptContextTable::LookupResult* lookup_result)
: HandlerStub(isolate) {
DCHECK(Accepted(lookup_result));
+ STATIC_ASSERT(kContextIndexBits + kSlotIndexBits <= kSubMinorKeyBits);
set_sub_minor_key(ContextIndexBits::encode(lookup_result->context_index) |
SlotIndexBits::encode(lookup_result->slot_index));
}
@@ -2473,7 +2385,7 @@ class ScriptContextFieldStub : public HandlerStub {
}
private:
- static const int kContextIndexBits = 13;
+ static const int kContextIndexBits = 9;
static const int kSlotIndexBits = 13;
class ContextIndexBits : public BitField<int, 0, kContextIndexBits> {};
class SlotIndexBits
@@ -2566,10 +2478,7 @@ class StoreFastElementStub : public HydrogenCodeStub {
}
CallInterfaceDescriptor GetCallInterfaceDescriptor() const override {
- if (FLAG_vector_stores) {
- return VectorStoreICDescriptor(isolate());
- }
- return StoreDescriptor(isolate());
+ return VectorStoreICDescriptor(isolate());
}
Code::Kind GetCodeKind() const override { return Code::HANDLER; }
@@ -2820,10 +2729,7 @@ class StoreElementStub : public PlatformCodeStub {
}
CallInterfaceDescriptor GetCallInterfaceDescriptor() const override {
- if (FLAG_vector_stores) {
- return VectorStoreICDescriptor(isolate());
- }
- return StoreDescriptor(isolate());
+ return VectorStoreICDescriptor(isolate());
}
Code::Kind GetCodeKind() const override { return Code::HANDLER; }
@@ -2854,12 +2760,6 @@ class ToBooleanStub: public HydrogenCodeStub {
NUMBER_OF_TYPES
};
- enum ResultMode {
- RESULT_AS_SMI, // For Smi(1) on truthy value, Smi(0) otherwise.
- RESULT_AS_ODDBALL, // For {true} on truthy value, {false} otherwise.
- RESULT_AS_INVERSE_ODDBALL // For {false} on truthy value, {true} otherwise.
- };
-
// At most 16 different types can be distinguished, because the Code object
// only has room for two bytes to hold a set of these types. :-P
STATIC_ASSERT(NUMBER_OF_TYPES <= 16);
@@ -2879,21 +2779,13 @@ class ToBooleanStub: public HydrogenCodeStub {
static Types Generic() { return Types((1 << NUMBER_OF_TYPES) - 1); }
};
- ToBooleanStub(Isolate* isolate, ResultMode mode, Types types = Types())
- : HydrogenCodeStub(isolate) {
- set_sub_minor_key(TypesBits::encode(types.ToIntegral()) |
- ResultModeBits::encode(mode));
- }
-
ToBooleanStub(Isolate* isolate, ExtraICState state)
: HydrogenCodeStub(isolate) {
- set_sub_minor_key(TypesBits::encode(static_cast<uint16_t>(state)) |
- ResultModeBits::encode(RESULT_AS_SMI));
+ set_sub_minor_key(TypesBits::encode(static_cast<uint16_t>(state)));
}
bool UpdateStatus(Handle<Object> object);
Types types() const { return Types(TypesBits::decode(sub_minor_key())); }
- ResultMode mode() const { return ResultModeBits::decode(sub_minor_key()); }
Code::Kind GetCodeKind() const override { return Code::TO_BOOLEAN_IC; }
void PrintState(std::ostream& os) const override; // NOLINT
@@ -2917,11 +2809,9 @@ class ToBooleanStub: public HydrogenCodeStub {
private:
ToBooleanStub(Isolate* isolate, InitializationState init_state)
: HydrogenCodeStub(isolate, init_state) {
- set_sub_minor_key(ResultModeBits::encode(RESULT_AS_SMI));
}
class TypesBits : public BitField<uint16_t, 0, NUMBER_OF_TYPES> {};
- class ResultModeBits : public BitField<ResultMode, NUMBER_OF_TYPES, 2> {};
DEFINE_CALL_INTERFACE_DESCRIPTOR(ToBoolean);
DEFINE_HYDROGEN_CODE_STUB(ToBoolean, HydrogenCodeStub);
@@ -2961,16 +2851,6 @@ class ElementsTransitionAndStoreStub : public HydrogenCodeStub {
};
-class StoreArrayLiteralElementStub : public PlatformCodeStub {
- public:
- explicit StoreArrayLiteralElementStub(Isolate* isolate)
- : PlatformCodeStub(isolate) { }
-
- DEFINE_CALL_INTERFACE_DESCRIPTOR(StoreArrayLiteralElement);
- DEFINE_PLATFORM_CODE_STUB(StoreArrayLiteralElement, PlatformCodeStub);
-};
-
-
class StubFailureTrampolineStub : public PlatformCodeStub {
public:
StubFailureTrampolineStub(Isolate* isolate, StubFunctionMode function_mode)