diff options
author | Ben Noordhuis <info@bnoordhuis.nl> | 2014-03-31 14:38:28 +0200 |
---|---|---|
committer | Fedor Indutny <fedor@indutny.com> | 2014-04-02 00:05:24 +0400 |
commit | 67e078094b53861a5aa7e9354e33487d0bd4f73b (patch) | |
tree | 09a706adee1ddb59c1507ee3320de9cb6896135b /deps/v8/src/code-stubs.h | |
parent | f984555d47298cfb01b3e55c2861066379306fc3 (diff) | |
download | node-67e078094b53861a5aa7e9354e33487d0bd4f73b.tar.gz |
deps: upgrade v8 to 3.25.30
Diffstat (limited to 'deps/v8/src/code-stubs.h')
-rw-r--r-- | deps/v8/src/code-stubs.h | 205 |
1 files changed, 123 insertions, 82 deletions
diff --git a/deps/v8/src/code-stubs.h b/deps/v8/src/code-stubs.h index 8d283d9e3..5a8894233 100644 --- a/deps/v8/src/code-stubs.h +++ b/deps/v8/src/code-stubs.h @@ -51,9 +51,7 @@ namespace internal { V(CompareIC) \ V(CompareNilIC) \ V(MathPow) \ - V(StringLength) \ V(FunctionPrototype) \ - V(StoreArrayLength) \ V(RecordWrite) \ V(StoreBufferOverflow) \ V(RegExpExec) \ @@ -98,9 +96,11 @@ namespace internal { V(CallApiGetter) \ /* IC Handler stubs */ \ V(LoadField) \ - V(KeyedLoadField) + V(KeyedLoadField) \ + V(StringLength) \ + V(KeyedStringLength) -// List of code stubs only used on ARM platforms. +// List of code stubs only used on ARM 32 bits platforms. #if V8_TARGET_ARCH_ARM #define CODE_STUB_LIST_ARM(V) \ V(GetProperty) \ @@ -111,6 +111,19 @@ namespace internal { #define CODE_STUB_LIST_ARM(V) #endif +// List of code stubs only used on ARM 64 bits platforms. +#if V8_TARGET_ARCH_ARM64 +#define CODE_STUB_LIST_ARM64(V) \ + V(GetProperty) \ + V(SetProperty) \ + V(InvokeBuiltin) \ + V(DirectCEntry) \ + V(StoreRegistersState) \ + V(RestoreRegistersState) +#else +#define CODE_STUB_LIST_ARM64(V) +#endif + // List of code stubs only used on MIPS platforms. #if V8_TARGET_ARCH_MIPS #define CODE_STUB_LIST_MIPS(V) \ @@ -126,6 +139,7 @@ namespace internal { #define CODE_STUB_LIST(V) \ CODE_STUB_LIST_ALL_PLATFORMS(V) \ CODE_STUB_LIST_ARM(V) \ + CODE_STUB_LIST_ARM64(V) \ CODE_STUB_LIST_MIPS(V) // Stub is base classes of all stubs. @@ -144,7 +158,9 @@ class CodeStub BASE_EMBEDDED { Handle<Code> GetCode(Isolate* isolate); // Retrieve the code for the stub, make and return a copy of the code. - Handle<Code> GetCodeCopyFromTemplate(Isolate* isolate); + Handle<Code> GetCodeCopy( + Isolate* isolate, const Code::FindAndReplacePattern& pattern); + static Major MajorKeyFromKey(uint32_t key) { return static_cast<Major>(MajorKeyBits::decode(key)); } @@ -188,9 +204,6 @@ class CodeStub BASE_EMBEDDED { virtual Code::StubType GetStubType() { return Code::NORMAL; } - virtual int GetStubFlags() { - return -1; - } virtual void PrintName(StringStream* stream); @@ -442,6 +455,8 @@ class RuntimeCallHelper { #include "ia32/code-stubs-ia32.h" #elif V8_TARGET_ARCH_X64 #include "x64/code-stubs-x64.h" +#elif V8_TARGET_ARCH_ARM64 +#include "arm64/code-stubs-arm64.h" #elif V8_TARGET_ARCH_ARM #include "arm/code-stubs-arm.h" #elif V8_TARGET_ARCH_MIPS @@ -487,6 +502,13 @@ class ToNumberStub: public HydrogenCodeStub { Isolate* isolate, CodeStubInterfaceDescriptor* descriptor); + static void InstallDescriptors(Isolate* isolate) { + ToNumberStub stub; + stub.InitializeInterfaceDescriptor( + isolate, + isolate->code_stub_interface_descriptor(CodeStub::ToNumber)); + } + private: Major MajorKey() { return ToNumber; } int NotMissMinorKey() { return 0; } @@ -516,8 +538,8 @@ class NumberToStringStub V8_FINAL : public HydrogenCodeStub { class FastNewClosureStub : public HydrogenCodeStub { public: - explicit FastNewClosureStub(LanguageMode language_mode, bool is_generator) - : language_mode_(language_mode), + explicit FastNewClosureStub(StrictMode strict_mode, bool is_generator) + : strict_mode_(strict_mode), is_generator_(is_generator) { } virtual Handle<Code> GenerateCode(Isolate* isolate); @@ -528,7 +550,7 @@ class FastNewClosureStub : public HydrogenCodeStub { static void InstallDescriptors(Isolate* isolate); - LanguageMode language_mode() const { return language_mode_; } + StrictMode strict_mode() const { return strict_mode_; } bool is_generator() const { return is_generator_; } private: @@ -537,11 +559,11 @@ class FastNewClosureStub : public HydrogenCodeStub { Major MajorKey() { return FastNewClosure; } int NotMissMinorKey() { - return StrictModeBits::encode(language_mode_ != CLASSIC_MODE) | + return StrictModeBits::encode(strict_mode_ == STRICT) | IsGeneratorBits::encode(is_generator_); } - LanguageMode language_mode_; + StrictMode strict_mode_; bool is_generator_; }; @@ -625,6 +647,8 @@ class FastCloneShallowArrayStub : public HydrogenCodeStub { Isolate* isolate, CodeStubInterfaceDescriptor* descriptor); + static void InstallDescriptors(Isolate* isolate); + private: Mode mode_; AllocationSiteMode allocation_site_mode_; @@ -651,8 +675,7 @@ class FastCloneShallowObjectStub : public HydrogenCodeStub { // Maximum number of properties in copied object. static const int kMaximumClonedProperties = 6; - explicit FastCloneShallowObjectStub(int length) - : length_(length) { + explicit FastCloneShallowObjectStub(int length) : length_(length) { ASSERT_GE(length_, 0); ASSERT_LE(length_, kMaximumClonedProperties); } @@ -826,20 +849,9 @@ class FunctionPrototypeStub: public ICStub { }; -class StringLengthStub: public ICStub { - public: - explicit StringLengthStub(Code::Kind kind) : ICStub(kind) { } - virtual void Generate(MacroAssembler* masm); - - private: - STATIC_ASSERT(KindBits::kSize == 4); - virtual CodeStub::Major MajorKey() { return StringLength; } -}; - - class StoreICStub: public ICStub { public: - StoreICStub(Code::Kind kind, StrictModeFlag strict_mode) + StoreICStub(Code::Kind kind, StrictMode strict_mode) : ICStub(kind), strict_mode_(strict_mode) { } protected: @@ -854,18 +866,7 @@ class StoreICStub: public ICStub { return KindBits::encode(kind()) | StrictModeBits::encode(strict_mode_); } - StrictModeFlag strict_mode_; -}; - - -class StoreArrayLengthStub: public StoreICStub { - public: - explicit StoreArrayLengthStub(Code::Kind kind, StrictModeFlag strict_mode) - : StoreICStub(kind, strict_mode) { } - virtual void Generate(MacroAssembler* masm); - - private: - virtual CodeStub::Major MajorKey() { return StoreArrayLength; } + StrictMode strict_mode_; }; @@ -883,7 +884,7 @@ class HICStub: public HydrogenCodeStub { class HandlerStub: public HICStub { public: virtual Code::Kind GetCodeKind() const { return Code::HANDLER; } - virtual int GetStubFlags() { return kind(); } + virtual ExtraICState GetExtraICState() { return kind(); } protected: HandlerStub() : HICStub() { } @@ -937,11 +938,10 @@ class LoadFieldStub: public HandlerStub { bool inobject, int index, Representation representation) { - bool unboxed_double = FLAG_track_double_fields && representation.IsDouble(); bit_field_ = KindBits::encode(kind) | InobjectBits::encode(inobject) | IndexBits::encode(index) - | UnboxedDoubleBits::encode(unboxed_double); + | UnboxedDoubleBits::encode(representation.IsDouble()); } private: @@ -953,22 +953,69 @@ class LoadFieldStub: public HandlerStub { }; +class StringLengthStub: public HandlerStub { + public: + explicit StringLengthStub() : HandlerStub() { + Initialize(Code::LOAD_IC); + } + virtual Handle<Code> GenerateCode(Isolate* isolate); + virtual void InitializeInterfaceDescriptor( + Isolate* isolate, + CodeStubInterfaceDescriptor* descriptor); + + protected: + virtual Code::Kind kind() const { + return KindBits::decode(bit_field_); + } + + void Initialize(Code::Kind kind) { + bit_field_ = KindBits::encode(kind); + } + + private: + virtual CodeStub::Major MajorKey() { return StringLength; } +}; + + +class KeyedStringLengthStub: public StringLengthStub { + public: + explicit KeyedStringLengthStub() : StringLengthStub() { + Initialize(Code::KEYED_LOAD_IC); + } + virtual void InitializeInterfaceDescriptor( + Isolate* isolate, + CodeStubInterfaceDescriptor* descriptor); + + private: + virtual CodeStub::Major MajorKey() { return KeyedStringLength; } +}; + + class StoreGlobalStub : public HandlerStub { public: - explicit StoreGlobalStub(bool is_constant) { - bit_field_ = IsConstantBits::encode(is_constant); + explicit StoreGlobalStub(bool is_constant, bool check_global) { + bit_field_ = IsConstantBits::encode(is_constant) | + CheckGlobalBits::encode(check_global); + } + + static Handle<HeapObject> global_placeholder(Isolate* isolate) { + return isolate->factory()->uninitialized_value(); } Handle<Code> GetCodeCopyFromTemplate(Isolate* isolate, - Map* receiver_map, - PropertyCell* cell) { - Handle<Code> code = CodeStub::GetCodeCopyFromTemplate(isolate); - // Replace the placeholder cell and global object map with the actual global - // cell and receiver map. - Map* cell_map = isolate->heap()->global_property_cell_map(); - code->ReplaceNthObject(1, cell_map, cell); - code->ReplaceNthObject(1, isolate->heap()->meta_map(), receiver_map); - return code; + Handle<GlobalObject> global, + Handle<PropertyCell> cell) { + if (check_global()) { + Code::FindAndReplacePattern pattern; + pattern.Add(Handle<Map>(global_placeholder(isolate)->map()), global); + pattern.Add(isolate->factory()->meta_map(), Handle<Map>(global->map())); + pattern.Add(isolate->factory()->global_property_cell_map(), cell); + return CodeStub::GetCodeCopy(isolate, pattern); + } else { + Code::FindAndReplacePattern pattern; + pattern.Add(isolate->factory()->global_property_cell_map(), cell); + return CodeStub::GetCodeCopy(isolate, pattern); + } } virtual Code::Kind kind() const { return Code::STORE_IC; } @@ -979,11 +1026,12 @@ class StoreGlobalStub : public HandlerStub { Isolate* isolate, CodeStubInterfaceDescriptor* descriptor); - virtual ExtraICState GetExtraICState() { return bit_field_; } - - bool is_constant() { + bool is_constant() const { return IsConstantBits::decode(bit_field_); } + bool check_global() const { + return CheckGlobalBits::decode(bit_field_); + } void set_is_constant(bool value) { bit_field_ = IsConstantBits::update(bit_field_, value); } @@ -996,13 +1044,11 @@ class StoreGlobalStub : public HandlerStub { } private: - virtual int NotMissMinorKey() { return GetExtraICState(); } Major MajorKey() { return StoreGlobal; } class IsConstantBits: public BitField<bool, 0, 1> {}; class RepresentationBits: public BitField<Representation::Kind, 1, 8> {}; - - int bit_field_; + class CheckGlobalBits: public BitField<bool, 9, 1> {}; DISALLOW_COPY_AND_ASSIGN(StoreGlobalStub); }; @@ -1010,13 +1056,14 @@ class StoreGlobalStub : public HandlerStub { class CallApiFunctionStub : public PlatformCodeStub { public: - CallApiFunctionStub(bool restore_context, + CallApiFunctionStub(bool is_store, bool call_data_undefined, int argc) { bit_field_ = - RestoreContextBits::encode(restore_context) | + IsStoreBits::encode(is_store) | CallDataUndefinedBits::encode(call_data_undefined) | ArgumentBits::encode(argc); + ASSERT(!is_store || argc == 1); } private: @@ -1024,7 +1071,7 @@ class CallApiFunctionStub : public PlatformCodeStub { virtual Major MajorKey() V8_OVERRIDE { return CallApiFunction; } virtual int MinorKey() V8_OVERRIDE { return bit_field_; } - class RestoreContextBits: public BitField<bool, 0, 1> {}; + class IsStoreBits: public BitField<bool, 0, 1> {}; class CallDataUndefinedBits: public BitField<bool, 1, 1> {}; class ArgumentBits: public BitField<int, 2, Code::kArgumentsBits> {}; @@ -1058,8 +1105,6 @@ class KeyedLoadFieldStub: public LoadFieldStub { Isolate* isolate, CodeStubInterfaceDescriptor* descriptor); - virtual Handle<Code> GenerateCode(Isolate* isolate); - private: virtual CodeStub::Major MajorKey() { return KeyedLoadField; } }; @@ -1155,10 +1200,9 @@ class BinaryOpICWithAllocationSiteStub V8_FINAL : public PlatformCodeStub { Handle<Code> GetCodeCopyFromTemplate(Isolate* isolate, Handle<AllocationSite> allocation_site) { - Handle<Code> code = CodeStub::GetCodeCopyFromTemplate(isolate); - // Replace the placeholder oddball with the actual allocation site. - code->ReplaceNthObject(1, isolate->heap()->oddball_map(), *allocation_site); - return code; + Code::FindAndReplacePattern pattern; + pattern.Add(isolate->factory()->oddball_map(), allocation_site); + return CodeStub::GetCodeCopy(isolate, pattern); } virtual Code::Kind GetCodeKind() const V8_OVERRIDE { @@ -1368,7 +1412,7 @@ class CompareNilICStub : public HydrogenCodeStub { Isolate* isolate, CodeStubInterfaceDescriptor* descriptor); - static void InitializeForIsolate(Isolate* isolate) { + static void InstallDescriptors(Isolate* isolate) { CompareNilICStub compare_stub(kNullValue, UNINITIALIZED); compare_stub.InitializeInterfaceDescriptor( isolate, @@ -1466,7 +1510,6 @@ class CEntryStub : public PlatformCodeStub { void GenerateCore(MacroAssembler* masm, Label* throw_normal_exception, Label* throw_termination_exception, - Label* throw_out_of_memory_exception, bool do_gc, bool always_allocate_scope); @@ -1520,8 +1563,8 @@ class ArgumentsAccessStub: public PlatformCodeStub { public: enum Type { READ_ELEMENT, - NEW_NON_STRICT_FAST, - NEW_NON_STRICT_SLOW, + NEW_SLOPPY_FAST, + NEW_SLOPPY_SLOW, NEW_STRICT }; @@ -1536,8 +1579,8 @@ class ArgumentsAccessStub: public PlatformCodeStub { void Generate(MacroAssembler* masm); void GenerateReadElement(MacroAssembler* masm); void GenerateNewStrict(MacroAssembler* masm); - void GenerateNewNonStrictFast(MacroAssembler* masm); - void GenerateNewNonStrictSlow(MacroAssembler* masm); + void GenerateNewSloppyFast(MacroAssembler* masm); + void GenerateNewSloppySlow(MacroAssembler* masm); virtual void PrintName(StringStream* stream); }; @@ -1866,23 +1909,21 @@ class DoubleToIStub : public PlatformCodeStub { int offset, bool is_truncating, bool skip_fastpath = false) : bit_field_(0) { - bit_field_ = SourceRegisterBits::encode(source.code_) | - DestinationRegisterBits::encode(destination.code_) | + bit_field_ = SourceRegisterBits::encode(source.code()) | + DestinationRegisterBits::encode(destination.code()) | OffsetBits::encode(offset) | IsTruncatingBits::encode(is_truncating) | SkipFastPathBits::encode(skip_fastpath) | SSEBits::encode(CpuFeatures::IsSafeForSnapshot(SSE2) ? - CpuFeatures::IsSafeForSnapshot(SSE3) ? 2 : 1 : 0); + CpuFeatures::IsSafeForSnapshot(SSE3) ? 2 : 1 : 0); } Register source() { - Register result = { SourceRegisterBits::decode(bit_field_) }; - return result; + return Register::from_code(SourceRegisterBits::decode(bit_field_)); } Register destination() { - Register result = { DestinationRegisterBits::decode(bit_field_) }; - return result; + return Register::from_code(DestinationRegisterBits::decode(bit_field_)); } bool is_truncating() { @@ -2334,7 +2375,7 @@ class ToBooleanStub: public HydrogenCodeStub { virtual bool SometimesSetsUpAFrame() { return false; } - static void InitializeForIsolate(Isolate* isolate) { + static void InstallDescriptors(Isolate* isolate) { ToBooleanStub stub; stub.InitializeInterfaceDescriptor( isolate, |