11510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org// Copyright 2012 the V8 project authors. All rights reserved. 21510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org// Use of this source code is governed by a BSD-style license that can be 31510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org// found in the LICENSE file. 41510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 51510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#ifndef V8_CODE_STUBS_H_ 61510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#define V8_CODE_STUBS_H_ 71510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 81510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#include "src/allocation.h" 91510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#include "src/assembler.h" 101510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#include "src/codegen.h" 111510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#include "src/globals.h" 121510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#include "src/ic/ic-state.h" 131510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#include "src/interface-descriptors.h" 141510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#include "src/macro-assembler.h" 151510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#include "src/ostreams.h" 161510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 171510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgnamespace v8 { 181510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgnamespace internal { 191510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 201510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org// List of code stubs used on all platforms. 211510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#define CODE_STUB_LIST_ALL_PLATFORMS(V) \ 221510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org /* PlatformCodeStubs */ \ 231510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(ArgumentsAccess) \ 241510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(ArrayConstructor) \ 251510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(BinaryOpICWithAllocationSite) \ 261510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(CallApiFunction) \ 271510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(CallApiGetter) \ 281510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(CallConstruct) \ 291510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(CallFunction) \ 301510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(CallIC) \ 311510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(CallIC_Array) \ 321510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(CEntry) \ 331510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(CompareIC) \ 341510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(DoubleToI) \ 351510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(FunctionPrototype) \ 361510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(Instanceof) \ 371510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(InternalArrayConstructor) \ 381510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(JSEntry) \ 391510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(KeyedLoadICTrampoline) \ 401510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(LoadICTrampoline) \ 411510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(LoadIndexedInterceptor) \ 421510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(MathPow) \ 431510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(ProfileEntryHook) \ 441510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(RecordWrite) \ 451510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(RegExpExec) \ 461510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(StoreArrayLiteralElement) \ 471510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(StoreBufferOverflow) \ 481510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(StoreElement) \ 491510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(StringCompare) \ 501510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(StubFailureTrampoline) \ 511510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(SubString) \ 521510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org /* HydrogenCodeStubs */ \ 531510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(ArrayNArgumentsConstructor) \ 541510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(ArrayNoArgumentConstructor) \ 551510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(ArraySingleArgumentConstructor) \ 561510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(BinaryOpIC) \ 571510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(BinaryOpWithAllocationSite) \ 581510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(CompareNilIC) \ 591510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(CreateAllocationSite) \ 601510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(ElementsTransitionAndStore) \ 611510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(FastCloneShallowArray) \ 621510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(FastCloneShallowObject) \ 631510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(FastNewClosure) \ 641510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(FastNewContext) \ 651510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(InternalArrayNArgumentsConstructor) \ 661510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(InternalArrayNoArgumentConstructor) \ 671510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(InternalArraySingleArgumentConstructor) \ 681510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(KeyedLoadGeneric) \ 691510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(LoadDictionaryElement) \ 701510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(LoadFastElement) \ 711510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(MegamorphicLoad) \ 721510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(NameDictionaryLookup) \ 731510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(NumberToString) \ 741510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(RegExpConstructResult) \ 751510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(StoreFastElement) \ 761510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(StringAdd) \ 771510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(ToBoolean) \ 781510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(ToNumber) \ 791510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(TransitionElementsKind) \ 801510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(VectorKeyedLoad) \ 811510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(VectorLoad) \ 821510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org /* IC Handler stubs */ \ 831510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(LoadConstant) \ 841510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(LoadField) \ 851510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(KeyedLoadSloppyArguments) \ 861510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(StoreField) \ 871510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(StoreGlobal) \ 881510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(StringLength) 891510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 901510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org// List of code stubs only used on ARM 32 bits platforms. 911510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#if V8_TARGET_ARCH_ARM 921510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#define CODE_STUB_LIST_ARM(V) \ 931510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(DirectCEntry) \ 941510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(WriteInt32ToHeapNumber) 951510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 961510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#else 971510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#define CODE_STUB_LIST_ARM(V) 981510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#endif 991510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 1001510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org// List of code stubs only used on ARM 64 bits platforms. 1011510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#if V8_TARGET_ARCH_ARM64 1021510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#define CODE_STUB_LIST_ARM64(V) \ 1031510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(DirectCEntry) \ 1041510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(RestoreRegistersState) \ 1051510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(StoreRegistersState) 1061510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 1071510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#else 1081510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#define CODE_STUB_LIST_ARM64(V) 1091510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#endif 1101510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 1111510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org// List of code stubs only used on MIPS platforms. 1121510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#if V8_TARGET_ARCH_MIPS 1131510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#define CODE_STUB_LIST_MIPS(V) \ 1141510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(DirectCEntry) \ 1151510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(RestoreRegistersState) \ 1161510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(StoreRegistersState) \ 1171510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(WriteInt32ToHeapNumber) 1181510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#elif V8_TARGET_ARCH_MIPS64 1191510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#define CODE_STUB_LIST_MIPS(V) \ 1201510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(DirectCEntry) \ 1211510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(RestoreRegistersState) \ 1221510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(StoreRegistersState) \ 1231510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org V(WriteInt32ToHeapNumber) 1241510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#else 1251510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#define CODE_STUB_LIST_MIPS(V) 1261510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#endif 1271510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 1281510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org// Combined list of code stubs. 1291510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#define CODE_STUB_LIST(V) \ 1301510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org CODE_STUB_LIST_ALL_PLATFORMS(V) \ 1311510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org CODE_STUB_LIST_ARM(V) \ 1321510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org CODE_STUB_LIST_ARM64(V) \ 1331510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org CODE_STUB_LIST_MIPS(V) 1341510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 1351510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org// Stub is base classes of all stubs. 1361510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass CodeStub BASE_EMBEDDED { 1371510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 1381510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org enum Major { 1391510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#define DEF_ENUM(name) name, 1401510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org CODE_STUB_LIST(DEF_ENUM) 1411510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#undef DEF_ENUM 1421510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org NoCache, // marker for stubs that do custom caching 1431510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org NUMBER_OF_IDS 1441510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org }; 1451510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 1461510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // Retrieve the code for the stub. Generate the code if needed. 1471510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Handle<Code> GetCode(); 1481510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 1491510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // Retrieve the code for the stub, make and return a copy of the code. 1501510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Handle<Code> GetCodeCopy(const Code::FindAndReplacePattern& pattern); 1511510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 1521510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static Major MajorKeyFromKey(uint32_t key) { 1531510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return static_cast<Major>(MajorKeyBits::decode(key)); 1541510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 1551510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static uint32_t MinorKeyFromKey(uint32_t key) { 1561510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return MinorKeyBits::decode(key); 1571510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 1581510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 1591510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // Gets the major key from a code object that is a code stub or binary op IC. 1601510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static Major GetMajorKey(Code* code_stub) { 1611510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return MajorKeyFromKey(code_stub->stub_key()); 1621510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 1631510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 1641510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static uint32_t NoCacheKey() { return MajorKeyBits::encode(NoCache); } 1651510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 1661510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static const char* MajorName(Major major_key, bool allow_unknown_keys); 1671510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 1681510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org explicit CodeStub(Isolate* isolate) : minor_key_(0), isolate_(isolate) {} 1691510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual ~CodeStub() {} 1701510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 1711510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static void GenerateStubsAheadOfTime(Isolate* isolate); 1721510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static void GenerateFPStubs(Isolate* isolate); 1731510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 1741510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // Some stubs put untagged junk on the stack that cannot be scanned by the 1751510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // GC. This means that we must be statically sure that no GC can occur while 1761510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // they are running. If that is the case they should override this to return 1771510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // true, which will cause an assertion if we try to call something that can 1781510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // GC or if we try to put a stack frame on top of the junk, which would not 1791510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // result in a traversable stack. 1801510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual bool SometimesSetsUpAFrame() { return true; } 1811510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 1821510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // Lookup the code in the (possibly custom) cache. 1831510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org bool FindCodeInCache(Code** code_out); 1841510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 1851510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual CallInterfaceDescriptor GetCallInterfaceDescriptor() = 0; 1861510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 1871510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual void InitializeDescriptor(CodeStubDescriptor* descriptor) {} 1881510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 1891510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static void InitializeDescriptor(Isolate* isolate, uint32_t key, 1901510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org CodeStubDescriptor* desc); 1911510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 1921510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static MaybeHandle<Code> GetCode(Isolate* isolate, uint32_t key); 1931510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 1941510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // Returns information for computing the number key. 1951510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual Major MajorKey() const = 0; 1961510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org uint32_t MinorKey() const { return minor_key_; } 1971510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 1981510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual InlineCacheState GetICState() const { return UNINITIALIZED; } 1991510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual ExtraICState GetExtraICState() const { return kNoExtraICState; } 2001510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual Code::StubType GetStubType() { 2011510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return Code::NORMAL; 2021510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 2031510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 2041510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org friend OStream& operator<<(OStream& os, const CodeStub& s) { 2051510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org s.PrintName(os); 2061510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return os; 2071510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 2081510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 2091510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Isolate* isolate() const { return isolate_; } 2101510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 2111510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org protected: 2121510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org CodeStub(uint32_t key, Isolate* isolate) 2131510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org : minor_key_(MinorKeyFromKey(key)), isolate_(isolate) {} 2141510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 2151510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // Generates the assembler code for the stub. 2161510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual Handle<Code> GenerateCode() = 0; 2171510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 2181510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // Returns whether the code generated for this stub needs to be allocated as 2191510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // a fixed (non-moveable) code object. 2201510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual bool NeedsImmovableCode() { return false; } 2211510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 2221510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual void PrintName(OStream& os) const; // NOLINT 2231510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual void PrintBaseName(OStream& os) const; // NOLINT 2241510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual void PrintState(OStream& os) const { ; } // NOLINT 2251510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 2261510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // Computes the key based on major and minor. 2271510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org uint32_t GetKey() { 2281510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DCHECK(static_cast<int>(MajorKey()) < NUMBER_OF_IDS); 2291510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return MinorKeyBits::encode(MinorKey()) | MajorKeyBits::encode(MajorKey()); 2301510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 2311510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 2321510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org uint32_t minor_key_; 2331510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 2341510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org private: 2351510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // Perform bookkeeping required after code generation when stub code is 2361510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // initially generated. 2371510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org void RecordCodeGeneration(Handle<Code> code); 2381510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 2391510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // Finish the code object after it has been generated. 2401510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual void FinishCode(Handle<Code> code) { } 2411510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 2421510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // Activate newly generated stub. Is called after 2431510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // registering stub in the stub cache. 2441510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual void Activate(Code* code) { } 2451510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 2461510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // BinaryOpStub needs to override this. 2471510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual Code::Kind GetCodeKind() const; 2481510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 2491510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // Add the code to a specialized cache, specific to an individual 2501510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // stub type. Please note, this method must add the code object to a 2511510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // roots object, otherwise we will remove the code during GC. 2521510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual void AddToSpecialCache(Handle<Code> new_object) { } 2531510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 2541510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // Find code in a specialized cache, work is delegated to the specific stub. 2551510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual bool FindCodeInSpecialCache(Code** code_out) { 2561510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return false; 2571510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 2581510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 2591510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // If a stub uses a special cache override this. 2601510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual bool UseSpecialCache() { return false; } 2611510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 2621510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // We use this dispatch to statically instantiate the correct code stub for 2631510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // the given stub key and call the passed function with that code stub. 2641510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org typedef void (*DispatchedCall)(CodeStub* stub, void** value_out); 2651510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static void Dispatch(Isolate* isolate, uint32_t key, void** value_out, 2661510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DispatchedCall call); 2671510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 2681510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static void GetCodeDispatchCall(CodeStub* stub, void** value_out); 2691510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 2701510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org STATIC_ASSERT(NUMBER_OF_IDS < (1 << kStubMajorKeyBits)); 2711510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org class MajorKeyBits: public BitField<uint32_t, 0, kStubMajorKeyBits> {}; 2721510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org class MinorKeyBits: public BitField<uint32_t, 2731510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org kStubMajorKeyBits, kStubMinorKeyBits> {}; // NOLINT 2741510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 2751510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org friend class BreakPointIterator; 2761510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 2771510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Isolate* isolate_; 2781510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 2791510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 2801510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 2811510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#define DEFINE_CODE_STUB_BASE(NAME, SUPER) \ 2821510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: \ 2831510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org NAME(uint32_t key, Isolate* isolate) : SUPER(key, isolate) {} \ 2841510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org \ 2851510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org private: \ 2861510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DISALLOW_COPY_AND_ASSIGN(NAME) 2871510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 2881510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 2891510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#define DEFINE_CODE_STUB(NAME, SUPER) \ 2901510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org protected: \ 2911510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual inline Major MajorKey() const OVERRIDE { \ 2921510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return NAME; \ 2931510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org }; \ 2941510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_CODE_STUB_BASE(NAME##Stub, SUPER) 2951510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 2961510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 2971510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#define DEFINE_PLATFORM_CODE_STUB(NAME, SUPER) \ 2981510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org private: \ 2991510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual void Generate(MacroAssembler* masm) OVERRIDE; \ 3001510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_CODE_STUB(NAME, SUPER) 3011510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 3021510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 3031510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#define DEFINE_HYDROGEN_CODE_STUB(NAME, SUPER) \ 3041510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: \ 3051510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual void InitializeDescriptor(CodeStubDescriptor* descriptor) OVERRIDE; \ 3061510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual Handle<Code> GenerateCode() OVERRIDE; \ 3071510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_CODE_STUB(NAME, SUPER) 3081510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 3091510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#define DEFINE_HANDLER_CODE_STUB(NAME, SUPER) \ 3101510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: \ 3111510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual Handle<Code> GenerateCode() OVERRIDE; \ 3121510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_CODE_STUB(NAME, SUPER) 3131510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 3141510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#define DEFINE_CALL_INTERFACE_DESCRIPTOR(NAME) \ 3151510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: \ 3161510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual CallInterfaceDescriptor GetCallInterfaceDescriptor() OVERRIDE { \ 3171510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return NAME##Descriptor(isolate()); \ 3181510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 3191510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 3201510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org// There are some code stubs we just can't describe right now with a 3211510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org// CallInterfaceDescriptor. Isolate behavior for those cases with this macro. 3221510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org// An attempt to retrieve a descriptor will fail. 3231510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#define DEFINE_NULL_CALL_INTERFACE_DESCRIPTOR() \ 3241510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: \ 3251510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual CallInterfaceDescriptor GetCallInterfaceDescriptor() OVERRIDE { \ 3261510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org UNREACHABLE(); \ 3271510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return CallInterfaceDescriptor(); \ 3281510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 3291510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 3301510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 3311510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass PlatformCodeStub : public CodeStub { 3321510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 3331510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // Retrieve the code for the stub. Generate the code if needed. 3341510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual Handle<Code> GenerateCode() OVERRIDE; 3351510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 3361510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual Code::Kind GetCodeKind() const { return Code::STUB; } 3371510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 3381510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org protected: 3391510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org explicit PlatformCodeStub(Isolate* isolate) : CodeStub(isolate) {} 3401510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 3411510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // Generates the assembler code for the stub. 3421510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual void Generate(MacroAssembler* masm) = 0; 3431510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 3441510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_CODE_STUB_BASE(PlatformCodeStub, CodeStub); 3451510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 3461510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 3471510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 3481510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgenum StubFunctionMode { NOT_JS_FUNCTION_STUB_MODE, JS_FUNCTION_STUB_MODE }; 3491510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgenum HandlerArgumentsMode { DONT_PASS_ARGUMENTS, PASS_ARGUMENTS }; 3501510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 3511510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 3521510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass CodeStubDescriptor { 3531510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 3541510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org explicit CodeStubDescriptor(CodeStub* stub); 3551510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 3561510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org CodeStubDescriptor(Isolate* isolate, uint32_t stub_key); 3571510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 3581510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org void Initialize(Address deoptimization_handler = NULL, 3591510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org int hint_stack_parameter_count = -1, 3601510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org StubFunctionMode function_mode = NOT_JS_FUNCTION_STUB_MODE); 3611510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org void Initialize(Register stack_parameter_count, 3621510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Address deoptimization_handler = NULL, 3631510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org int hint_stack_parameter_count = -1, 3641510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org StubFunctionMode function_mode = NOT_JS_FUNCTION_STUB_MODE, 3651510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org HandlerArgumentsMode handler_mode = DONT_PASS_ARGUMENTS); 3661510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 3671510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org void SetMissHandler(ExternalReference handler) { 3681510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org miss_handler_ = handler; 3691510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org has_miss_handler_ = true; 3701510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // Our miss handler infrastructure doesn't currently support 3711510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // variable stack parameter counts. 3721510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DCHECK(!stack_parameter_count_.is_valid()); 3731510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 3741510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 3751510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org void set_call_descriptor(CallInterfaceDescriptor d) { call_descriptor_ = d; } 3761510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org CallInterfaceDescriptor call_descriptor() const { return call_descriptor_; } 3771510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 3781510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org int GetEnvironmentParameterCount() const { 3791510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return call_descriptor().GetEnvironmentParameterCount(); 3801510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 3811510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 3821510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Representation GetEnvironmentParameterRepresentation(int index) const { 3831510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return call_descriptor().GetEnvironmentParameterRepresentation(index); 3841510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 3851510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 3861510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org ExternalReference miss_handler() const { 3871510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DCHECK(has_miss_handler_); 3881510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return miss_handler_; 3891510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 3901510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 3911510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org bool has_miss_handler() const { 3921510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return has_miss_handler_; 3931510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 3941510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 3951510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org bool IsEnvironmentParameterCountRegister(int index) const { 3961510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return call_descriptor().GetEnvironmentParameterRegister(index).is( 3971510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org stack_parameter_count_); 3981510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 3991510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 4001510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org int GetHandlerParameterCount() const { 4011510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org int params = call_descriptor().GetEnvironmentParameterCount(); 4021510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org if (handler_arguments_mode_ == PASS_ARGUMENTS) { 4031510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org params += 1; 4041510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 4051510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return params; 4061510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 4071510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 4081510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org int hint_stack_parameter_count() const { return hint_stack_parameter_count_; } 4091510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Register stack_parameter_count() const { return stack_parameter_count_; } 4101510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org StubFunctionMode function_mode() const { return function_mode_; } 4111510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Address deoptimization_handler() const { return deoptimization_handler_; } 4121510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 4131510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org private: 4141510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org CallInterfaceDescriptor call_descriptor_; 4151510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Register stack_parameter_count_; 4161510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // If hint_stack_parameter_count_ > 0, the code stub can optimize the 4171510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // return sequence. Default value is -1, which means it is ignored. 4181510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org int hint_stack_parameter_count_; 4191510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org StubFunctionMode function_mode_; 4201510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 4211510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Address deoptimization_handler_; 4221510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org HandlerArgumentsMode handler_arguments_mode_; 4231510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 4241510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org ExternalReference miss_handler_; 4251510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org bool has_miss_handler_; 4261510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 4271510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 4281510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 4291510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass HydrogenCodeStub : public CodeStub { 4301510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 4311510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org enum InitializationState { 4321510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org UNINITIALIZED, 4331510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org INITIALIZED 4341510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org }; 4351510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 4361510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual Code::Kind GetCodeKind() const { return Code::STUB; } 4371510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 4381510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org template<class SubClass> 4391510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static Handle<Code> GetUninitialized(Isolate* isolate) { 4401510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org SubClass::GenerateAheadOfTime(isolate); 4411510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return SubClass().GetCode(isolate); 4421510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 4431510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 4441510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // Retrieve the code for the stub. Generate the code if needed. 4451510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual Handle<Code> GenerateCode() = 0; 4461510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 4471510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org bool IsUninitialized() const { return IsMissBits::decode(minor_key_); } 4481510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 4491510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Handle<Code> GenerateLightweightMissCode(ExternalReference miss); 4501510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 4511510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org template<class StateType> 4521510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org void TraceTransition(StateType from, StateType to); 4531510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 4541510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org protected: 4551510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org explicit HydrogenCodeStub(Isolate* isolate, 4561510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org InitializationState state = INITIALIZED) 4571510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org : CodeStub(isolate) { 4581510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org minor_key_ = IsMissBits::encode(state == UNINITIALIZED); 4591510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 4601510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 4611510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org void set_sub_minor_key(uint32_t key) { 4621510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org minor_key_ = SubMinorKeyBits::update(minor_key_, key); 4631510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 4641510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 4651510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org uint32_t sub_minor_key() const { return SubMinorKeyBits::decode(minor_key_); } 4661510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 4671510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static const int kSubMinorKeyBits = kStubMinorKeyBits - 1; 4681510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 4691510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org private: 4701510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org class IsMissBits : public BitField<bool, kSubMinorKeyBits, 1> {}; 4711510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org class SubMinorKeyBits : public BitField<int, 0, kSubMinorKeyBits> {}; 4721510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 4731510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org void GenerateLightweightMiss(MacroAssembler* masm, ExternalReference miss); 4741510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 4751510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_CODE_STUB_BASE(HydrogenCodeStub, CodeStub); 4761510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 4771510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 4781510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 4791510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org// Helper interface to prepare to/restore after making runtime calls. 4801510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass RuntimeCallHelper { 4811510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 4821510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual ~RuntimeCallHelper() {} 4831510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 4841510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual void BeforeCall(MacroAssembler* masm) const = 0; 4851510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 4861510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual void AfterCall(MacroAssembler* masm) const = 0; 4871510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 4881510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org protected: 4891510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org RuntimeCallHelper() {} 4901510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 4911510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org private: 4921510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DISALLOW_COPY_AND_ASSIGN(RuntimeCallHelper); 4931510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 4941510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 4951510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 4961510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org} } // namespace v8::internal 4971510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 4981510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#if V8_TARGET_ARCH_IA32 4991510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#include "src/ia32/code-stubs-ia32.h" 5001510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#elif V8_TARGET_ARCH_X64 5011510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#include "src/x64/code-stubs-x64.h" 5021510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#elif V8_TARGET_ARCH_ARM64 5031510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#include "src/arm64/code-stubs-arm64.h" 5041510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#elif V8_TARGET_ARCH_ARM 5051510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#include "src/arm/code-stubs-arm.h" 5061510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#elif V8_TARGET_ARCH_MIPS 5071510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#include "src/mips/code-stubs-mips.h" 5081510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#elif V8_TARGET_ARCH_MIPS64 5091510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#include "src/mips64/code-stubs-mips64.h" 5101510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#elif V8_TARGET_ARCH_X87 5111510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#include "src/x87/code-stubs-x87.h" 5121510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#else 5131510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#error Unsupported target architecture. 5141510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#endif 5151510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 5161510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgnamespace v8 { 5171510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgnamespace internal { 5181510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 5191510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 5201510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org// RuntimeCallHelper implementation used in stubs: enters/leaves a 5211510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org// newly created internal frame before/after the runtime call. 5221510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass StubRuntimeCallHelper : public RuntimeCallHelper { 5231510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 5241510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org StubRuntimeCallHelper() {} 5251510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 5261510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual void BeforeCall(MacroAssembler* masm) const; 5271510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 5281510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual void AfterCall(MacroAssembler* masm) const; 5291510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 5301510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 5311510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 5321510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org// Trivial RuntimeCallHelper implementation. 5331510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass NopRuntimeCallHelper : public RuntimeCallHelper { 5341510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 5351510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org NopRuntimeCallHelper() {} 5361510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 5371510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual void BeforeCall(MacroAssembler* masm) const {} 5381510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 5391510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual void AfterCall(MacroAssembler* masm) const {} 5401510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 5411510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 5421510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 5431510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass ToNumberStub: public HydrogenCodeStub { 5441510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 5451510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org explicit ToNumberStub(Isolate* isolate) : HydrogenCodeStub(isolate) { } 5461510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 5471510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_CALL_INTERFACE_DESCRIPTOR(ToNumber); 5481510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_HYDROGEN_CODE_STUB(ToNumber, HydrogenCodeStub); 5491510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 5501510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 5511510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 5521510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass NumberToStringStub FINAL : public HydrogenCodeStub { 5531510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 5541510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org explicit NumberToStringStub(Isolate* isolate) : HydrogenCodeStub(isolate) {} 5551510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 5561510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // Parameters accessed via CodeStubGraphBuilder::GetParameter() 5571510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static const int kNumber = 0; 5581510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 5591510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_CALL_INTERFACE_DESCRIPTOR(NumberToString); 5601510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_HYDROGEN_CODE_STUB(NumberToString, HydrogenCodeStub); 5611510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 5621510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 5631510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 5641510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass FastNewClosureStub : public HydrogenCodeStub { 5651510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 5661510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org FastNewClosureStub(Isolate* isolate, StrictMode strict_mode, 5671510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org FunctionKind kind) 5681510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org : HydrogenCodeStub(isolate) { 5691510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DCHECK(IsValidFunctionKind(kind)); 5701510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org set_sub_minor_key(StrictModeBits::encode(strict_mode) | 5711510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org FunctionKindBits::encode(kind)); 5721510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 5731510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 5741510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org StrictMode strict_mode() const { 5751510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return StrictModeBits::decode(sub_minor_key()); 5761510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 5771510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 5781510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org FunctionKind kind() const { 5791510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return FunctionKindBits::decode(sub_minor_key()); 5801510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 5811510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org bool is_arrow() const { return IsArrowFunction(kind()); } 5821510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org bool is_generator() const { return IsGeneratorFunction(kind()); } 5831510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org bool is_concise_method() const { return IsConciseMethod(kind()); } 5841510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 5851510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org private: 5861510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org class StrictModeBits : public BitField<StrictMode, 0, 1> {}; 5871510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org class FunctionKindBits : public BitField<FunctionKind, 1, 3> {}; 5881510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 5891510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_CALL_INTERFACE_DESCRIPTOR(FastNewClosure); 5901510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_HYDROGEN_CODE_STUB(FastNewClosure, HydrogenCodeStub); 5911510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 5921510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 5931510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 5941510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass FastNewContextStub FINAL : public HydrogenCodeStub { 5951510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 5961510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static const int kMaximumSlots = 64; 5971510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 5981510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org FastNewContextStub(Isolate* isolate, int slots) : HydrogenCodeStub(isolate) { 5991510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DCHECK(slots > 0 && slots <= kMaximumSlots); 6001510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org set_sub_minor_key(SlotsBits::encode(slots)); 6011510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 6021510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 6031510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org int slots() const { return SlotsBits::decode(sub_minor_key()); } 6041510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 6051510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // Parameters accessed via CodeStubGraphBuilder::GetParameter() 6061510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static const int kFunction = 0; 6071510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 6081510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org private: 6091510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org class SlotsBits : public BitField<int, 0, 8> {}; 6101510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 6111510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_CALL_INTERFACE_DESCRIPTOR(FastNewContext); 6121510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_HYDROGEN_CODE_STUB(FastNewContext, HydrogenCodeStub); 6131510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 6141510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 6151510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 6161510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass FastCloneShallowArrayStub : public HydrogenCodeStub { 6171510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 6181510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org FastCloneShallowArrayStub(Isolate* isolate, 6191510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org AllocationSiteMode allocation_site_mode) 6201510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org : HydrogenCodeStub(isolate) { 6211510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org set_sub_minor_key(AllocationSiteModeBits::encode(allocation_site_mode)); 6221510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 6231510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 6241510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org AllocationSiteMode allocation_site_mode() const { 6251510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return AllocationSiteModeBits::decode(sub_minor_key()); 6261510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 6271510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 6281510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org private: 6291510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org class AllocationSiteModeBits: public BitField<AllocationSiteMode, 0, 1> {}; 6301510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 6311510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_CALL_INTERFACE_DESCRIPTOR(FastCloneShallowArray); 6321510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_HYDROGEN_CODE_STUB(FastCloneShallowArray, HydrogenCodeStub); 6331510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 6341510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 6351510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 6361510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass FastCloneShallowObjectStub : public HydrogenCodeStub { 6371510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 6381510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // Maximum number of properties in copied object. 6391510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static const int kMaximumClonedProperties = 6; 6401510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 6411510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org FastCloneShallowObjectStub(Isolate* isolate, int length) 6421510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org : HydrogenCodeStub(isolate) { 6431510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DCHECK_GE(length, 0); 6441510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DCHECK_LE(length, kMaximumClonedProperties); 6451510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org set_sub_minor_key(LengthBits::encode(length)); 6461510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 6471510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 6481510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org int length() const { return LengthBits::decode(sub_minor_key()); } 6491510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 6501510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org private: 6511510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org class LengthBits : public BitField<int, 0, 4> {}; 6521510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 6531510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_CALL_INTERFACE_DESCRIPTOR(FastCloneShallowObject); 6541510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_HYDROGEN_CODE_STUB(FastCloneShallowObject, HydrogenCodeStub); 6551510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 6561510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 6571510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 6581510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass CreateAllocationSiteStub : public HydrogenCodeStub { 6591510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 6601510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org explicit CreateAllocationSiteStub(Isolate* isolate) 6611510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org : HydrogenCodeStub(isolate) { } 6621510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 6631510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static void GenerateAheadOfTime(Isolate* isolate); 6641510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 6651510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_CALL_INTERFACE_DESCRIPTOR(CreateAllocationSite); 6661510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_HYDROGEN_CODE_STUB(CreateAllocationSite, HydrogenCodeStub); 6671510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 6681510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 6691510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 6701510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass InstanceofStub: public PlatformCodeStub { 6711510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 6721510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org enum Flags { 6731510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org kNoFlags = 0, 6741510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org kArgsInRegisters = 1 << 0, 6751510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org kCallSiteInlineCheck = 1 << 1, 6761510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org kReturnTrueFalseObject = 1 << 2 6771510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org }; 6781510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 6791510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org InstanceofStub(Isolate* isolate, Flags flags) : PlatformCodeStub(isolate) { 6801510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org minor_key_ = FlagBits::encode(flags); 6811510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 6821510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 6831510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static Register left() { return InstanceofDescriptor::left(); } 6841510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static Register right() { return InstanceofDescriptor::right(); } 6851510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 6861510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual CallInterfaceDescriptor GetCallInterfaceDescriptor() OVERRIDE { 6871510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org if (HasArgsInRegisters()) { 6881510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return InstanceofDescriptor(isolate()); 6891510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 6901510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return ContextOnlyDescriptor(isolate()); 6911510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 6921510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 6931510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org private: 6941510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Flags flags() const { return FlagBits::decode(minor_key_); } 6951510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 6961510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org bool HasArgsInRegisters() const { return (flags() & kArgsInRegisters) != 0; } 6971510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 6981510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org bool HasCallSiteInlineCheck() const { 6991510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return (flags() & kCallSiteInlineCheck) != 0; 7001510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 7011510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 7021510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org bool ReturnTrueFalseObject() const { 7031510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return (flags() & kReturnTrueFalseObject) != 0; 7041510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 7051510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 7061510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual void PrintName(OStream& os) const OVERRIDE; // NOLINT 7071510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 7081510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org class FlagBits : public BitField<Flags, 0, 3> {}; 7091510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 7101510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_PLATFORM_CODE_STUB(Instanceof, PlatformCodeStub); 7111510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 7121510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 7131510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 7141510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgenum AllocationSiteOverrideMode { 7151510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DONT_OVERRIDE, 7161510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DISABLE_ALLOCATION_SITES, 7171510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org LAST_ALLOCATION_SITE_OVERRIDE_MODE = DISABLE_ALLOCATION_SITES 7181510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 7191510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 7201510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 7211510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass ArrayConstructorStub: public PlatformCodeStub { 7221510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 7231510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org enum ArgumentCountKey { ANY, NONE, ONE, MORE_THAN_ONE }; 7241510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 7251510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org ArrayConstructorStub(Isolate* isolate, int argument_count); 7261510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 7271510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org explicit ArrayConstructorStub(Isolate* isolate); 7281510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 7291510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org private: 7301510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org ArgumentCountKey argument_count() const { 7311510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return ArgumentCountBits::decode(minor_key_); 7321510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 7331510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 7341510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org void GenerateDispatchToArrayStub(MacroAssembler* masm, 7351510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org AllocationSiteOverrideMode mode); 7361510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 7371510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual void PrintName(OStream& os) const OVERRIDE; // NOLINT 7381510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 7391510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org class ArgumentCountBits : public BitField<ArgumentCountKey, 0, 2> {}; 7401510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 7411510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_CALL_INTERFACE_DESCRIPTOR(ArrayConstructor); 7421510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_PLATFORM_CODE_STUB(ArrayConstructor, PlatformCodeStub); 7431510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 7441510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 7451510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 7461510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass InternalArrayConstructorStub: public PlatformCodeStub { 7471510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 7481510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org explicit InternalArrayConstructorStub(Isolate* isolate); 7491510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 7501510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org private: 7511510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org void GenerateCase(MacroAssembler* masm, ElementsKind kind); 7521510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 7531510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_CALL_INTERFACE_DESCRIPTOR(InternalArrayConstructor); 7541510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_PLATFORM_CODE_STUB(InternalArrayConstructor, PlatformCodeStub); 7551510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 7561510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 7571510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 7581510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass MathPowStub: public PlatformCodeStub { 7591510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 7601510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org enum ExponentType { INTEGER, DOUBLE, TAGGED, ON_STACK }; 7611510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 7621510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org MathPowStub(Isolate* isolate, ExponentType exponent_type) 7631510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org : PlatformCodeStub(isolate) { 7641510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org minor_key_ = ExponentTypeBits::encode(exponent_type); 7651510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 7661510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 7671510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual CallInterfaceDescriptor GetCallInterfaceDescriptor() OVERRIDE { 7681510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org if (exponent_type() == TAGGED) { 7691510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return MathPowTaggedDescriptor(isolate()); 7701510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } else if (exponent_type() == INTEGER) { 7711510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return MathPowIntegerDescriptor(isolate()); 7721510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 7731510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // A CallInterfaceDescriptor doesn't specify double registers (yet). 7741510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return ContextOnlyDescriptor(isolate()); 7751510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 7761510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 7771510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org private: 7781510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org ExponentType exponent_type() const { 7791510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return ExponentTypeBits::decode(minor_key_); 7801510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 7811510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 7821510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org class ExponentTypeBits : public BitField<ExponentType, 0, 2> {}; 7831510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 7841510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_PLATFORM_CODE_STUB(MathPow, PlatformCodeStub); 7851510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 7861510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 7871510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 7881510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass CallICStub: public PlatformCodeStub { 7891510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 7901510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org CallICStub(Isolate* isolate, const CallICState& state) 7911510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org : PlatformCodeStub(isolate) { 7921510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org minor_key_ = state.GetExtraICState(); 7931510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 7941510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 7951510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static int ExtractArgcFromMinorKey(int minor_key) { 7961510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org CallICState state(static_cast<ExtraICState>(minor_key)); 7971510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return state.arg_count(); 7981510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 7991510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 8001510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual Code::Kind GetCodeKind() const OVERRIDE { return Code::CALL_IC; } 8011510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 8021510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual InlineCacheState GetICState() const OVERRIDE { return DEFAULT; } 8031510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 8041510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual ExtraICState GetExtraICState() const FINAL OVERRIDE { 8051510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return static_cast<ExtraICState>(minor_key_); 8061510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 8071510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 8081510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org protected: 8091510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org bool CallAsMethod() const { 8101510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return state().call_type() == CallICState::METHOD; 8111510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 8121510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 8131510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org int arg_count() const { return state().arg_count(); } 8141510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 8151510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org CallICState state() const { 8161510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return CallICState(static_cast<ExtraICState>(minor_key_)); 8171510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 8181510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 8191510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // Code generation helpers. 8201510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org void GenerateMiss(MacroAssembler* masm); 8211510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 8221510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org private: 8231510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual void PrintState(OStream& os) const OVERRIDE; // NOLINT 8241510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 8251510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_CALL_INTERFACE_DESCRIPTOR(CallFunctionWithFeedback); 8261510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_PLATFORM_CODE_STUB(CallIC, PlatformCodeStub); 8271510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 8281510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 8291510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 8301510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass CallIC_ArrayStub: public CallICStub { 8311510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 8321510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org CallIC_ArrayStub(Isolate* isolate, const CallICState& state_in) 8331510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org : CallICStub(isolate, state_in) {} 8341510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 8351510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual InlineCacheState GetICState() const FINAL OVERRIDE { 8361510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return MONOMORPHIC; 8371510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 8381510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 8391510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org private: 8401510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual void PrintState(OStream& os) const OVERRIDE; // NOLINT 8411510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 8421510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_PLATFORM_CODE_STUB(CallIC_Array, CallICStub); 8431510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 8441510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 8451510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 8461510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org// TODO(verwaest): Translate to hydrogen code stub. 8471510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass FunctionPrototypeStub : public PlatformCodeStub { 8481510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 8491510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org explicit FunctionPrototypeStub(Isolate* isolate) 8501510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org : PlatformCodeStub(isolate) {} 8511510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 8521510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual Code::Kind GetCodeKind() const { return Code::HANDLER; } 8531510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 8541510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // TODO(mvstanton): only the receiver register is accessed. When this is 8551510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // translated to a hydrogen code stub, a new CallInterfaceDescriptor 8561510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // should be created that just uses that register for more efficient code. 8571510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_CALL_INTERFACE_DESCRIPTOR(Load); 8581510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_PLATFORM_CODE_STUB(FunctionPrototype, PlatformCodeStub); 8591510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 8601510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 8611510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 8621510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org// TODO(mvstanton): Translate to hydrogen code stub. 8631510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass LoadIndexedInterceptorStub : public PlatformCodeStub { 8641510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 8651510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org explicit LoadIndexedInterceptorStub(Isolate* isolate) 8661510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org : PlatformCodeStub(isolate) {} 8671510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 8681510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual Code::Kind GetCodeKind() const { return Code::HANDLER; } 8691510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual Code::StubType GetStubType() { return Code::FAST; } 8701510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 8711510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_CALL_INTERFACE_DESCRIPTOR(Load); 8721510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_PLATFORM_CODE_STUB(LoadIndexedInterceptor, PlatformCodeStub); 8731510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 8741510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 8751510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 8761510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass HandlerStub : public HydrogenCodeStub { 8771510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 8781510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual Code::Kind GetCodeKind() const { return Code::HANDLER; } 8791510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual ExtraICState GetExtraICState() const { return kind(); } 8801510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual InlineCacheState GetICState() const { return MONOMORPHIC; } 8811510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 8821510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual void InitializeDescriptor(CodeStubDescriptor* descriptor) OVERRIDE; 8831510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 8841510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual CallInterfaceDescriptor GetCallInterfaceDescriptor() OVERRIDE; 8851510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 8861510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org protected: 8871510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org explicit HandlerStub(Isolate* isolate) : HydrogenCodeStub(isolate) {} 8881510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 8891510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual Code::Kind kind() const = 0; 8901510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 8911510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_CODE_STUB_BASE(HandlerStub, HydrogenCodeStub); 8921510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 8931510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 8941510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 8951510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass LoadFieldStub: public HandlerStub { 8961510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 8971510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org LoadFieldStub(Isolate* isolate, FieldIndex index) : HandlerStub(isolate) { 8981510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org int property_index_key = index.GetFieldAccessStubKey(); 8991510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org set_sub_minor_key(LoadFieldByIndexBits::encode(property_index_key)); 9001510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 9011510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 9021510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org FieldIndex index() const { 9031510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org int property_index_key = LoadFieldByIndexBits::decode(sub_minor_key()); 9041510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return FieldIndex::FromFieldAccessStubKey(property_index_key); 9051510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 9061510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 9071510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org protected: 9081510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual Code::Kind kind() const { return Code::LOAD_IC; } 9091510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual Code::StubType GetStubType() { return Code::FAST; } 9101510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 9111510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org private: 9121510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org class LoadFieldByIndexBits : public BitField<int, 0, 13> {}; 9131510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 9141510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_HANDLER_CODE_STUB(LoadField, HandlerStub); 9151510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 9161510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 9171510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 9181510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass KeyedLoadSloppyArgumentsStub : public HandlerStub { 9191510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 9201510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org explicit KeyedLoadSloppyArgumentsStub(Isolate* isolate) 9211510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org : HandlerStub(isolate) {} 9221510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 9231510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org protected: 9241510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual Code::Kind kind() const { return Code::KEYED_LOAD_IC; } 9251510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual Code::StubType GetStubType() { return Code::FAST; } 9261510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 9271510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org private: 9281510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_HANDLER_CODE_STUB(KeyedLoadSloppyArguments, HandlerStub); 9291510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 9301510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 9311510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 9321510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass LoadConstantStub : public HandlerStub { 9331510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 9341510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org LoadConstantStub(Isolate* isolate, int constant_index) 9351510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org : HandlerStub(isolate) { 9361510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org set_sub_minor_key(ConstantIndexBits::encode(constant_index)); 9371510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 9381510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 9391510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org int constant_index() const { 9401510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return ConstantIndexBits::decode(sub_minor_key()); 9411510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 9421510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 9431510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org protected: 9441510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual Code::Kind kind() const { return Code::LOAD_IC; } 9451510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual Code::StubType GetStubType() { return Code::FAST; } 9461510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 9471510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org private: 9481510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org class ConstantIndexBits : public BitField<int, 0, kSubMinorKeyBits> {}; 9491510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 9501510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_HANDLER_CODE_STUB(LoadConstant, HandlerStub); 9511510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 9521510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 9531510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 9541510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass StringLengthStub: public HandlerStub { 9551510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 9561510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org explicit StringLengthStub(Isolate* isolate) : HandlerStub(isolate) {} 9571510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 9581510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org protected: 9591510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual Code::Kind kind() const { return Code::LOAD_IC; } 9601510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual Code::StubType GetStubType() { return Code::FAST; } 9611510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 9621510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_HANDLER_CODE_STUB(StringLength, HandlerStub); 9631510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 9641510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 9651510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 9661510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass StoreFieldStub : public HandlerStub { 9671510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 9681510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org StoreFieldStub(Isolate* isolate, FieldIndex index, 9691510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Representation representation) 9701510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org : HandlerStub(isolate) { 9711510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org int property_index_key = index.GetFieldAccessStubKey(); 9721510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org uint8_t repr = PropertyDetails::EncodeRepresentation(representation); 9731510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org set_sub_minor_key(StoreFieldByIndexBits::encode(property_index_key) | 9741510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org RepresentationBits::encode(repr)); 9751510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 9761510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 9771510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org FieldIndex index() const { 9781510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org int property_index_key = StoreFieldByIndexBits::decode(sub_minor_key()); 9791510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return FieldIndex::FromFieldAccessStubKey(property_index_key); 9801510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 9811510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 9821510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Representation representation() { 9831510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org uint8_t repr = RepresentationBits::decode(sub_minor_key()); 9841510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return PropertyDetails::DecodeRepresentation(repr); 9851510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 9861510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 9871510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org protected: 9881510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual Code::Kind kind() const { return Code::STORE_IC; } 9891510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual Code::StubType GetStubType() { return Code::FAST; } 9901510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 9911510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org private: 9921510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org class StoreFieldByIndexBits : public BitField<int, 0, 13> {}; 9931510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org class RepresentationBits : public BitField<uint8_t, 13, 4> {}; 9941510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 9951510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_HANDLER_CODE_STUB(StoreField, HandlerStub); 9961510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 9971510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 9981510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 9991510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass StoreGlobalStub : public HandlerStub { 10001510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 10011510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org StoreGlobalStub(Isolate* isolate, bool is_constant, bool check_global) 10021510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org : HandlerStub(isolate) { 10031510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org set_sub_minor_key(IsConstantBits::encode(is_constant) | 10041510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org CheckGlobalBits::encode(check_global)); 10051510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 10061510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 10071510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static Handle<HeapObject> global_placeholder(Isolate* isolate) { 10081510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return isolate->factory()->uninitialized_value(); 10091510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 10101510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 10111510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Handle<Code> GetCodeCopyFromTemplate(Handle<GlobalObject> global, 10121510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Handle<PropertyCell> cell) { 10131510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org if (check_global()) { 10141510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Code::FindAndReplacePattern pattern; 10151510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org pattern.Add(Handle<Map>(global_placeholder(isolate())->map()), global); 10161510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org pattern.Add(isolate()->factory()->meta_map(), Handle<Map>(global->map())); 10171510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org pattern.Add(isolate()->factory()->global_property_cell_map(), cell); 10181510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return CodeStub::GetCodeCopy(pattern); 10191510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } else { 10201510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Code::FindAndReplacePattern pattern; 10211510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org pattern.Add(isolate()->factory()->global_property_cell_map(), cell); 10221510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return CodeStub::GetCodeCopy(pattern); 10231510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 10241510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 10251510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 10261510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual Code::Kind kind() const { return Code::STORE_IC; } 10271510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 10281510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org bool is_constant() const { return IsConstantBits::decode(sub_minor_key()); } 10291510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 10301510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org bool check_global() const { return CheckGlobalBits::decode(sub_minor_key()); } 10311510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 10321510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org void set_is_constant(bool value) { 10331510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org set_sub_minor_key(IsConstantBits::update(sub_minor_key(), value)); 10341510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 10351510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 10361510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Representation representation() { 10371510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return Representation::FromKind( 10381510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org RepresentationBits::decode(sub_minor_key())); 10391510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 10401510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 10411510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org void set_representation(Representation r) { 10421510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org set_sub_minor_key(RepresentationBits::update(sub_minor_key(), r.kind())); 10431510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 10441510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 10451510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org private: 10461510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org class IsConstantBits: public BitField<bool, 0, 1> {}; 10471510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org class RepresentationBits: public BitField<Representation::Kind, 1, 8> {}; 10481510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org class CheckGlobalBits: public BitField<bool, 9, 1> {}; 10491510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 10501510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_HANDLER_CODE_STUB(StoreGlobal, HandlerStub); 10511510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 10521510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 10531510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 10541510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass CallApiFunctionStub : public PlatformCodeStub { 10551510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 10561510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org CallApiFunctionStub(Isolate* isolate, 10571510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org bool is_store, 10581510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org bool call_data_undefined, 10591510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org int argc) : PlatformCodeStub(isolate) { 10601510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org minor_key_ = IsStoreBits::encode(is_store) | 10611510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org CallDataUndefinedBits::encode(call_data_undefined) | 10621510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org ArgumentBits::encode(argc); 10631510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DCHECK(!is_store || argc == 1); 10641510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 10651510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 10661510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org private: 10671510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org bool is_store() const { return IsStoreBits::decode(minor_key_); } 10681510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org bool call_data_undefined() const { 10691510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return CallDataUndefinedBits::decode(minor_key_); 10701510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 10711510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org int argc() const { return ArgumentBits::decode(minor_key_); } 10721510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 10731510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org class IsStoreBits: public BitField<bool, 0, 1> {}; 10741510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org class CallDataUndefinedBits: public BitField<bool, 1, 1> {}; 10751510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org class ArgumentBits: public BitField<int, 2, Code::kArgumentsBits> {}; 10761510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org STATIC_ASSERT(Code::kArgumentsBits + 2 <= kStubMinorKeyBits); 10771510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 10781510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_CALL_INTERFACE_DESCRIPTOR(ApiFunction); 10791510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_PLATFORM_CODE_STUB(CallApiFunction, PlatformCodeStub); 10801510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 10811510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 10821510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 10831510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass CallApiGetterStub : public PlatformCodeStub { 10841510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 10851510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org explicit CallApiGetterStub(Isolate* isolate) : PlatformCodeStub(isolate) {} 10861510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 10871510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_CALL_INTERFACE_DESCRIPTOR(ApiGetter); 10881510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_PLATFORM_CODE_STUB(CallApiGetter, PlatformCodeStub); 10891510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 10901510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 10911510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 10921510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass BinaryOpICStub : public HydrogenCodeStub { 10931510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 10941510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org BinaryOpICStub(Isolate* isolate, Token::Value op, 10951510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org OverwriteMode mode = NO_OVERWRITE) 10961510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org : HydrogenCodeStub(isolate, UNINITIALIZED) { 10971510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org BinaryOpICState state(isolate, op, mode); 10981510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org set_sub_minor_key(state.GetExtraICState()); 10991510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 11001510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 11011510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org BinaryOpICStub(Isolate* isolate, const BinaryOpICState& state) 11021510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org : HydrogenCodeStub(isolate) { 11031510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org set_sub_minor_key(state.GetExtraICState()); 11041510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 11051510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 11061510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static void GenerateAheadOfTime(Isolate* isolate); 11071510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 11081510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual Code::Kind GetCodeKind() const OVERRIDE { 11091510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return Code::BINARY_OP_IC; 11101510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 11111510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 11121510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual InlineCacheState GetICState() const FINAL OVERRIDE { 11131510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return state().GetICState(); 11141510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 11151510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 11161510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual ExtraICState GetExtraICState() const FINAL OVERRIDE { 11171510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return static_cast<ExtraICState>(sub_minor_key()); 11181510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 11191510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 11201510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org BinaryOpICState state() const { 11211510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return BinaryOpICState(isolate(), GetExtraICState()); 11221510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 11231510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 11241510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual void PrintState(OStream& os) const FINAL OVERRIDE; // NOLINT 11251510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 11261510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // Parameters accessed via CodeStubGraphBuilder::GetParameter() 11271510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static const int kLeft = 0; 11281510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static const int kRight = 1; 11291510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 11301510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org private: 11311510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static void GenerateAheadOfTime(Isolate* isolate, 11321510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org const BinaryOpICState& state); 11331510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 11341510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_CALL_INTERFACE_DESCRIPTOR(BinaryOp); 11351510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_HYDROGEN_CODE_STUB(BinaryOpIC, HydrogenCodeStub); 11361510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 11371510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 11381510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 11391510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org// TODO(bmeurer): Merge this into the BinaryOpICStub once we have proper tail 11401510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org// call support for stubs in Hydrogen. 11411510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass BinaryOpICWithAllocationSiteStub FINAL : public PlatformCodeStub { 11421510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 11431510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org BinaryOpICWithAllocationSiteStub(Isolate* isolate, 11441510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org const BinaryOpICState& state) 11451510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org : PlatformCodeStub(isolate) { 11461510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org minor_key_ = state.GetExtraICState(); 11471510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 11481510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 11491510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static void GenerateAheadOfTime(Isolate* isolate); 11501510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 11511510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Handle<Code> GetCodeCopyFromTemplate(Handle<AllocationSite> allocation_site) { 11521510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Code::FindAndReplacePattern pattern; 11531510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org pattern.Add(isolate()->factory()->undefined_map(), allocation_site); 11541510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return CodeStub::GetCodeCopy(pattern); 11551510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 11561510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 11571510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual Code::Kind GetCodeKind() const OVERRIDE { 11581510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return Code::BINARY_OP_IC; 11591510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 11601510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 11611510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual InlineCacheState GetICState() const OVERRIDE { 11621510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return state().GetICState(); 11631510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 11641510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 11651510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual ExtraICState GetExtraICState() const OVERRIDE { 11661510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return static_cast<ExtraICState>(minor_key_); 11671510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 11681510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 11691510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual void PrintState(OStream& os) const OVERRIDE; // NOLINT 11701510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 11711510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org private: 11721510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org BinaryOpICState state() const { 11731510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return BinaryOpICState(isolate(), static_cast<ExtraICState>(minor_key_)); 11741510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 11751510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 11761510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static void GenerateAheadOfTime(Isolate* isolate, 11771510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org const BinaryOpICState& state); 11781510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 11791510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_CALL_INTERFACE_DESCRIPTOR(BinaryOpWithAllocationSite); 11801510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_PLATFORM_CODE_STUB(BinaryOpICWithAllocationSite, PlatformCodeStub); 11811510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 11821510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 11831510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 11841510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass BinaryOpWithAllocationSiteStub FINAL : public BinaryOpICStub { 11851510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 11861510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org BinaryOpWithAllocationSiteStub(Isolate* isolate, 11871510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Token::Value op, 11881510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org OverwriteMode mode) 11891510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org : BinaryOpICStub(isolate, op, mode) {} 11901510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 11911510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org BinaryOpWithAllocationSiteStub(Isolate* isolate, const BinaryOpICState& state) 11921510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org : BinaryOpICStub(isolate, state) {} 11931510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 11941510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual Code::Kind GetCodeKind() const FINAL OVERRIDE { 11951510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return Code::STUB; 11961510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 11971510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 11981510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // Parameters accessed via CodeStubGraphBuilder::GetParameter() 11991510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static const int kAllocationSite = 0; 12001510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static const int kLeft = 1; 12011510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static const int kRight = 2; 12021510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 12031510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_CALL_INTERFACE_DESCRIPTOR(BinaryOpWithAllocationSite); 12041510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_HYDROGEN_CODE_STUB(BinaryOpWithAllocationSite, BinaryOpICStub); 12051510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 12061510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 12071510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 12081510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgenum StringAddFlags { 12091510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // Omit both parameter checks. 12101510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org STRING_ADD_CHECK_NONE = 0, 12111510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // Check left parameter. 12121510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org STRING_ADD_CHECK_LEFT = 1 << 0, 12131510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // Check right parameter. 12141510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org STRING_ADD_CHECK_RIGHT = 1 << 1, 12151510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // Check both parameters. 12161510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org STRING_ADD_CHECK_BOTH = STRING_ADD_CHECK_LEFT | STRING_ADD_CHECK_RIGHT 12171510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 12181510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 12191510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 12201510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass StringAddStub FINAL : public HydrogenCodeStub { 12211510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 12221510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org StringAddStub(Isolate* isolate, StringAddFlags flags, 12231510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org PretenureFlag pretenure_flag) 12241510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org : HydrogenCodeStub(isolate) { 12251510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org set_sub_minor_key(StringAddFlagsBits::encode(flags) | 12261510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org PretenureFlagBits::encode(pretenure_flag)); 12271510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 12281510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 12291510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org StringAddFlags flags() const { 12301510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return StringAddFlagsBits::decode(sub_minor_key()); 12311510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 12321510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 12331510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org PretenureFlag pretenure_flag() const { 12341510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return PretenureFlagBits::decode(sub_minor_key()); 12351510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 12361510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 12371510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // Parameters accessed via CodeStubGraphBuilder::GetParameter() 12381510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static const int kLeft = 0; 12391510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static const int kRight = 1; 12401510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 12411510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org private: 12421510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org class StringAddFlagsBits: public BitField<StringAddFlags, 0, 2> {}; 12431510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org class PretenureFlagBits: public BitField<PretenureFlag, 2, 1> {}; 12441510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 12451510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual void PrintBaseName(OStream& os) const OVERRIDE; // NOLINT 12461510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 12471510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_CALL_INTERFACE_DESCRIPTOR(StringAdd); 12481510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_HYDROGEN_CODE_STUB(StringAdd, HydrogenCodeStub); 12491510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 12501510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 12511510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 12521510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass CompareICStub : public PlatformCodeStub { 12531510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 12541510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org CompareICStub(Isolate* isolate, Token::Value op, CompareICState::State left, 12551510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org CompareICState::State right, CompareICState::State state) 12561510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org : PlatformCodeStub(isolate) { 12571510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DCHECK(Token::IsCompareOp(op)); 12581510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org minor_key_ = OpBits::encode(op - Token::EQ) | LeftStateBits::encode(left) | 12591510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org RightStateBits::encode(right) | StateBits::encode(state); 12601510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 12611510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 12621510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org void set_known_map(Handle<Map> map) { known_map_ = map; } 12631510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 12641510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual InlineCacheState GetICState() const; 12651510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 12661510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Token::Value op() const { 12671510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return static_cast<Token::Value>(Token::EQ + OpBits::decode(minor_key_)); 12681510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 12691510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 12701510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org CompareICState::State left() const { 12711510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return LeftStateBits::decode(minor_key_); 12721510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 12731510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org CompareICState::State right() const { 12741510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return RightStateBits::decode(minor_key_); 12751510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 12761510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org CompareICState::State state() const { return StateBits::decode(minor_key_); } 12771510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 12781510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org private: 12791510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual Code::Kind GetCodeKind() const { return Code::COMPARE_IC; } 12801510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 12811510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org void GenerateSmis(MacroAssembler* masm); 12821510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org void GenerateNumbers(MacroAssembler* masm); 12831510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org void GenerateInternalizedStrings(MacroAssembler* masm); 12841510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org void GenerateStrings(MacroAssembler* masm); 12851510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org void GenerateUniqueNames(MacroAssembler* masm); 12861510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org void GenerateObjects(MacroAssembler* masm); 12871510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org void GenerateMiss(MacroAssembler* masm); 12881510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org void GenerateKnownObjects(MacroAssembler* masm); 12891510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org void GenerateGeneric(MacroAssembler* masm); 12901510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 12911510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org bool strict() const { return op() == Token::EQ_STRICT; } 12921510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Condition GetCondition() const; 12931510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 12941510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual void AddToSpecialCache(Handle<Code> new_object); 12951510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual bool FindCodeInSpecialCache(Code** code_out); 12961510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual bool UseSpecialCache() { 12971510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return state() == CompareICState::KNOWN_OBJECT; 12981510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 12991510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 13001510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org class OpBits : public BitField<int, 0, 3> {}; 13011510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org class LeftStateBits : public BitField<CompareICState::State, 3, 4> {}; 13021510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org class RightStateBits : public BitField<CompareICState::State, 7, 4> {}; 13031510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org class StateBits : public BitField<CompareICState::State, 11, 4> {}; 13041510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 13051510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Handle<Map> known_map_; 13061510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 13071510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_CALL_INTERFACE_DESCRIPTOR(BinaryOp); 13081510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_PLATFORM_CODE_STUB(CompareIC, PlatformCodeStub); 13091510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 13101510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 13111510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 13121510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass CompareNilICStub : public HydrogenCodeStub { 13131510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 13141510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Type* GetType(Zone* zone, Handle<Map> map = Handle<Map>()); 13151510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Type* GetInputType(Zone* zone, Handle<Map> map); 13161510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 13171510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org CompareNilICStub(Isolate* isolate, NilValue nil) : HydrogenCodeStub(isolate) { 13181510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org set_sub_minor_key(NilValueBits::encode(nil)); 13191510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 13201510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 13211510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org CompareNilICStub(Isolate* isolate, ExtraICState ic_state, 13221510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org InitializationState init_state = INITIALIZED) 13231510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org : HydrogenCodeStub(isolate, init_state) { 13241510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org set_sub_minor_key(ic_state); 13251510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 13261510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 13271510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static Handle<Code> GetUninitialized(Isolate* isolate, 13281510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org NilValue nil) { 13291510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return CompareNilICStub(isolate, nil, UNINITIALIZED).GetCode(); 13301510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 13311510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 13321510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual InlineCacheState GetICState() const { 13331510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org State state = this->state(); 13341510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org if (state.Contains(GENERIC)) { 13351510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return MEGAMORPHIC; 13361510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } else if (state.Contains(MONOMORPHIC_MAP)) { 13371510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return MONOMORPHIC; 13381510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } else { 13391510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return PREMONOMORPHIC; 13401510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 13411510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 13421510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 13431510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual Code::Kind GetCodeKind() const { return Code::COMPARE_NIL_IC; } 13441510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 13451510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual ExtraICState GetExtraICState() const { return sub_minor_key(); } 13461510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 13471510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org void UpdateStatus(Handle<Object> object); 13481510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 13491510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org bool IsMonomorphic() const { return state().Contains(MONOMORPHIC_MAP); } 13501510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 13511510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org NilValue nil_value() const { return NilValueBits::decode(sub_minor_key()); } 13521510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 13531510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org void ClearState() { 13541510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org set_sub_minor_key(TypesBits::update(sub_minor_key(), 0)); 13551510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 13561510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 13571510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual void PrintState(OStream& os) const OVERRIDE; // NOLINT 13581510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual void PrintBaseName(OStream& os) const OVERRIDE; // NOLINT 13591510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 13601510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org private: 13611510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org CompareNilICStub(Isolate* isolate, NilValue nil, 13621510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org InitializationState init_state) 13631510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org : HydrogenCodeStub(isolate, init_state) { 13641510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org set_sub_minor_key(NilValueBits::encode(nil)); 13651510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 13661510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 13671510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org enum CompareNilType { 13681510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org UNDEFINED, 13691510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org NULL_TYPE, 13701510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org MONOMORPHIC_MAP, 13711510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org GENERIC, 13721510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org NUMBER_OF_TYPES 13731510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org }; 13741510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 13751510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // At most 6 different types can be distinguished, because the Code object 13761510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // only has room for a single byte to hold a set and there are two more 13771510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // boolean flags we need to store. :-P 13781510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org STATIC_ASSERT(NUMBER_OF_TYPES <= 6); 13791510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 13801510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org class State : public EnumSet<CompareNilType, byte> { 13811510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 13821510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org State() : EnumSet<CompareNilType, byte>(0) { } 13831510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org explicit State(byte bits) : EnumSet<CompareNilType, byte>(bits) { } 13841510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org }; 13851510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org friend OStream& operator<<(OStream& os, const State& s); 13861510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 13871510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org State state() const { return State(TypesBits::decode(sub_minor_key())); } 13881510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 13891510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org class NilValueBits : public BitField<NilValue, 0, 1> {}; 13901510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org class TypesBits : public BitField<byte, 1, NUMBER_OF_TYPES> {}; 13911510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 13921510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org friend class CompareNilIC; 13931510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 13941510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_CALL_INTERFACE_DESCRIPTOR(CompareNil); 13951510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_HYDROGEN_CODE_STUB(CompareNilIC, HydrogenCodeStub); 13961510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 13971510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 13981510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 13991510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgOStream& operator<<(OStream& os, const CompareNilICStub::State& s); 14001510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 14011510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 14021510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass CEntryStub : public PlatformCodeStub { 14031510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 14041510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org CEntryStub(Isolate* isolate, int result_size, 14051510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org SaveFPRegsMode save_doubles = kDontSaveFPRegs) 14061510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org : PlatformCodeStub(isolate) { 14071510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org minor_key_ = SaveDoublesBits::encode(save_doubles == kSaveFPRegs); 14081510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DCHECK(result_size == 1 || result_size == 2); 14091510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#ifdef _WIN64 14101510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org minor_key_ = ResultSizeBits::update(minor_key_, result_size); 14111510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#endif // _WIN64 14121510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 14131510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 14141510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // The version of this stub that doesn't save doubles is generated ahead of 14151510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // time, so it's OK to call it from other stubs that can't cope with GC during 14161510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // their code generation. On machines that always have gp registers (x64) we 14171510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // can generate both variants ahead of time. 14181510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static void GenerateAheadOfTime(Isolate* isolate); 14191510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 14201510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org private: 14211510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org bool save_doubles() const { return SaveDoublesBits::decode(minor_key_); } 14221510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#ifdef _WIN64 14231510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org int result_size() const { return ResultSizeBits::decode(minor_key_); } 14241510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#endif // _WIN64 14251510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 14261510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org bool NeedsImmovableCode(); 14271510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 14281510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org class SaveDoublesBits : public BitField<bool, 0, 1> {}; 14291510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org class ResultSizeBits : public BitField<int, 1, 3> {}; 14301510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 14311510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_NULL_CALL_INTERFACE_DESCRIPTOR(); 14321510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_PLATFORM_CODE_STUB(CEntry, PlatformCodeStub); 14331510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 14341510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 14351510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 14361510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass JSEntryStub : public PlatformCodeStub { 14371510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 14381510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org JSEntryStub(Isolate* isolate, StackFrame::Type type) 14391510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org : PlatformCodeStub(isolate) { 14401510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DCHECK(type == StackFrame::ENTRY || type == StackFrame::ENTRY_CONSTRUCT); 14411510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org minor_key_ = StackFrameTypeBits::encode(type); 14421510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 14431510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 14441510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org private: 14451510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual void FinishCode(Handle<Code> code); 14461510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 14471510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual void PrintName(OStream& os) const OVERRIDE { // NOLINT 14481510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org os << (type() == StackFrame::ENTRY ? "JSEntryStub" 14491510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org : "JSConstructEntryStub"); 14501510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 14511510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 14521510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org StackFrame::Type type() const { 14531510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return StackFrameTypeBits::decode(minor_key_); 14541510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 14551510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 14561510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org class StackFrameTypeBits : public BitField<StackFrame::Type, 0, 5> {}; 14571510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 14581510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org int handler_offset_; 14591510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 14601510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_NULL_CALL_INTERFACE_DESCRIPTOR(); 14611510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_PLATFORM_CODE_STUB(JSEntry, PlatformCodeStub); 14621510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 14631510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 14641510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 14651510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass ArgumentsAccessStub: public PlatformCodeStub { 14661510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 14671510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org enum Type { 14681510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org READ_ELEMENT, 14691510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org NEW_SLOPPY_FAST, 14701510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org NEW_SLOPPY_SLOW, 14711510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org NEW_STRICT 14721510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org }; 14731510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 14741510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org ArgumentsAccessStub(Isolate* isolate, Type type) : PlatformCodeStub(isolate) { 14751510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org minor_key_ = TypeBits::encode(type); 14761510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 14771510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 14781510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual CallInterfaceDescriptor GetCallInterfaceDescriptor() OVERRIDE { 14791510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org if (type() == READ_ELEMENT) { 14801510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return ArgumentsAccessReadDescriptor(isolate()); 14811510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 14821510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return ContextOnlyDescriptor(isolate()); 14831510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 14841510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 14851510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org private: 14861510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Type type() const { return TypeBits::decode(minor_key_); } 14871510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 14881510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org void GenerateReadElement(MacroAssembler* masm); 14891510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org void GenerateNewStrict(MacroAssembler* masm); 14901510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org void GenerateNewSloppyFast(MacroAssembler* masm); 14911510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org void GenerateNewSloppySlow(MacroAssembler* masm); 14921510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 14931510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual void PrintName(OStream& os) const OVERRIDE; // NOLINT 14941510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 14951510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org class TypeBits : public BitField<Type, 0, 2> {}; 14961510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 14971510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_PLATFORM_CODE_STUB(ArgumentsAccess, PlatformCodeStub); 14981510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 14991510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 15001510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 15011510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass RegExpExecStub: public PlatformCodeStub { 15021510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 15031510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org explicit RegExpExecStub(Isolate* isolate) : PlatformCodeStub(isolate) { } 15041510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 15051510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_CALL_INTERFACE_DESCRIPTOR(ContextOnly); 15061510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_PLATFORM_CODE_STUB(RegExpExec, PlatformCodeStub); 15071510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 15081510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 15091510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 15101510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass RegExpConstructResultStub FINAL : public HydrogenCodeStub { 15111510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 15121510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org explicit RegExpConstructResultStub(Isolate* isolate) 15131510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org : HydrogenCodeStub(isolate) { } 15141510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 15151510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // Parameters accessed via CodeStubGraphBuilder::GetParameter() 15161510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static const int kLength = 0; 15171510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static const int kIndex = 1; 15181510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static const int kInput = 2; 15191510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 15201510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_CALL_INTERFACE_DESCRIPTOR(RegExpConstructResult); 15211510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_HYDROGEN_CODE_STUB(RegExpConstructResult, HydrogenCodeStub); 15221510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 15231510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 15241510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 15251510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass CallFunctionStub: public PlatformCodeStub { 15261510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 15271510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org CallFunctionStub(Isolate* isolate, int argc, CallFunctionFlags flags) 15281510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org : PlatformCodeStub(isolate) { 15291510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DCHECK(argc >= 0 && argc <= Code::kMaxArguments); 15301510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org minor_key_ = ArgcBits::encode(argc) | FlagBits::encode(flags); 15311510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 15321510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 15331510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static int ExtractArgcFromMinorKey(int minor_key) { 15341510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return ArgcBits::decode(minor_key); 15351510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 15361510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 15371510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org private: 15381510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org int argc() const { return ArgcBits::decode(minor_key_); } 15391510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org int flags() const { return FlagBits::decode(minor_key_); } 15401510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 15411510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org bool CallAsMethod() const { 15421510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return flags() == CALL_AS_METHOD || flags() == WRAP_AND_CALL; 15431510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 15441510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 15451510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org bool NeedsChecks() const { return flags() != WRAP_AND_CALL; } 15461510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 15471510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual void PrintName(OStream& os) const OVERRIDE; // NOLINT 15481510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 15491510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // Minor key encoding in 32 bits with Bitfield <Type, shift, size>. 15501510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org class FlagBits : public BitField<CallFunctionFlags, 0, 2> {}; 15511510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org class ArgcBits : public BitField<unsigned, 2, Code::kArgumentsBits> {}; 15521510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org STATIC_ASSERT(Code::kArgumentsBits + 2 <= kStubMinorKeyBits); 15531510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 15541510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_CALL_INTERFACE_DESCRIPTOR(CallFunction); 15551510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_PLATFORM_CODE_STUB(CallFunction, PlatformCodeStub); 15561510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 15571510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 15581510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 15591510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass CallConstructStub: public PlatformCodeStub { 15601510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 15611510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org CallConstructStub(Isolate* isolate, CallConstructorFlags flags) 15621510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org : PlatformCodeStub(isolate) { 15631510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org minor_key_ = FlagBits::encode(flags); 15641510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 15651510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 15661510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual void FinishCode(Handle<Code> code) { 15671510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org code->set_has_function_cache(RecordCallTarget()); 15681510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 15691510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 15701510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org private: 15711510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org CallConstructorFlags flags() const { return FlagBits::decode(minor_key_); } 15721510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 15731510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org bool RecordCallTarget() const { 15741510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return (flags() & RECORD_CONSTRUCTOR_TARGET) != 0; 15751510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 15761510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 15771510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual void PrintName(OStream& os) const OVERRIDE; // NOLINT 15781510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 15791510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org class FlagBits : public BitField<CallConstructorFlags, 0, 1> {}; 15801510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 15811510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_CALL_INTERFACE_DESCRIPTOR(CallConstruct); 15821510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_PLATFORM_CODE_STUB(CallConstruct, PlatformCodeStub); 15831510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 15841510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 15851510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 15861510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgenum StringIndexFlags { 15871510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // Accepts smis or heap numbers. 15881510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org STRING_INDEX_IS_NUMBER, 15891510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 15901510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // Accepts smis or heap numbers that are valid array indices 15911510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // (ECMA-262 15.4). Invalid indices are reported as being out of 15921510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // range. 15931510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org STRING_INDEX_IS_ARRAY_INDEX 15941510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 15951510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 15961510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 15971510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org// Generates code implementing String.prototype.charCodeAt. 15981510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org// 15991510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org// Only supports the case when the receiver is a string and the index 16001510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org// is a number (smi or heap number) that is a valid index into the 16011510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org// string. Additional index constraints are specified by the 16021510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org// flags. Otherwise, bails out to the provided labels. 16031510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org// 16041510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org// Register usage: |object| may be changed to another string in a way 16051510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org// that doesn't affect charCodeAt/charAt semantics, |index| is 16061510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org// preserved, |scratch| and |result| are clobbered. 16071510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass StringCharCodeAtGenerator { 16081510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 16091510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org StringCharCodeAtGenerator(Register object, 16101510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Register index, 16111510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Register result, 16121510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Label* receiver_not_string, 16131510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Label* index_not_number, 16141510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Label* index_out_of_range, 16151510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org StringIndexFlags index_flags) 16161510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org : object_(object), 16171510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org index_(index), 16181510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org result_(result), 16191510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org receiver_not_string_(receiver_not_string), 16201510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org index_not_number_(index_not_number), 16211510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org index_out_of_range_(index_out_of_range), 16221510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org index_flags_(index_flags) { 16231510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DCHECK(!result_.is(object_)); 16241510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DCHECK(!result_.is(index_)); 16251510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 16261510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 16271510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // Generates the fast case code. On the fallthrough path |result| 16281510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // register contains the result. 16291510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org void GenerateFast(MacroAssembler* masm); 16301510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 16311510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // Generates the slow case code. Must not be naturally 16321510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // reachable. Expected to be put after a ret instruction (e.g., in 16331510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // deferred code). Always jumps back to the fast case. 16341510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org void GenerateSlow(MacroAssembler* masm, 16351510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org const RuntimeCallHelper& call_helper); 16361510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 16371510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // Skip handling slow case and directly jump to bailout. 16381510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org void SkipSlow(MacroAssembler* masm, Label* bailout) { 16391510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org masm->bind(&index_not_smi_); 16401510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org masm->bind(&call_runtime_); 16411510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org masm->jmp(bailout); 16421510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 16431510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 16441510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org private: 16451510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Register object_; 16461510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Register index_; 16471510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Register result_; 16481510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 16491510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Label* receiver_not_string_; 16501510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Label* index_not_number_; 16511510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Label* index_out_of_range_; 16521510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 16531510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org StringIndexFlags index_flags_; 16541510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 16551510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Label call_runtime_; 16561510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Label index_not_smi_; 16571510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Label got_smi_index_; 16581510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Label exit_; 16591510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 16601510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DISALLOW_COPY_AND_ASSIGN(StringCharCodeAtGenerator); 16611510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 16621510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 16631510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 16641510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org// Generates code for creating a one-char string from a char code. 16651510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass StringCharFromCodeGenerator { 16661510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 16671510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org StringCharFromCodeGenerator(Register code, 16681510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Register result) 16691510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org : code_(code), 16701510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org result_(result) { 16711510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DCHECK(!code_.is(result_)); 16721510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 16731510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 16741510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // Generates the fast case code. On the fallthrough path |result| 16751510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // register contains the result. 16761510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org void GenerateFast(MacroAssembler* masm); 16771510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 16781510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // Generates the slow case code. Must not be naturally 16791510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // reachable. Expected to be put after a ret instruction (e.g., in 16801510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // deferred code). Always jumps back to the fast case. 16811510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org void GenerateSlow(MacroAssembler* masm, 16821510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org const RuntimeCallHelper& call_helper); 16831510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 16841510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // Skip handling slow case and directly jump to bailout. 16851510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org void SkipSlow(MacroAssembler* masm, Label* bailout) { 16861510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org masm->bind(&slow_case_); 16871510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org masm->jmp(bailout); 16881510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 16891510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 16901510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org private: 16911510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Register code_; 16921510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Register result_; 16931510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 16941510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Label slow_case_; 16951510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Label exit_; 16961510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 16971510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DISALLOW_COPY_AND_ASSIGN(StringCharFromCodeGenerator); 16981510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 16991510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 17001510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 17011510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org// Generates code implementing String.prototype.charAt. 17021510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org// 17031510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org// Only supports the case when the receiver is a string and the index 17041510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org// is a number (smi or heap number) that is a valid index into the 17051510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org// string. Additional index constraints are specified by the 17061510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org// flags. Otherwise, bails out to the provided labels. 17071510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org// 17081510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org// Register usage: |object| may be changed to another string in a way 17091510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org// that doesn't affect charCodeAt/charAt semantics, |index| is 17101510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org// preserved, |scratch1|, |scratch2|, and |result| are clobbered. 17111510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass StringCharAtGenerator { 17121510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 17131510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org StringCharAtGenerator(Register object, 17141510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Register index, 17151510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Register scratch, 17161510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Register result, 17171510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Label* receiver_not_string, 17181510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Label* index_not_number, 17191510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Label* index_out_of_range, 17201510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org StringIndexFlags index_flags) 17211510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org : char_code_at_generator_(object, 17221510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org index, 17231510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org scratch, 17241510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org receiver_not_string, 17251510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org index_not_number, 17261510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org index_out_of_range, 17271510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org index_flags), 17281510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org char_from_code_generator_(scratch, result) {} 17291510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 17301510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // Generates the fast case code. On the fallthrough path |result| 17311510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // register contains the result. 17321510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org void GenerateFast(MacroAssembler* masm) { 17331510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org char_code_at_generator_.GenerateFast(masm); 17341510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org char_from_code_generator_.GenerateFast(masm); 17351510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 17361510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 17371510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // Generates the slow case code. Must not be naturally 17381510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // reachable. Expected to be put after a ret instruction (e.g., in 17391510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // deferred code). Always jumps back to the fast case. 17401510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org void GenerateSlow(MacroAssembler* masm, 17411510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org const RuntimeCallHelper& call_helper) { 17421510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org char_code_at_generator_.GenerateSlow(masm, call_helper); 17431510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org char_from_code_generator_.GenerateSlow(masm, call_helper); 17441510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 17451510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 17461510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // Skip handling slow case and directly jump to bailout. 17471510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org void SkipSlow(MacroAssembler* masm, Label* bailout) { 17481510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org char_code_at_generator_.SkipSlow(masm, bailout); 17491510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org char_from_code_generator_.SkipSlow(masm, bailout); 17501510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 17511510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 17521510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org private: 17531510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org StringCharCodeAtGenerator char_code_at_generator_; 17541510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org StringCharFromCodeGenerator char_from_code_generator_; 17551510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 17561510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DISALLOW_COPY_AND_ASSIGN(StringCharAtGenerator); 17571510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 17581510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 17591510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 17601510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass LoadDictionaryElementStub : public HydrogenCodeStub { 17611510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 17621510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org explicit LoadDictionaryElementStub(Isolate* isolate) 17631510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org : HydrogenCodeStub(isolate) {} 17641510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 17651510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_CALL_INTERFACE_DESCRIPTOR(Load); 17661510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_HYDROGEN_CODE_STUB(LoadDictionaryElement, HydrogenCodeStub); 17671510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 17681510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 17691510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 17701510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass KeyedLoadGenericStub : public HydrogenCodeStub { 17711510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 17721510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org explicit KeyedLoadGenericStub(Isolate* isolate) : HydrogenCodeStub(isolate) {} 17731510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 17741510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual Code::Kind GetCodeKind() const { return Code::KEYED_LOAD_IC; } 17751510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual InlineCacheState GetICState() const { return GENERIC; } 17761510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 17771510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_CALL_INTERFACE_DESCRIPTOR(Load); 17781510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_HYDROGEN_CODE_STUB(KeyedLoadGeneric, HydrogenCodeStub); 17791510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 17801510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 17811510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 17821510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass LoadICTrampolineStub : public PlatformCodeStub { 17831510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 17841510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org LoadICTrampolineStub(Isolate* isolate, const LoadICState& state) 17851510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org : PlatformCodeStub(isolate) { 17861510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org minor_key_ = state.GetExtraICState(); 17871510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 17881510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 17891510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual Code::Kind GetCodeKind() const OVERRIDE { return Code::LOAD_IC; } 17901510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 17911510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual InlineCacheState GetICState() const FINAL OVERRIDE { 17921510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return GENERIC; 17931510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 17941510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 17951510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual ExtraICState GetExtraICState() const FINAL OVERRIDE { 17961510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return static_cast<ExtraICState>(minor_key_); 17971510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 17981510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 17991510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org private: 18001510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org LoadICState state() const { 18011510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return LoadICState(static_cast<ExtraICState>(minor_key_)); 18021510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 18031510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 18041510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_CALL_INTERFACE_DESCRIPTOR(VectorLoadICTrampoline); 18051510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_PLATFORM_CODE_STUB(LoadICTrampoline, PlatformCodeStub); 18061510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 18071510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 18081510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 18091510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass KeyedLoadICTrampolineStub : public LoadICTrampolineStub { 18101510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 18111510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org explicit KeyedLoadICTrampolineStub(Isolate* isolate) 18121510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org : LoadICTrampolineStub(isolate, LoadICState(0)) {} 18131510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 18141510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual Code::Kind GetCodeKind() const OVERRIDE { 18151510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return Code::KEYED_LOAD_IC; 18161510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 18171510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 18181510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_PLATFORM_CODE_STUB(KeyedLoadICTrampoline, LoadICTrampolineStub); 18191510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 18201510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 18211510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 18221510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass MegamorphicLoadStub : public HydrogenCodeStub { 18231510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 18241510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org MegamorphicLoadStub(Isolate* isolate, const LoadICState& state) 18251510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org : HydrogenCodeStub(isolate) { 18261510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org set_sub_minor_key(state.GetExtraICState()); 18271510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 18281510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 18291510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual Code::Kind GetCodeKind() const OVERRIDE { return Code::LOAD_IC; } 18301510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 18311510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual InlineCacheState GetICState() const FINAL OVERRIDE { 18321510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return MEGAMORPHIC; 18331510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 18341510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 18351510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual ExtraICState GetExtraICState() const FINAL OVERRIDE { 18361510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return static_cast<ExtraICState>(sub_minor_key()); 18371510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 18381510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 18391510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_CALL_INTERFACE_DESCRIPTOR(Load); 18401510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_HYDROGEN_CODE_STUB(MegamorphicLoad, HydrogenCodeStub); 18411510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 18421510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 18431510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 18441510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass VectorLoadStub : public HydrogenCodeStub { 18451510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 18461510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org explicit VectorLoadStub(Isolate* isolate, const LoadICState& state) 18471510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org : HydrogenCodeStub(isolate) { 18481510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org set_sub_minor_key(state.GetExtraICState()); 18491510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 18501510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 18511510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual Code::Kind GetCodeKind() const OVERRIDE { return Code::LOAD_IC; } 18521510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 18531510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual InlineCacheState GetICState() const FINAL OVERRIDE { 18541510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return GENERIC; 18551510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 18561510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 18571510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual ExtraICState GetExtraICState() const FINAL OVERRIDE { 18581510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return static_cast<ExtraICState>(sub_minor_key()); 18591510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 18601510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 18611510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org private: 18621510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org LoadICState state() const { return LoadICState(GetExtraICState()); } 18631510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 18641510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_CALL_INTERFACE_DESCRIPTOR(VectorLoadIC); 18651510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_HYDROGEN_CODE_STUB(VectorLoad, HydrogenCodeStub); 18661510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 18671510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 18681510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 18691510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass VectorKeyedLoadStub : public VectorLoadStub { 18701510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 18711510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org explicit VectorKeyedLoadStub(Isolate* isolate) 18721510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org : VectorLoadStub(isolate, LoadICState(0)) {} 18731510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 18741510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual Code::Kind GetCodeKind() const OVERRIDE { 18751510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return Code::KEYED_LOAD_IC; 18761510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 18771510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 18781510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_CALL_INTERFACE_DESCRIPTOR(VectorLoadIC); 18791510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_HYDROGEN_CODE_STUB(VectorKeyedLoad, VectorLoadStub); 18801510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 18811510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 18821510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 18831510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass DoubleToIStub : public PlatformCodeStub { 18841510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 18851510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DoubleToIStub(Isolate* isolate, Register source, Register destination, 18861510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org int offset, bool is_truncating, bool skip_fastpath = false) 18871510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org : PlatformCodeStub(isolate) { 18881510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org minor_key_ = SourceRegisterBits::encode(source.code()) | 18891510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DestinationRegisterBits::encode(destination.code()) | 18901510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org OffsetBits::encode(offset) | 18911510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org IsTruncatingBits::encode(is_truncating) | 18921510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org SkipFastPathBits::encode(skip_fastpath) | 18931510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org SSE3Bits::encode(CpuFeatures::IsSupported(SSE3) ? 1 : 0); 18941510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 18951510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 18961510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual bool SometimesSetsUpAFrame() { return false; } 18971510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 18981510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org private: 18991510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Register source() const { 19001510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return Register::from_code(SourceRegisterBits::decode(minor_key_)); 19011510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 19021510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Register destination() const { 19031510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return Register::from_code(DestinationRegisterBits::decode(minor_key_)); 19041510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 19051510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org bool is_truncating() const { return IsTruncatingBits::decode(minor_key_); } 19061510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org bool skip_fastpath() const { return SkipFastPathBits::decode(minor_key_); } 19071510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org int offset() const { return OffsetBits::decode(minor_key_); } 19081510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 19091510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static const int kBitsPerRegisterNumber = 6; 19101510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org STATIC_ASSERT((1L << kBitsPerRegisterNumber) >= Register::kNumRegisters); 19111510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org class SourceRegisterBits: 19121510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public BitField<int, 0, kBitsPerRegisterNumber> {}; // NOLINT 19131510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org class DestinationRegisterBits: 19141510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public BitField<int, kBitsPerRegisterNumber, 19151510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org kBitsPerRegisterNumber> {}; // NOLINT 19161510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org class IsTruncatingBits: 19171510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public BitField<bool, 2 * kBitsPerRegisterNumber, 1> {}; // NOLINT 19181510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org class OffsetBits: 19191510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public BitField<int, 2 * kBitsPerRegisterNumber + 1, 3> {}; // NOLINT 19201510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org class SkipFastPathBits: 19211510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public BitField<int, 2 * kBitsPerRegisterNumber + 4, 1> {}; // NOLINT 19221510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org class SSE3Bits: 19231510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public BitField<int, 2 * kBitsPerRegisterNumber + 5, 1> {}; // NOLINT 19241510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 19251510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_NULL_CALL_INTERFACE_DESCRIPTOR(); 19261510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_PLATFORM_CODE_STUB(DoubleToI, PlatformCodeStub); 19271510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 19281510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 19291510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 19301510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass LoadFastElementStub : public HydrogenCodeStub { 19311510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 19321510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org LoadFastElementStub(Isolate* isolate, bool is_js_array, 19331510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org ElementsKind elements_kind) 19341510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org : HydrogenCodeStub(isolate) { 19351510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org set_sub_minor_key(ElementsKindBits::encode(elements_kind) | 19361510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org IsJSArrayBits::encode(is_js_array)); 19371510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 19381510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 19391510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org bool is_js_array() const { return IsJSArrayBits::decode(sub_minor_key()); } 19401510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 19411510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org ElementsKind elements_kind() const { 19421510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return ElementsKindBits::decode(sub_minor_key()); 19431510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 19441510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 19451510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org private: 19461510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org class ElementsKindBits: public BitField<ElementsKind, 0, 8> {}; 19471510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org class IsJSArrayBits: public BitField<bool, 8, 1> {}; 19481510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 19491510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_CALL_INTERFACE_DESCRIPTOR(Load); 19501510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_HYDROGEN_CODE_STUB(LoadFastElement, HydrogenCodeStub); 19511510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 19521510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 19531510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 19541510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass StoreFastElementStub : public HydrogenCodeStub { 19551510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 19561510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org StoreFastElementStub(Isolate* isolate, bool is_js_array, 19571510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org ElementsKind elements_kind, KeyedAccessStoreMode mode) 19581510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org : HydrogenCodeStub(isolate) { 19591510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org set_sub_minor_key(ElementsKindBits::encode(elements_kind) | 19601510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org IsJSArrayBits::encode(is_js_array) | 19611510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org StoreModeBits::encode(mode)); 19621510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 19631510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 19641510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org bool is_js_array() const { return IsJSArrayBits::decode(sub_minor_key()); } 19651510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 19661510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org ElementsKind elements_kind() const { 19671510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return ElementsKindBits::decode(sub_minor_key()); 19681510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 19691510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 19701510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org KeyedAccessStoreMode store_mode() const { 19711510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return StoreModeBits::decode(sub_minor_key()); 19721510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 19731510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 19741510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org private: 19751510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org class ElementsKindBits: public BitField<ElementsKind, 0, 8> {}; 19761510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org class StoreModeBits: public BitField<KeyedAccessStoreMode, 8, 4> {}; 19771510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org class IsJSArrayBits: public BitField<bool, 12, 1> {}; 19781510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 19791510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_CALL_INTERFACE_DESCRIPTOR(Store); 19801510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_HYDROGEN_CODE_STUB(StoreFastElement, HydrogenCodeStub); 19811510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 19821510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 19831510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 19841510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass TransitionElementsKindStub : public HydrogenCodeStub { 19851510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 19861510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org TransitionElementsKindStub(Isolate* isolate, 19871510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org ElementsKind from_kind, 19881510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org ElementsKind to_kind, 19891510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org bool is_js_array) : HydrogenCodeStub(isolate) { 19901510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org set_sub_minor_key(FromKindBits::encode(from_kind) | 19911510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org ToKindBits::encode(to_kind) | 19921510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org IsJSArrayBits::encode(is_js_array)); 19931510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 19941510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 19951510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org ElementsKind from_kind() const { 19961510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return FromKindBits::decode(sub_minor_key()); 19971510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 19981510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 19991510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org ElementsKind to_kind() const { return ToKindBits::decode(sub_minor_key()); } 20001510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 20011510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org bool is_js_array() const { return IsJSArrayBits::decode(sub_minor_key()); } 20021510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 20031510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org private: 20041510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org class FromKindBits: public BitField<ElementsKind, 8, 8> {}; 20051510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org class ToKindBits: public BitField<ElementsKind, 0, 8> {}; 20061510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org class IsJSArrayBits: public BitField<bool, 16, 1> {}; 20071510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 20081510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_CALL_INTERFACE_DESCRIPTOR(TransitionElementsKind); 20091510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_HYDROGEN_CODE_STUB(TransitionElementsKind, HydrogenCodeStub); 20101510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 20111510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 20121510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 20131510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass ArrayConstructorStubBase : public HydrogenCodeStub { 20141510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 20151510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org ArrayConstructorStubBase(Isolate* isolate, 20161510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org ElementsKind kind, 20171510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org AllocationSiteOverrideMode override_mode) 20181510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org : HydrogenCodeStub(isolate) { 20191510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // It only makes sense to override local allocation site behavior 20201510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // if there is a difference between the global allocation site policy 20211510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // for an ElementsKind and the desired usage of the stub. 20221510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DCHECK(override_mode != DISABLE_ALLOCATION_SITES || 20231510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org AllocationSite::GetMode(kind) == TRACK_ALLOCATION_SITE); 20241510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org set_sub_minor_key(ElementsKindBits::encode(kind) | 20251510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org AllocationSiteOverrideModeBits::encode(override_mode)); 20261510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 20271510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 20281510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org ElementsKind elements_kind() const { 20291510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return ElementsKindBits::decode(sub_minor_key()); 20301510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 20311510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 20321510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org AllocationSiteOverrideMode override_mode() const { 20331510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return AllocationSiteOverrideModeBits::decode(sub_minor_key()); 20341510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 20351510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 20361510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static void GenerateStubsAheadOfTime(Isolate* isolate); 20371510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 20381510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // Parameters accessed via CodeStubGraphBuilder::GetParameter() 20391510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static const int kConstructor = 0; 20401510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static const int kAllocationSite = 1; 20411510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 20421510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org protected: 20431510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org OStream& BasePrintName(OStream& os, const char* name) const; // NOLINT 20441510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 20451510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org private: 20461510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // Ensure data fits within available bits. 20471510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org STATIC_ASSERT(LAST_ALLOCATION_SITE_OVERRIDE_MODE == 1); 20481510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 20491510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org class ElementsKindBits: public BitField<ElementsKind, 0, 8> {}; 20501510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org class AllocationSiteOverrideModeBits: public 20511510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org BitField<AllocationSiteOverrideMode, 8, 1> {}; // NOLINT 20521510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 20531510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_CODE_STUB_BASE(ArrayConstructorStubBase, HydrogenCodeStub); 20541510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 20551510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 20561510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 20571510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass ArrayNoArgumentConstructorStub : public ArrayConstructorStubBase { 20581510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 20591510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org ArrayNoArgumentConstructorStub( 20601510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Isolate* isolate, 20611510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org ElementsKind kind, 20621510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org AllocationSiteOverrideMode override_mode = DONT_OVERRIDE) 20631510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org : ArrayConstructorStubBase(isolate, kind, override_mode) { 20641510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 20651510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 20661510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org private: 20671510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual void PrintName(OStream& os) const OVERRIDE { // NOLINT 20681510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org BasePrintName(os, "ArrayNoArgumentConstructorStub"); 20691510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 20701510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 20711510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_CALL_INTERFACE_DESCRIPTOR(ArrayConstructorConstantArgCount); 20721510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_HYDROGEN_CODE_STUB(ArrayNoArgumentConstructor, 20731510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org ArrayConstructorStubBase); 20741510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 20751510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 20761510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 20771510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass ArraySingleArgumentConstructorStub : public ArrayConstructorStubBase { 20781510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 20791510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org ArraySingleArgumentConstructorStub( 20801510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Isolate* isolate, 20811510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org ElementsKind kind, 20821510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org AllocationSiteOverrideMode override_mode = DONT_OVERRIDE) 20831510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org : ArrayConstructorStubBase(isolate, kind, override_mode) { 20841510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 20851510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 20861510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org private: 20871510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual void PrintName(OStream& os) const { // NOLINT 20881510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org BasePrintName(os, "ArraySingleArgumentConstructorStub"); 20891510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 20901510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 20911510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_CALL_INTERFACE_DESCRIPTOR(ArrayConstructor); 20921510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_HYDROGEN_CODE_STUB(ArraySingleArgumentConstructor, 20931510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org ArrayConstructorStubBase); 20941510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 20951510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 20961510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 20971510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass ArrayNArgumentsConstructorStub : public ArrayConstructorStubBase { 20981510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 20991510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org ArrayNArgumentsConstructorStub( 21001510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Isolate* isolate, 21011510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org ElementsKind kind, 21021510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org AllocationSiteOverrideMode override_mode = DONT_OVERRIDE) 21031510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org : ArrayConstructorStubBase(isolate, kind, override_mode) { 21041510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 21051510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 21061510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org private: 21071510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual void PrintName(OStream& os) const { // NOLINT 21081510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org BasePrintName(os, "ArrayNArgumentsConstructorStub"); 21091510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 21101510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 21111510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_CALL_INTERFACE_DESCRIPTOR(ArrayConstructor); 21121510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_HYDROGEN_CODE_STUB(ArrayNArgumentsConstructor, 21131510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org ArrayConstructorStubBase); 21141510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 21151510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 21161510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 21171510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass InternalArrayConstructorStubBase : public HydrogenCodeStub { 21181510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 21191510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org InternalArrayConstructorStubBase(Isolate* isolate, ElementsKind kind) 21201510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org : HydrogenCodeStub(isolate) { 21211510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org set_sub_minor_key(ElementsKindBits::encode(kind)); 21221510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 21231510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 21241510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static void GenerateStubsAheadOfTime(Isolate* isolate); 21251510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 21261510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // Parameters accessed via CodeStubGraphBuilder::GetParameter() 21271510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static const int kConstructor = 0; 21281510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 21291510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org ElementsKind elements_kind() const { 21301510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return ElementsKindBits::decode(sub_minor_key()); 21311510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 21321510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 21331510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org private: 21341510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org class ElementsKindBits : public BitField<ElementsKind, 0, 8> {}; 21351510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 21361510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_CODE_STUB_BASE(InternalArrayConstructorStubBase, HydrogenCodeStub); 21371510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 21381510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 21391510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 21401510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass InternalArrayNoArgumentConstructorStub : public 21411510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org InternalArrayConstructorStubBase { 21421510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 21431510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org InternalArrayNoArgumentConstructorStub(Isolate* isolate, 21441510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org ElementsKind kind) 21451510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org : InternalArrayConstructorStubBase(isolate, kind) { } 21461510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 21471510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_CALL_INTERFACE_DESCRIPTOR(InternalArrayConstructorConstantArgCount); 21481510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_HYDROGEN_CODE_STUB(InternalArrayNoArgumentConstructor, 21491510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org InternalArrayConstructorStubBase); 21501510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 21511510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 21521510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 21531510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass InternalArraySingleArgumentConstructorStub : public 21541510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org InternalArrayConstructorStubBase { 21551510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 21561510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org InternalArraySingleArgumentConstructorStub(Isolate* isolate, 21571510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org ElementsKind kind) 21581510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org : InternalArrayConstructorStubBase(isolate, kind) { } 21591510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 21601510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_CALL_INTERFACE_DESCRIPTOR(InternalArrayConstructor); 21611510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_HYDROGEN_CODE_STUB(InternalArraySingleArgumentConstructor, 21621510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org InternalArrayConstructorStubBase); 21631510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 21641510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 21651510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 21661510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass InternalArrayNArgumentsConstructorStub : public 21671510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org InternalArrayConstructorStubBase { 21681510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 21691510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org InternalArrayNArgumentsConstructorStub(Isolate* isolate, ElementsKind kind) 21701510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org : InternalArrayConstructorStubBase(isolate, kind) { } 21711510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 21721510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_CALL_INTERFACE_DESCRIPTOR(InternalArrayConstructor); 21731510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_HYDROGEN_CODE_STUB(InternalArrayNArgumentsConstructor, 21741510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org InternalArrayConstructorStubBase); 21751510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 21761510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 21771510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 21781510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass StoreElementStub : public PlatformCodeStub { 21791510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 21801510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org StoreElementStub(Isolate* isolate, ElementsKind elements_kind) 21811510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org : PlatformCodeStub(isolate) { 21821510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org minor_key_ = ElementsKindBits::encode(elements_kind); 21831510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 21841510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 21851510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org private: 21861510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org ElementsKind elements_kind() const { 21871510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return ElementsKindBits::decode(minor_key_); 21881510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 21891510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 21901510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org class ElementsKindBits : public BitField<ElementsKind, 0, 8> {}; 21911510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 21921510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_CALL_INTERFACE_DESCRIPTOR(Store); 21931510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_PLATFORM_CODE_STUB(StoreElement, PlatformCodeStub); 21941510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 21951510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 21961510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 21971510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass ToBooleanStub: public HydrogenCodeStub { 21981510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 21991510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org enum Type { 22001510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org UNDEFINED, 22011510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org BOOLEAN, 22021510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org NULL_TYPE, 22031510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org SMI, 22041510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org SPEC_OBJECT, 22051510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org STRING, 22061510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org SYMBOL, 22071510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org HEAP_NUMBER, 22081510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org NUMBER_OF_TYPES 22091510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org }; 22101510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 22111510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org enum ResultMode { 22121510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org RESULT_AS_SMI, // For Smi(1) on truthy value, Smi(0) otherwise. 22131510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org RESULT_AS_ODDBALL, // For {true} on truthy value, {false} otherwise. 22141510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org RESULT_AS_INVERSE_ODDBALL // For {false} on truthy value, {true} otherwise. 22151510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org }; 22161510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 22171510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // At most 8 different types can be distinguished, because the Code object 22181510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // only has room for a single byte to hold a set of these types. :-P 22191510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org STATIC_ASSERT(NUMBER_OF_TYPES <= 8); 22201510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 22211510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org class Types : public EnumSet<Type, byte> { 22221510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 22231510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Types() : EnumSet<Type, byte>(0) {} 22241510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org explicit Types(byte bits) : EnumSet<Type, byte>(bits) {} 22251510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 22261510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org byte ToByte() const { return ToIntegral(); } 22271510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org bool UpdateStatus(Handle<Object> object); 22281510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org bool NeedsMap() const; 22291510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org bool CanBeUndetectable() const; 22301510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org bool IsGeneric() const { return ToIntegral() == Generic().ToIntegral(); } 22311510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 22321510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static Types Generic() { return Types((1 << NUMBER_OF_TYPES) - 1); } 22331510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org }; 22341510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 22351510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org ToBooleanStub(Isolate* isolate, ResultMode mode, Types types = Types()) 22361510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org : HydrogenCodeStub(isolate) { 22371510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org set_sub_minor_key(TypesBits::encode(types.ToByte()) | 22381510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org ResultModeBits::encode(mode)); 22391510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 22401510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 22411510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org ToBooleanStub(Isolate* isolate, ExtraICState state) 22421510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org : HydrogenCodeStub(isolate) { 22431510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org set_sub_minor_key(TypesBits::encode(static_cast<byte>(state)) | 22441510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org ResultModeBits::encode(RESULT_AS_SMI)); 22451510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 22461510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 22471510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org bool UpdateStatus(Handle<Object> object); 22481510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Types types() const { return Types(TypesBits::decode(sub_minor_key())); } 22491510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org ResultMode mode() const { return ResultModeBits::decode(sub_minor_key()); } 22501510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 22511510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual Code::Kind GetCodeKind() const { return Code::TO_BOOLEAN_IC; } 22521510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual void PrintState(OStream& os) const OVERRIDE; // NOLINT 22531510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 22541510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual bool SometimesSetsUpAFrame() { return false; } 22551510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 22561510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static Handle<Code> GetUninitialized(Isolate* isolate) { 22571510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return ToBooleanStub(isolate, UNINITIALIZED).GetCode(); 22581510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 22591510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 22601510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual ExtraICState GetExtraICState() const { return types().ToIntegral(); } 22611510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 22621510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual InlineCacheState GetICState() const { 22631510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org if (types().IsEmpty()) { 22641510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return ::v8::internal::UNINITIALIZED; 22651510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } else { 22661510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return MONOMORPHIC; 22671510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 22681510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 22691510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 22701510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org private: 22711510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org ToBooleanStub(Isolate* isolate, InitializationState init_state) 22721510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org : HydrogenCodeStub(isolate, init_state) { 22731510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org set_sub_minor_key(ResultModeBits::encode(RESULT_AS_SMI)); 22741510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 22751510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 22761510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org class TypesBits : public BitField<byte, 0, NUMBER_OF_TYPES> {}; 22771510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org class ResultModeBits : public BitField<ResultMode, NUMBER_OF_TYPES, 2> {}; 22781510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 22791510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_CALL_INTERFACE_DESCRIPTOR(ToBoolean); 22801510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_HYDROGEN_CODE_STUB(ToBoolean, HydrogenCodeStub); 22811510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 22821510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 22831510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 22841510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgOStream& operator<<(OStream& os, const ToBooleanStub::Types& t); 22851510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 22861510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 22871510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass ElementsTransitionAndStoreStub : public HydrogenCodeStub { 22881510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 22891510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org ElementsTransitionAndStoreStub(Isolate* isolate, ElementsKind from_kind, 22901510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org ElementsKind to_kind, bool is_jsarray, 22911510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org KeyedAccessStoreMode store_mode) 22921510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org : HydrogenCodeStub(isolate) { 22931510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org set_sub_minor_key(FromBits::encode(from_kind) | ToBits::encode(to_kind) | 22941510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org IsJSArrayBits::encode(is_jsarray) | 22951510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org StoreModeBits::encode(store_mode)); 22961510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 22971510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 22981510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org ElementsKind from_kind() const { return FromBits::decode(sub_minor_key()); } 22991510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org ElementsKind to_kind() const { return ToBits::decode(sub_minor_key()); } 23001510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org bool is_jsarray() const { return IsJSArrayBits::decode(sub_minor_key()); } 23011510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org KeyedAccessStoreMode store_mode() const { 23021510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return StoreModeBits::decode(sub_minor_key()); 23031510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 23041510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 23051510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // Parameters accessed via CodeStubGraphBuilder::GetParameter() 23061510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org enum ParameterIndices { 23071510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org kValueIndex, 23081510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org kMapIndex, 23091510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org kKeyIndex, 23101510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org kObjectIndex, 23111510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org kParameterCount 23121510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org }; 23131510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 23141510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static const Register ValueRegister() { 23151510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return ElementTransitionAndStoreDescriptor::ValueRegister(); 23161510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 23171510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static const Register MapRegister() { 23181510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return ElementTransitionAndStoreDescriptor::MapRegister(); 23191510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 23201510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static const Register KeyRegister() { 23211510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return ElementTransitionAndStoreDescriptor::NameRegister(); 23221510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 23231510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static const Register ObjectRegister() { 23241510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return ElementTransitionAndStoreDescriptor::ReceiverRegister(); 23251510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 23261510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 23271510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org private: 23281510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org class FromBits : public BitField<ElementsKind, 0, 8> {}; 23291510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org class ToBits : public BitField<ElementsKind, 8, 8> {}; 23301510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org class IsJSArrayBits : public BitField<bool, 16, 1> {}; 23311510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org class StoreModeBits : public BitField<KeyedAccessStoreMode, 17, 4> {}; 23321510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 23331510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_CALL_INTERFACE_DESCRIPTOR(ElementTransitionAndStore); 23341510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_HYDROGEN_CODE_STUB(ElementsTransitionAndStore, HydrogenCodeStub); 23351510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 23361510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 23371510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 23381510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass StoreArrayLiteralElementStub : public PlatformCodeStub { 23391510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 23401510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org explicit StoreArrayLiteralElementStub(Isolate* isolate) 23411510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org : PlatformCodeStub(isolate) { } 23421510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 23431510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_CALL_INTERFACE_DESCRIPTOR(StoreArrayLiteralElement); 23441510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_PLATFORM_CODE_STUB(StoreArrayLiteralElement, PlatformCodeStub); 23451510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 23461510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 23471510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 23481510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass StubFailureTrampolineStub : public PlatformCodeStub { 23491510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 23501510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org StubFailureTrampolineStub(Isolate* isolate, StubFunctionMode function_mode) 23511510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org : PlatformCodeStub(isolate) { 23521510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org minor_key_ = FunctionModeField::encode(function_mode); 23531510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 23541510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 23551510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static void GenerateAheadOfTime(Isolate* isolate); 23561510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 23571510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org private: 23581510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org StubFunctionMode function_mode() const { 23591510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return FunctionModeField::decode(minor_key_); 23601510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 23611510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 23621510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org class FunctionModeField : public BitField<StubFunctionMode, 0, 1> {}; 23631510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 23641510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_NULL_CALL_INTERFACE_DESCRIPTOR(); 23651510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_PLATFORM_CODE_STUB(StubFailureTrampoline, PlatformCodeStub); 23661510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 23671510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 23681510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 23691510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass ProfileEntryHookStub : public PlatformCodeStub { 23701510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 23711510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org explicit ProfileEntryHookStub(Isolate* isolate) : PlatformCodeStub(isolate) {} 23721510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 23731510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // The profile entry hook function is not allowed to cause a GC. 23741510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual bool SometimesSetsUpAFrame() { return false; } 23751510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 23761510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // Generates a call to the entry hook if it's enabled. 23771510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static void MaybeCallEntryHook(MacroAssembler* masm); 23781510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 23791510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org private: 23801510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static void EntryHookTrampoline(intptr_t function, 23811510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org intptr_t stack_pointer, 23821510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Isolate* isolate); 23831510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 23841510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // ProfileEntryHookStub is called at the start of a function, so it has the 23851510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // same register set. 23861510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_CALL_INTERFACE_DESCRIPTOR(CallFunction) 23871510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_PLATFORM_CODE_STUB(ProfileEntryHook, PlatformCodeStub); 23881510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 23891510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 23901510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 23911510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass StoreBufferOverflowStub : public PlatformCodeStub { 23921510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 23931510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org StoreBufferOverflowStub(Isolate* isolate, SaveFPRegsMode save_fp) 23941510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org : PlatformCodeStub(isolate) { 23951510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org minor_key_ = SaveDoublesBits::encode(save_fp == kSaveFPRegs); 23961510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 23971510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 23981510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org static void GenerateFixedRegStubsAheadOfTime(Isolate* isolate); 23991510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual bool SometimesSetsUpAFrame() { return false; } 24001510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 24011510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org private: 24021510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org bool save_doubles() const { return SaveDoublesBits::decode(minor_key_); } 24031510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 24041510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org class SaveDoublesBits : public BitField<bool, 0, 1> {}; 24051510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 24061510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_NULL_CALL_INTERFACE_DESCRIPTOR(); 24071510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_PLATFORM_CODE_STUB(StoreBufferOverflow, PlatformCodeStub); 24081510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 24091510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 24101510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 24111510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass SubStringStub : public PlatformCodeStub { 24121510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 24131510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org explicit SubStringStub(Isolate* isolate) : PlatformCodeStub(isolate) {} 24141510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 24151510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_CALL_INTERFACE_DESCRIPTOR(ContextOnly); 24161510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_PLATFORM_CODE_STUB(SubString, PlatformCodeStub); 24171510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 24181510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 24191510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 24201510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgclass StringCompareStub : public PlatformCodeStub { 24211510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org public: 24221510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org explicit StringCompareStub(Isolate* isolate) : PlatformCodeStub(isolate) {} 24231510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 24241510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_CALL_INTERFACE_DESCRIPTOR(ContextOnly); 24251510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org DEFINE_PLATFORM_CODE_STUB(StringCompare, PlatformCodeStub); 24261510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}; 24271510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 24281510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 24291510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#undef DEFINE_CALL_INTERFACE_DESCRIPTOR 24301510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#undef DEFINE_PLATFORM_CODE_STUB 24311510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#undef DEFINE_HANDLER_CODE_STUB 24321510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#undef DEFINE_HYDROGEN_CODE_STUB 24331510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#undef DEFINE_CODE_STUB 24341510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#undef DEFINE_CODE_STUB_BASE 24351510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org} } // namespace v8::internal 24361510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 24371510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#endif // V8_CODE_STUBS_H_ 24381510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org