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