1f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com// Copyright 2012 the V8 project authors. All rights reserved.
23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// Use of this source code is governed by a BSD-style license that can be
33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// found in the LICENSE file.
4a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
5a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org#ifndef V8_X64_LITHIUM_X64_H_
6a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org#define V8_X64_LITHIUM_X64_H_
7a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
8196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/hydrogen.h"
9196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/lithium.h"
104b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org#include "src/lithium-allocator.h"
11196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/safepoint-table.h"
12196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/utils.h"
13a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
14a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgnamespace v8 {
15a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgnamespace internal {
16a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
17a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// Forward declarations.
18a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgclass LCodeGen;
19c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
20dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org#define LITHIUM_CONCRETE_INSTRUCTION_LIST(V) \
21dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(AccessArgumentsAt)                       \
22dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(AddI)                                    \
23dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(Allocate)                                \
24dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(AllocateBlockContext)                    \
25dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(ApplyArguments)                          \
26dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(ArgumentsElements)                       \
27dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(ArgumentsLength)                         \
28dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(ArithmeticD)                             \
29dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(ArithmeticT)                             \
30dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(BitI)                                    \
31dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(BoundsCheck)                             \
32dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(Branch)                                  \
33dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(CallJSFunction)                          \
34dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(CallWithDescriptor)                      \
35dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(CallFunction)                            \
36dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(CallNew)                                 \
37dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(CallNewArray)                            \
38dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(CallRuntime)                             \
39dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(CallStub)                                \
40dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(CheckInstanceType)                       \
41dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(CheckMaps)                               \
42dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(CheckMapValue)                           \
43dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(CheckNonSmi)                             \
44dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(CheckSmi)                                \
45dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(CheckValue)                              \
46dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(ClampDToUint8)                           \
47dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(ClampIToUint8)                           \
48dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(ClampTToUint8)                           \
49dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(ClassOfTestAndBranch)                    \
50dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(CompareMinusZeroAndBranch)               \
51dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(CompareNumericAndBranch)                 \
52dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(CmpObjectEqAndBranch)                    \
53dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(CmpHoleAndBranch)                        \
54dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(CmpMapAndBranch)                         \
55dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(CmpT)                                    \
56dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(ConstantD)                               \
57dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(ConstantE)                               \
58dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(ConstantI)                               \
59dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(ConstantS)                               \
60dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(ConstantT)                               \
61dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(ConstructDouble)                         \
62dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(Context)                                 \
63dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(DateField)                               \
64dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(DebugBreak)                              \
65dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(DeclareGlobals)                          \
66dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(Deoptimize)                              \
67dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(DivByConstI)                             \
68dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(DivByPowerOf2I)                          \
69dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(DivI)                                    \
70dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(DoubleBits)                              \
71dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(DoubleToI)                               \
72dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(DoubleToSmi)                             \
73dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(Drop)                                    \
74dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(DummyUse)                                \
75dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(Dummy)                                   \
76dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(FlooringDivByConstI)                     \
77dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(FlooringDivByPowerOf2I)                  \
78dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(FlooringDivI)                            \
79dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(ForInCacheArray)                         \
80dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(ForInPrepareMap)                         \
81dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(FunctionLiteral)                         \
82dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(GetCachedArrayIndex)                     \
83dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(Goto)                                    \
84dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(HasCachedArrayIndexAndBranch)            \
85dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(HasInstanceTypeAndBranch)                \
86dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(InnerAllocatedObject)                    \
87dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(InstanceOf)                              \
88dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(InstanceOfKnownGlobal)                   \
89dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(InstructionGap)                          \
90dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(Integer32ToDouble)                       \
91dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(InvokeFunction)                          \
92dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(IsConstructCallAndBranch)                \
93dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(IsObjectAndBranch)                       \
94dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(IsStringAndBranch)                       \
95dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(IsSmiAndBranch)                          \
96dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(IsUndetectableAndBranch)                 \
97dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(Label)                                   \
98dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(LazyBailout)                             \
99dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(LoadContextSlot)                         \
100dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(LoadRoot)                                \
101dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(LoadFieldByIndex)                        \
102dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(LoadFunctionPrototype)                   \
103dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(LoadGlobalCell)                          \
104dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(LoadGlobalGeneric)                       \
105dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(LoadKeyed)                               \
106dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(LoadKeyedGeneric)                        \
107dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(LoadNamedField)                          \
108dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(LoadNamedGeneric)                        \
109dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(MapEnumLength)                           \
110dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(MathAbs)                                 \
111dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(MathClz32)                               \
112dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(MathExp)                                 \
113dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(MathFloor)                               \
114dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(MathFround)                              \
115dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(MathLog)                                 \
116dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(MathMinMax)                              \
117dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(MathPowHalf)                             \
118dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(MathRound)                               \
119dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(MathSqrt)                                \
120dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(ModByConstI)                             \
121dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(ModByPowerOf2I)                          \
122dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(ModI)                                    \
123dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(MulI)                                    \
124dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(NumberTagD)                              \
125dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(NumberTagI)                              \
126dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(NumberTagU)                              \
127dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(NumberUntagD)                            \
128dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(OsrEntry)                                \
129dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(Parameter)                               \
130dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(Power)                                   \
131dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(PushArgument)                            \
132dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(RegExpLiteral)                           \
133dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(Return)                                  \
134dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(SeqStringGetChar)                        \
135dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(SeqStringSetChar)                        \
136dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(ShiftI)                                  \
137dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(SmiTag)                                  \
138dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(SmiUntag)                                \
139dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(StackCheck)                              \
140dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(StoreCodeEntry)                          \
141dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(StoreContextSlot)                        \
142dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(StoreFrameContext)                       \
143dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(StoreGlobalCell)                         \
144dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(StoreKeyed)                              \
145dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(StoreKeyedGeneric)                       \
146dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(StoreNamedField)                         \
147dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(StoreNamedGeneric)                       \
148dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(StringAdd)                               \
149dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(StringCharCodeAt)                        \
150dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(StringCharFromCode)                      \
151dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(StringCompareAndBranch)                  \
152dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(SubI)                                    \
153dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(TaggedToI)                               \
154e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org  V(TailCallThroughMegamorphicCache)         \
155dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(ThisFunction)                            \
156dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(ToFastProperties)                        \
157dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(TransitionElementsKind)                  \
158dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(TrapAllocationMemento)                   \
159dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(Typeof)                                  \
160dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(TypeofIsAndBranch)                       \
161dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(Uint32ToDouble)                          \
162dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(UnknownOSRValue)                         \
163c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org  V(WrapReceiver)
164c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
165c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
16632cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org#define DECLARE_CONCRETE_INSTRUCTION(type, mnemonic)                        \
167ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual Opcode opcode() const FINAL OVERRIDE {                      \
16832cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org    return LInstruction::k##type;                                           \
16932cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org  }                                                                         \
170ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void CompileToNative(LCodeGen* generator) FINAL OVERRIDE;   \
171ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual const char* Mnemonic() const FINAL OVERRIDE {               \
17232cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org    return mnemonic;                                                        \
17332cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org  }                                                                         \
17432cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org  static L##type* cast(LInstruction* instr) {                               \
175e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->Is##type());                                              \
17632cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org    return reinterpret_cast<L##type*>(instr);                               \
177c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  }
178c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
179c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
180c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org#define DECLARE_HYDROGEN_ACCESSOR(type)     \
181c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  H##type* hydrogen() const {               \
182c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org    return H##type::cast(hydrogen_value()); \
183c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  }
184c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
185a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
18632cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.orgclass LInstruction : public ZoneObject {
187a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org public:
188c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  LInstruction()
189594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org      : environment_(NULL),
190594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org        hydrogen_value_(NULL),
191594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org        bit_field_(IsCallBits::encode(false)) {
192594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  }
19383aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org
19432cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org  virtual ~LInstruction() {}
195c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
196c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  virtual void CompileToNative(LCodeGen* generator) = 0;
197c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  virtual const char* Mnemonic() const = 0;
198c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  virtual void PrintTo(StringStream* stream);
19988d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.org  virtual void PrintDataTo(StringStream* stream);
20088d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.org  virtual void PrintOutputOperandTo(StringStream* stream);
201c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
2028e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org  enum Opcode {
2038e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    // Declare a unique enum value for each instruction.
2048e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org#define DECLARE_OPCODE(type) k##type,
2058e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    LITHIUM_CONCRETE_INSTRUCTION_LIST(DECLARE_OPCODE)
2068e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    kNumberOfInstructions
2078e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org#undef DECLARE_OPCODE
2088e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org  };
2098e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
2108e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org  virtual Opcode opcode() const = 0;
2118e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
2128e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org  // Declare non-virtual type testers for all leaf IR classes.
2138e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org#define DECLARE_PREDICATE(type) \
2148e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org  bool Is##type() const { return opcode() == k##type; }
2158e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org  LITHIUM_CONCRETE_INSTRUCTION_LIST(DECLARE_PREDICATE)
2168e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org#undef DECLARE_PREDICATE
2178e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
2188e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org  // Declare virtual predicates for instructions that don't have
2198e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org  // an opcode.
2208e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org  virtual bool IsGap() const { return false; }
2210511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com
222c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  virtual bool IsControl() const { return false; }
223c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
2247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  // Try deleting this instruction if possible.
2257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  virtual bool TryDelete() { return false; }
2267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
22783aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  void set_environment(LEnvironment* env) { environment_ = env; }
22883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  LEnvironment* environment() const { return environment_; }
22983aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  bool HasEnvironment() const { return environment_ != NULL; }
230c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
231c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  void set_pointer_map(LPointerMap* p) { pointer_map_.set(p); }
232c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  LPointerMap* pointer_map() const { return pointer_map_.get(); }
233c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  bool HasPointerMap() const { return pointer_map_.is_set(); }
234c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
235c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  void set_hydrogen_value(HValue* value) { hydrogen_value_ = value; }
236c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  HValue* hydrogen_value() const { return hydrogen_value_; }
237c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
238594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  void MarkAsCall() { bit_field_ = IsCallBits::update(bit_field_, true); }
239594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  bool IsCall() const { return IsCallBits::decode(bit_field_); }
2401044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org
241a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  // Interface to the register allocator and iterators.
242594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  bool ClobbersTemps() const { return IsCall(); }
243594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  bool ClobbersRegisters() const { return IsCall(); }
244a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  virtual bool ClobbersDoubleRegisters(Isolate* isolate) const {
245a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org    return IsCall();
246a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  }
247a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org
2481044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org  virtual void SetDeferredLazyDeoptimizationEnvironment(LEnvironment* env) { }
24983aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org
25083aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  // Interface to the register allocator and iterators.
251594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  bool IsMarkedAsCall() const { return IsCall(); }
25283aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org
25383aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  virtual bool HasResult() const = 0;
254d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  virtual LOperand* result() const = 0;
25583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org
25683aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  LOperand* FirstInput() { return InputAt(0); }
25783aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  LOperand* Output() { return HasResult() ? result() : NULL; }
25883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org
25932d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  virtual bool HasInterestingComment(LCodeGen* gen) const { return true; }
26032d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org
261895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  virtual bool MustSignExtendResult(LPlatformChunk* chunk) const {
262895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org    return false;
263895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  }
264895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org
26583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org#ifdef DEBUG
26683aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  void VerifyCall();
26783aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org#endif
26883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org
2697d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  virtual int InputCount() = 0;
2707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  virtual LOperand* InputAt(int i) = 0;
2717d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
272c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org private:
27346839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  // Iterator support.
27446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  friend class InputIterator;
27546839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org
27656c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  friend class TempIterator;
27756c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  virtual int TempCount() = 0;
27856c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  virtual LOperand* TempAt(int i) = 0;
27956c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
280594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  class IsCallBits: public BitField<bool, 0, 1> {};
281594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
28283aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  LEnvironment* environment_;
283c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  SetOncePointer<LPointerMap> pointer_map_;
284c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  HValue* hydrogen_value_;
285594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  int bit_field_;
286c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org};
287c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
288c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
2890a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org// R = number of result operands (0 or 1).
29026ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.orgtemplate<int R>
29126ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.orgclass LTemplateResultInstruction : public LInstruction {
292c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
293c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  // Allow 0 or 1 output operands.
294c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  STATIC_ASSERT(R == 0 || R == 1);
295ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual bool HasResult() const FINAL OVERRIDE {
29632cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org    return R != 0 && result() != NULL;
29732cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org  }
2980511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  void set_result(LOperand* operand) { results_[0] = operand; }
299d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  LOperand* result() const { return results_[0]; }
300c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
301895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  virtual bool MustSignExtendResult(
302ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org      LPlatformChunk* chunk) const FINAL OVERRIDE;
303895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org
3040511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com protected:
3056d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org  EmbeddedContainer<LOperand*, R> results_;
30626ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org};
30726ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org
30826ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org
30926ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org// R = number of result operands (0 or 1).
31026ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org// I = number of input operands.
31126ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org// T = number of temporary operands.
31226ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.orgtemplate<int R, int I, int T>
31326ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.orgclass LTemplateInstruction : public LTemplateResultInstruction<R> {
31426ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org protected:
3156d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org  EmbeddedContainer<LOperand*, I> inputs_;
3166d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org  EmbeddedContainer<LOperand*, T> temps_;
31746839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org
31846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org private:
31956c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  // Iterator support.
320ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual int InputCount() FINAL OVERRIDE { return I; }
321ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual LOperand* InputAt(int i) FINAL OVERRIDE { return inputs_[i]; }
32256c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
323ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual int TempCount() FINAL OVERRIDE { return T; }
324ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual LOperand* TempAt(int i) FINAL OVERRIDE { return temps_[i]; }
325c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org};
326c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
327c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
32832cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.orgclass LGap : public LTemplateInstruction<0, 0, 0> {
329c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
330c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  explicit LGap(HBasicBlock* block)
331c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org      : block_(block) {
332c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org    parallel_moves_[BEFORE] = NULL;
333c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org    parallel_moves_[START] = NULL;
334c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org    parallel_moves_[END] = NULL;
335c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org    parallel_moves_[AFTER] = NULL;
336c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  }
337c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
3388e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org  // Can't use the DECLARE-macro here because of sub-classes.
339ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual bool IsGap() const FINAL OVERRIDE { return true; }
340ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) OVERRIDE;
3418e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org  static LGap* cast(LInstruction* instr) {
342e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->IsGap());
3438e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org    return reinterpret_cast<LGap*>(instr);
3448e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org  }
345c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
346c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  bool IsRedundant() const;
347c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
348c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  HBasicBlock* block() const { return block_; }
349c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
350c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  enum InnerPosition {
351c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org    BEFORE,
352c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org    START,
353c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org    END,
354c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org    AFTER,
355c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org    FIRST_INNER_POSITION = BEFORE,
356c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org    LAST_INNER_POSITION = AFTER
357c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  };
358c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
3597028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  LParallelMove* GetOrCreateParallelMove(InnerPosition pos,
3607028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org                                         Zone* zone)  {
3617028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org    if (parallel_moves_[pos] == NULL) {
3627028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org      parallel_moves_[pos] = new(zone) LParallelMove(zone);
3637028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org    }
364c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org    return parallel_moves_[pos];
365c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  }
366c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
367c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  LParallelMove* GetParallelMove(InnerPosition pos)  {
368c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org    return parallel_moves_[pos];
369c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  }
370c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
371c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org private:
372c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  LParallelMove* parallel_moves_[LAST_INNER_POSITION + 1];
373c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  HBasicBlock* block_;
374c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org};
375c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
376c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
377ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LInstructionGap FINAL : public LGap {
3788e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org public:
3798e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org  explicit LInstructionGap(HBasicBlock* block) : LGap(block) { }
3808e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
381ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual bool HasInterestingComment(LCodeGen* gen) const OVERRIDE {
38232d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org    return !IsRedundant();
38332d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  }
38432d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org
3858e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org  DECLARE_CONCRETE_INSTRUCTION(InstructionGap, "gap")
3868e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org};
3878e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
3888e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org
389ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LGoto FINAL : public LTemplateInstruction<0, 0, 0> {
390c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
391d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org  explicit LGoto(HBasicBlock* block) : block_(block) { }
392c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
393ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual bool HasInterestingComment(LCodeGen* gen) const OVERRIDE;
394c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_CONCRETE_INSTRUCTION(Goto, "goto")
395ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) OVERRIDE;
396ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual bool IsControl() const OVERRIDE { return true; }
397c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
398d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org  int block_id() const { return block_->block_id(); }
399c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
400c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org private:
401d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org  HBasicBlock* block_;
402c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org};
403c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
404c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
405ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LLazyBailout FINAL : public LTemplateInstruction<0, 0, 0> {
406c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
407c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  LLazyBailout() : gap_instructions_size_(0) { }
408c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
409c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_CONCRETE_INSTRUCTION(LazyBailout, "lazy-bailout")
410c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
411c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  void set_gap_instructions_size(int gap_instructions_size) {
412c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org    gap_instructions_size_ = gap_instructions_size;
413c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  }
414c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  int gap_instructions_size() { return gap_instructions_size_; }
415c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
416c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org private:
417c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  int gap_instructions_size_;
418c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org};
419c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
420c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
421ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LDummy FINAL : public LTemplateInstruction<1, 0, 0> {
422935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org public:
4235e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  LDummy() {}
424935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(Dummy, "dummy")
425935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org};
426935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org
427935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org
428ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LDummyUse FINAL : public LTemplateInstruction<1, 1, 0> {
42946a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org public:
43046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  explicit LDummyUse(LOperand* value) {
43146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org    inputs_[0] = value;
43246a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  }
43346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  DECLARE_CONCRETE_INSTRUCTION(DummyUse, "dummy-use")
43446a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org};
43546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org
43646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org
437ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LDeoptimize FINAL : public LTemplateInstruction<0, 0, 0> {
438c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
439ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual bool IsControl() const OVERRIDE { return true; }
440c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_CONCRETE_INSTRUCTION(Deoptimize, "deoptimize")
441c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org  DECLARE_HYDROGEN_ACCESSOR(Deoptimize)
442c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org};
443c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
444c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
445ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LLabel FINAL : public LGap {
446c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
447c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  explicit LLabel(HBasicBlock* block)
448c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org      : LGap(block), replacement_(NULL) { }
449c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
450ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual bool HasInterestingComment(LCodeGen* gen) const OVERRIDE {
45132cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org    return false;
45232cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org  }
453c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_CONCRETE_INSTRUCTION(Label, "label")
454c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
455ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) OVERRIDE;
456c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
457c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  int block_id() const { return block()->block_id(); }
458c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  bool is_loop_header() const { return block()->IsLoopHeader(); }
45932d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  bool is_osr_entry() const { return block()->is_osr_entry(); }
460c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  Label* label() { return &label_; }
461c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  LLabel* replacement() const { return replacement_; }
462c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  void set_replacement(LLabel* label) { replacement_ = label; }
463c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  bool HasReplacement() const { return replacement_ != NULL; }
464c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
465c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org private:
466c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  Label label_;
467c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  LLabel* replacement_;
468c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org};
469c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
470c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
471ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LParameter FINAL : public LTemplateInstruction<1, 0, 0> {
472c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
473ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual bool HasInterestingComment(LCodeGen* gen) const OVERRIDE {
47432cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org    return false;
47532cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org  }
476c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_CONCRETE_INSTRUCTION(Parameter, "parameter")
477c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org};
478c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
479c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
480ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LCallStub FINAL : public LTemplateInstruction<1, 1, 0> {
481c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
482935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  explicit LCallStub(LOperand* context) {
483935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org    inputs_[0] = context;
484935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  }
485935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org
486935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LOperand* context() { return inputs_[0]; }
487935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org
488c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_CONCRETE_INSTRUCTION(CallStub, "call-stub")
489c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_HYDROGEN_ACCESSOR(CallStub)
490c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org};
491c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
492c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
493e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.orgclass LTailCallThroughMegamorphicCache FINAL
494e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org    : public LTemplateInstruction<0, 3, 0> {
495e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org public:
496e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org  explicit LTailCallThroughMegamorphicCache(LOperand* context,
497e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org                                            LOperand* receiver,
498e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org                                            LOperand* name) {
499e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org    inputs_[0] = context;
500e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org    inputs_[1] = receiver;
501e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org    inputs_[2] = name;
502e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org  }
503e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org
504e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org  LOperand* context() { return inputs_[0]; }
505e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org  LOperand* receiver() { return inputs_[1]; }
506e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org  LOperand* name() { return inputs_[2]; }
507e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org
508e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(TailCallThroughMegamorphicCache,
509e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org                               "tail-call-through-megamorphic-cache")
510e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(TailCallThroughMegamorphicCache)
511e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org};
512e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org
513e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org
514ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LUnknownOSRValue FINAL : public LTemplateInstruction<1, 0, 0> {
515c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
516ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual bool HasInterestingComment(LCodeGen* gen) const OVERRIDE {
51732cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org    return false;
51832cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org  }
519c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_CONCRETE_INSTRUCTION(UnknownOSRValue, "unknown-osr-value")
520c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org};
521c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
522c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
5230a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.orgtemplate<int I, int T>
52432cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.orgclass LControlInstruction : public LTemplateInstruction<0, I, T> {
525c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
5261510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  LControlInstruction() : false_label_(NULL), true_label_(NULL) { }
5271510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
528ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual bool IsControl() const FINAL OVERRIDE { return true; }
529c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
5304f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org  int SuccessorCount() { return hydrogen()->SuccessorCount(); }
5314f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org  HBasicBlock* SuccessorAt(int i) { return hydrogen()->SuccessorAt(i); }
5321510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
5331510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  int TrueDestination(LChunk* chunk) {
5341510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    return chunk->LookupDestination(true_block_id());
5351510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  }
5361510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  int FalseDestination(LChunk* chunk) {
5371510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    return chunk->LookupDestination(false_block_id());
5381510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  }
5391510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
5401510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  Label* TrueLabel(LChunk* chunk) {
5411510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    if (true_label_ == NULL) {
5421510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      true_label_ = chunk->GetAssemblyLabel(TrueDestination(chunk));
5431510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    }
5441510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    return true_label_;
5451510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  }
5461510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  Label* FalseLabel(LChunk* chunk) {
5471510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    if (false_label_ == NULL) {
5481510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      false_label_ = chunk->GetAssemblyLabel(FalseDestination(chunk));
5491510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    }
5501510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    return false_label_;
5511510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  }
5521510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
5531510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org protected:
5541510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  int true_block_id() { return SuccessorAt(0)->block_id(); }
5551510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  int false_block_id() { return SuccessorAt(1)->block_id(); }
556c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
5570511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com private:
5584f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org  HControlInstruction* hydrogen() {
5594f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org    return HControlInstruction::cast(this->hydrogen_value());
5604f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org  }
5611510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
5621510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  Label* false_label_;
5631510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  Label* true_label_;
564c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org};
565c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
566c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
567ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LWrapReceiver FINAL : public LTemplateInstruction<1, 2, 0> {
568154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org public:
569154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org  LWrapReceiver(LOperand* receiver, LOperand* function) {
570154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org    inputs_[0] = receiver;
571154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org    inputs_[1] = function;
572154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org  }
573154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org
574154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org  LOperand* receiver() { return inputs_[0]; }
575154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org  LOperand* function() { return inputs_[1]; }
57656c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
57756c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  DECLARE_CONCRETE_INSTRUCTION(WrapReceiver, "wrap-receiver")
57857a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(WrapReceiver)
579154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org};
580154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org
581154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org
582ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LApplyArguments FINAL : public LTemplateInstruction<1, 4, 0> {
583c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
584c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  LApplyArguments(LOperand* function,
585c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org                  LOperand* receiver,
586c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org                  LOperand* length,
587c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org                  LOperand* elements) {
5880511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com    inputs_[0] = function;
5890511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com    inputs_[1] = receiver;
5900511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com    inputs_[2] = length;
5910511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com    inputs_[3] = elements;
592c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  }
593c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
5940511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  LOperand* function() { return inputs_[0]; }
5950511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  LOperand* receiver() { return inputs_[1]; }
5960511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  LOperand* length() { return inputs_[2]; }
5970511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  LOperand* elements() { return inputs_[3]; }
59856c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
59956c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  DECLARE_CONCRETE_INSTRUCTION(ApplyArguments, "apply-arguments")
600c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org};
601c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
602c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
603ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LAccessArgumentsAt FINAL : public LTemplateInstruction<1, 3, 0> {
604c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
605c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  LAccessArgumentsAt(LOperand* arguments, LOperand* length, LOperand* index) {
6060511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com    inputs_[0] = arguments;
6070511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com    inputs_[1] = length;
6080511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com    inputs_[2] = index;
609c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  }
610c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
6110511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  LOperand* arguments() { return inputs_[0]; }
6120511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  LOperand* length() { return inputs_[1]; }
6130511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  LOperand* index() { return inputs_[2]; }
614c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
61556c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  DECLARE_CONCRETE_INSTRUCTION(AccessArgumentsAt, "access-arguments-at")
61656c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
617ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) OVERRIDE;
618c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org};
619c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
620c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
621ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LArgumentsLength FINAL : public LTemplateInstruction<1, 1, 0> {
622c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
6230511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  explicit LArgumentsLength(LOperand* elements) {
6240511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com    inputs_[0] = elements;
6250511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  }
626c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
62756c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* elements() { return inputs_[0]; }
62856c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
629c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_CONCRETE_INSTRUCTION(ArgumentsLength, "arguments-length")
630c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org};
631c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
632c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
633ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LArgumentsElements FINAL : public LTemplateInstruction<1, 0, 0> {
634c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
635c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_CONCRETE_INSTRUCTION(ArgumentsElements, "arguments-elements")
63628faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org  DECLARE_HYDROGEN_ACCESSOR(ArgumentsElements)
637c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org};
638c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
639c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
640ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LModByPowerOf2I FINAL : public LTemplateInstruction<1, 1, 0> {
641ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org public:
642ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  LModByPowerOf2I(LOperand* dividend, int32_t divisor) {
643ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org    inputs_[0] = dividend;
644ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org    divisor_ = divisor;
645ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  }
646ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
647ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  LOperand* dividend() { return inputs_[0]; }
648ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  int32_t divisor() const { return divisor_; }
649ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
650ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(ModByPowerOf2I, "mod-by-power-of-2-i")
651ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(Mod)
652ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
653ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org private:
654ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  int32_t divisor_;
655ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org};
656ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
657ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
658ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LModByConstI FINAL : public LTemplateInstruction<1, 1, 2> {
659bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org public:
660bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  LModByConstI(LOperand* dividend,
661bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org               int32_t divisor,
662bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org               LOperand* temp1,
663bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org               LOperand* temp2) {
664bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    inputs_[0] = dividend;
665bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    divisor_ = divisor;
666bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    temps_[0] = temp1;
667bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    temps_[1] = temp2;
668bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  }
669bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org
670bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  LOperand* dividend() { return inputs_[0]; }
671bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  int32_t divisor() const { return divisor_; }
672bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  LOperand* temp1() { return temps_[0]; }
673bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  LOperand* temp2() { return temps_[1]; }
674bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org
675bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(ModByConstI, "mod-by-const-i")
676bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(Mod)
677bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org
678bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org private:
679bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  int32_t divisor_;
680bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org};
681bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org
682bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org
683ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LModI FINAL : public LTemplateInstruction<1, 2, 1> {
684c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
6850511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  LModI(LOperand* left, LOperand* right, LOperand* temp) {
6860511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com    inputs_[0] = left;
6870511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com    inputs_[1] = right;
6880511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com    temps_[0] = temp;
6890511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  }
690c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
69156c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* left() { return inputs_[0]; }
69256c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* right() { return inputs_[1]; }
69356c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* temp() { return temps_[0]; }
69456c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
695c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_CONCRETE_INSTRUCTION(ModI, "mod-i")
696c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_HYDROGEN_ACCESSOR(Mod)
697c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org};
698c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
699c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
700ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LDivByPowerOf2I FINAL : public LTemplateInstruction<1, 1, 0> {
701ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org public:
702ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  LDivByPowerOf2I(LOperand* dividend, int32_t divisor) {
703ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org    inputs_[0] = dividend;
704ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org    divisor_ = divisor;
705ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  }
706ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
707ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  LOperand* dividend() { return inputs_[0]; }
708ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  int32_t divisor() const { return divisor_; }
709ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
710ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(DivByPowerOf2I, "div-by-power-of-2-i")
711ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(Div)
712ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
713ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org private:
714ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  int32_t divisor_;
715ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org};
716ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
717ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
718ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LDivByConstI FINAL : public LTemplateInstruction<1, 1, 2> {
719bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org public:
720bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  LDivByConstI(LOperand* dividend,
721bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org               int32_t divisor,
722bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org               LOperand* temp1,
723bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org               LOperand* temp2) {
724bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    inputs_[0] = dividend;
725bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    divisor_ = divisor;
726bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    temps_[0] = temp1;
727bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    temps_[1] = temp2;
728bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  }
729bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org
730bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  LOperand* dividend() { return inputs_[0]; }
731bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  int32_t divisor() const { return divisor_; }
732bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  LOperand* temp1() { return temps_[0]; }
733bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  LOperand* temp2() { return temps_[1]; }
734bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org
735bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(DivByConstI, "div-by-const-i")
736bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(Div)
737bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org
738bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org private:
739bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  int32_t divisor_;
740bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org};
741bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org
742bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org
743ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LDivI FINAL : public LTemplateInstruction<1, 2, 1> {
744c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
745ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org  LDivI(LOperand* dividend, LOperand* divisor, LOperand* temp) {
746ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org    inputs_[0] = dividend;
747ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org    inputs_[1] = divisor;
7480511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com    temps_[0] = temp;
7490511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  }
750c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
751ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org  LOperand* dividend() { return inputs_[0]; }
752ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org  LOperand* divisor() { return inputs_[1]; }
75356c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* temp() { return temps_[0]; }
75456c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
755c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_CONCRETE_INSTRUCTION(DivI, "div-i")
756ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(BinaryOperation)
757c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org};
758c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
759c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
760ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LFlooringDivByPowerOf2I FINAL : public LTemplateInstruction<1, 1, 0> {
761d2899aa30a5af82205029034f7a491d49c48fc68yangguo@chromium.org public:
762ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  LFlooringDivByPowerOf2I(LOperand* dividend, int32_t divisor) {
763ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org    inputs_[0] = dividend;
764ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org    divisor_ = divisor;
765ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  }
766ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
767ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  LOperand* dividend() { return inputs_[0]; }
768ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  int32_t divisor() const { return divisor_; }
769ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
770ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(FlooringDivByPowerOf2I,
771ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org                               "flooring-div-by-power-of-2-i")
772ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(MathFloorOfDiv)
773ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
774ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org private:
775ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  int32_t divisor_;
776ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org};
777ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
778ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
779ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LFlooringDivByConstI FINAL : public LTemplateInstruction<1, 1, 3> {
780ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org public:
781bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  LFlooringDivByConstI(LOperand* dividend,
782bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org                       int32_t divisor,
783bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org                       LOperand* temp1,
7847010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org                       LOperand* temp2,
7857010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org                       LOperand* temp3) {
786ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org    inputs_[0] = dividend;
787ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org    divisor_ = divisor;
788bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    temps_[0] = temp1;
789bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    temps_[1] = temp2;
7907010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org    temps_[2] = temp3;
791d2899aa30a5af82205029034f7a491d49c48fc68yangguo@chromium.org  }
792d2899aa30a5af82205029034f7a491d49c48fc68yangguo@chromium.org
793ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  LOperand* dividend() { return inputs_[0]; }
794ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  int32_t divisor() const { return divisor_; }
795bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  LOperand* temp1() { return temps_[0]; }
7967010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org  LOperand* temp2() { return temps_[1]; }
7977010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org  LOperand* temp3() { return temps_[2]; }
79856c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
799ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(FlooringDivByConstI, "flooring-div-by-const-i")
800d2899aa30a5af82205029034f7a491d49c48fc68yangguo@chromium.org  DECLARE_HYDROGEN_ACCESSOR(MathFloorOfDiv)
801ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
802ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org private:
803ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  int32_t divisor_;
804d2899aa30a5af82205029034f7a491d49c48fc68yangguo@chromium.org};
805d2899aa30a5af82205029034f7a491d49c48fc68yangguo@chromium.org
806d2899aa30a5af82205029034f7a491d49c48fc68yangguo@chromium.org
807ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LFlooringDivI FINAL : public LTemplateInstruction<1, 2, 1> {
808ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org public:
809ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org  LFlooringDivI(LOperand* dividend, LOperand* divisor, LOperand* temp) {
810ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org    inputs_[0] = dividend;
811ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org    inputs_[1] = divisor;
812ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org    temps_[0] = temp;
813ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org  }
814ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org
815ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org  LOperand* dividend() { return inputs_[0]; }
816ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org  LOperand* divisor() { return inputs_[1]; }
817ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org  LOperand* temp() { return temps_[0]; }
818ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org
819ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(FlooringDivI, "flooring-div-i")
820ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(MathFloorOfDiv)
821ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org};
822ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org
823ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org
824ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LMulI FINAL : public LTemplateInstruction<1, 2, 0> {
825c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
826d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com  LMulI(LOperand* left, LOperand* right) {
8270511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com    inputs_[0] = left;
8280511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com    inputs_[1] = right;
8290511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  }
830c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
83156c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* left() { return inputs_[0]; }
83256c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* right() { return inputs_[1]; }
83356c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
834c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_CONCRETE_INSTRUCTION(MulI, "mul-i")
835c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_HYDROGEN_ACCESSOR(Mul)
836c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org};
837c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
838c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
839ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LCompareNumericAndBranch FINAL : public LControlInstruction<2, 0> {
840c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
841e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  LCompareNumericAndBranch(LOperand* left, LOperand* right) {
8420511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com    inputs_[0] = left;
8430511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com    inputs_[1] = right;
8440511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  }
845c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
84656c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* left() { return inputs_[0]; }
84756c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* right() { return inputs_[1]; }
84856c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
849e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  DECLARE_CONCRETE_INSTRUCTION(CompareNumericAndBranch,
850e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org                               "compare-numeric-and-branch")
851e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  DECLARE_HYDROGEN_ACCESSOR(CompareNumericAndBranch)
852c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
8530511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  Token::Value op() const { return hydrogen()->token(); }
8540511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  bool is_double() const {
855fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org    return hydrogen()->representation().IsDouble();
8560511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  }
857c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
858ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) OVERRIDE;
859c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org};
860c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
861c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
862ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LMathFloor FINAL : public LTemplateInstruction<1, 1, 0> {
863c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
864e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  explicit LMathFloor(LOperand* value) {
8650511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com    inputs_[0] = value;
8660511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  }
867c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
86856c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* value() { return inputs_[0]; }
86956c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
870e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  DECLARE_CONCRETE_INSTRUCTION(MathFloor, "math-floor")
871c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_HYDROGEN_ACCESSOR(UnaryMathOperation)
872e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org};
873c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
874e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
875ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LMathRound FINAL : public LTemplateInstruction<1, 1, 1> {
876e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org public:
877dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  LMathRound(LOperand* value, LOperand* temp) {
878e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    inputs_[0] = value;
879381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org    temps_[0] = temp;
880e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  }
881e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
882e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  LOperand* value() { return inputs_[0]; }
883381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org  LOperand* temp() { return temps_[0]; }
884e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
885e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  DECLARE_CONCRETE_INSTRUCTION(MathRound, "math-round")
886e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  DECLARE_HYDROGEN_ACCESSOR(UnaryMathOperation)
887e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org};
888e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
889e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
890ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LMathFround FINAL : public LTemplateInstruction<1, 1, 0> {
891dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org public:
892dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  explicit LMathFround(LOperand* value) { inputs_[0] = value; }
893dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org
894dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  LOperand* value() { return inputs_[0]; }
895dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org
8967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(MathFround, "math-fround")
897dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org};
898dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org
899dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org
900ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LMathAbs FINAL : public LTemplateInstruction<1, 2, 0> {
901e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org public:
902935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  explicit LMathAbs(LOperand* context, LOperand* value) {
903935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org    inputs_[1] = context;
904e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    inputs_[0] = value;
905e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  }
906e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
907935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LOperand* context() { return inputs_[1]; }
908e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  LOperand* value() { return inputs_[0]; }
909e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
910e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  DECLARE_CONCRETE_INSTRUCTION(MathAbs, "math-abs")
911e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  DECLARE_HYDROGEN_ACCESSOR(UnaryMathOperation)
912e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org};
913e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
914e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
915ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LMathLog FINAL : public LTemplateInstruction<1, 1, 0> {
916e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org public:
917e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  explicit LMathLog(LOperand* value) {
918e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    inputs_[0] = value;
919e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  }
920e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
921e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  LOperand* value() { return inputs_[0]; }
922e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
923e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  DECLARE_CONCRETE_INSTRUCTION(MathLog, "math-log")
924e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org};
925e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
926e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
927ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LMathClz32 FINAL : public LTemplateInstruction<1, 1, 0> {
928f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org public:
929f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  explicit LMathClz32(LOperand* value) {
930f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    inputs_[0] = value;
931f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
932f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
933f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* value() { return inputs_[0]; }
934f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
935f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  DECLARE_CONCRETE_INSTRUCTION(MathClz32, "math-clz32")
936f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org};
937f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
938f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
939ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LMathExp FINAL : public LTemplateInstruction<1, 1, 2> {
9401f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org public:
9411f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org  LMathExp(LOperand* value, LOperand* temp1, LOperand* temp2) {
9421f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org    inputs_[0] = value;
9431f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org    temps_[0] = temp1;
9441f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org    temps_[1] = temp2;
9451f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org    ExternalReference::InitializeMathExpData();
9461f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org  }
9471f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org
9481f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org  LOperand* value() { return inputs_[0]; }
9491f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org  LOperand* temp1() { return temps_[0]; }
9501f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org  LOperand* temp2() { return temps_[1]; }
9511f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org
9521f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org  DECLARE_CONCRETE_INSTRUCTION(MathExp, "math-exp")
953e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org};
9541f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org
955e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
956ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LMathSqrt FINAL : public LTemplateInstruction<1, 1, 0> {
957e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org public:
958e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  explicit LMathSqrt(LOperand* value) {
959e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    inputs_[0] = value;
960e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  }
961e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
962e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  LOperand* value() { return inputs_[0]; }
963e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
964e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  DECLARE_CONCRETE_INSTRUCTION(MathSqrt, "math-sqrt")
965e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org};
966e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
967e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
968ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LMathPowHalf FINAL : public LTemplateInstruction<1, 1, 0> {
969e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org public:
970e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  explicit LMathPowHalf(LOperand* value) {
971e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    inputs_[0] = value;
972e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  }
973e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
974e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  LOperand* value() { return inputs_[0]; }
975e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
976e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  DECLARE_CONCRETE_INSTRUCTION(MathPowHalf, "math-pow-half")
9771f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org};
9781f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org
9791f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org
980ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LCmpObjectEqAndBranch FINAL : public LControlInstruction<2, 0> {
981c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
982ac2828d8d201b0631783404187688fbb786458a3lrn@chromium.org  LCmpObjectEqAndBranch(LOperand* left, LOperand* right) {
9830511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com    inputs_[0] = left;
9840511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com    inputs_[1] = right;
9850511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  }
986c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
98756c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* left() { return inputs_[0]; }
98856c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* right() { return inputs_[1]; }
98956c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
990c00ec2b94bc5505fa81f81daefd956f5a8776a09danno@chromium.org  DECLARE_CONCRETE_INSTRUCTION(CmpObjectEqAndBranch, "cmp-object-eq-and-branch")
991c00ec2b94bc5505fa81f81daefd956f5a8776a09danno@chromium.org};
992c00ec2b94bc5505fa81f81daefd956f5a8776a09danno@chromium.org
993c00ec2b94bc5505fa81f81daefd956f5a8776a09danno@chromium.org
994ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LCmpHoleAndBranch FINAL : public LControlInstruction<1, 0> {
995c00ec2b94bc5505fa81f81daefd956f5a8776a09danno@chromium.org public:
996c00ec2b94bc5505fa81f81daefd956f5a8776a09danno@chromium.org  explicit LCmpHoleAndBranch(LOperand* object) {
997c00ec2b94bc5505fa81f81daefd956f5a8776a09danno@chromium.org    inputs_[0] = object;
998c00ec2b94bc5505fa81f81daefd956f5a8776a09danno@chromium.org  }
999c00ec2b94bc5505fa81f81daefd956f5a8776a09danno@chromium.org
1000c00ec2b94bc5505fa81f81daefd956f5a8776a09danno@chromium.org  LOperand* object() { return inputs_[0]; }
1001c00ec2b94bc5505fa81f81daefd956f5a8776a09danno@chromium.org
1002c00ec2b94bc5505fa81f81daefd956f5a8776a09danno@chromium.org  DECLARE_CONCRETE_INSTRUCTION(CmpHoleAndBranch, "cmp-hole-and-branch")
1003c00ec2b94bc5505fa81f81daefd956f5a8776a09danno@chromium.org  DECLARE_HYDROGEN_ACCESSOR(CompareHoleAndBranch)
10047304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org};
10057304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org
10067304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org
1007ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LCompareMinusZeroAndBranch FINAL : public LControlInstruction<1, 0> {
10080cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org public:
10090cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  explicit LCompareMinusZeroAndBranch(LOperand* value) {
10100cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org    inputs_[0] = value;
10110cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  }
10120cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org
10130cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  LOperand* value() { return inputs_[0]; }
10140cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org
10150cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(CompareMinusZeroAndBranch,
10160cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org                               "cmp-minus-zero-and-branch")
10170cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(CompareMinusZeroAndBranch)
10180cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org};
10190cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org
10200cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org
10210cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org
1022ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LIsObjectAndBranch FINAL : public LControlInstruction<1, 0> {
1023c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
10240ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org  explicit LIsObjectAndBranch(LOperand* value) {
10250511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com    inputs_[0] = value;
10260511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  }
1027c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
102856c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* value() { return inputs_[0]; }
102956c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
1030c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_CONCRETE_INSTRUCTION(IsObjectAndBranch, "is-object-and-branch")
10314f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org  DECLARE_HYDROGEN_ACCESSOR(IsObjectAndBranch)
1032c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1033ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) OVERRIDE;
1034c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org};
1035c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1036c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1037ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LIsStringAndBranch FINAL : public LControlInstruction<1, 1> {
10380ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry public:
10390ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry  explicit LIsStringAndBranch(LOperand* value, LOperand* temp) {
10400ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry    inputs_[0] = value;
10410ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry    temps_[0] = temp;
10420ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry  }
10430ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry
104456c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* value() { return inputs_[0]; }
104556c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* temp() { return temps_[0]; }
104656c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
10470ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry  DECLARE_CONCRETE_INSTRUCTION(IsStringAndBranch, "is-string-and-branch")
10480ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry  DECLARE_HYDROGEN_ACCESSOR(IsStringAndBranch)
10490ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry
1050ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) OVERRIDE;
10510ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry};
10520ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry
10530ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry
1054ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LIsSmiAndBranch FINAL : public LControlInstruction<1, 0> {
1055c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
10560511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  explicit LIsSmiAndBranch(LOperand* value) {
10570511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com    inputs_[0] = value;
10580511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  }
1059c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
106056c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* value() { return inputs_[0]; }
106156c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
1062c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_CONCRETE_INSTRUCTION(IsSmiAndBranch, "is-smi-and-branch")
10634f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org  DECLARE_HYDROGEN_ACCESSOR(IsSmiAndBranch)
1064c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1065ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) OVERRIDE;
1066c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org};
1067c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1068c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1069ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LIsUndetectableAndBranch FINAL : public LControlInstruction<1, 1> {
10707304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org public:
10717304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org  explicit LIsUndetectableAndBranch(LOperand* value, LOperand* temp) {
10727304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org    inputs_[0] = value;
10737304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org    temps_[0] = temp;
10747304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org  }
10757304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org
107656c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* value() { return inputs_[0]; }
107756c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* temp() { return temps_[0]; }
107856c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
10797304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org  DECLARE_CONCRETE_INSTRUCTION(IsUndetectableAndBranch,
10807304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org                               "is-undetectable-and-branch")
10814f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org  DECLARE_HYDROGEN_ACCESSOR(IsUndetectableAndBranch)
10827304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org
1083ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) OVERRIDE;
10847304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org};
10857304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org
10867304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org
1087ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LStringCompareAndBranch FINAL : public LControlInstruction<3, 0> {
10880ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry public:
1089935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  explicit LStringCompareAndBranch(LOperand* context,
1090935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org                                   LOperand* left,
1091935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org                                   LOperand* right) {
1092935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org    inputs_[0] = context;
1093935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org    inputs_[1] = left;
1094935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org    inputs_[2] = right;
10950ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry  }
10960ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry
1097935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LOperand* context() { return inputs_[0]; }
1098935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LOperand* left() { return inputs_[1]; }
1099935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LOperand* right() { return inputs_[2]; }
110056c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
11010ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry  DECLARE_CONCRETE_INSTRUCTION(StringCompareAndBranch,
11020ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry                               "string-compare-and-branch")
11030ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry  DECLARE_HYDROGEN_ACCESSOR(StringCompareAndBranch)
11040ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry
1105ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) OVERRIDE;
11060ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry
11070ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry  Token::Value op() const { return hydrogen()->token(); }
11080ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry};
11090ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry
11100ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry
1111ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LHasInstanceTypeAndBranch FINAL : public LControlInstruction<1, 0> {
1112c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
11130a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org  explicit LHasInstanceTypeAndBranch(LOperand* value) {
11140511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com    inputs_[0] = value;
11150511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  }
1116c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
111756c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* value() { return inputs_[0]; }
111856c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
1119c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_CONCRETE_INSTRUCTION(HasInstanceTypeAndBranch,
1120c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org                               "has-instance-type-and-branch")
11214f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org  DECLARE_HYDROGEN_ACCESSOR(HasInstanceTypeAndBranch)
1122c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1123ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) OVERRIDE;
1124c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org};
1125c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1126c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1127ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LGetCachedArrayIndex FINAL : public LTemplateInstruction<1, 1, 0> {
11288f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org public:
11298f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  explicit LGetCachedArrayIndex(LOperand* value) {
11308f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org    inputs_[0] = value;
11318f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  }
11328f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org
113356c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* value() { return inputs_[0]; }
113456c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
11358f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  DECLARE_CONCRETE_INSTRUCTION(GetCachedArrayIndex, "get-cached-array-index")
11368f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  DECLARE_HYDROGEN_ACCESSOR(GetCachedArrayIndex)
11378f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org};
11388f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org
11398f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org
1140ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LHasCachedArrayIndexAndBranch FINAL
114132cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org    : public LControlInstruction<1, 0> {
1142c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
11430511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  explicit LHasCachedArrayIndexAndBranch(LOperand* value) {
11440511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com    inputs_[0] = value;
11450511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  }
1146c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
114756c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* value() { return inputs_[0]; }
114856c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
1149c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_CONCRETE_INSTRUCTION(HasCachedArrayIndexAndBranch,
1150c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org                               "has-cached-array-index-and-branch")
11514f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org  DECLARE_HYDROGEN_ACCESSOR(HasCachedArrayIndexAndBranch)
1152c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1153ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) OVERRIDE;
1154c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org};
1155c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1156c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1157ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LClassOfTestAndBranch FINAL : public LControlInstruction<1, 2> {
1158c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
1159c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  LClassOfTestAndBranch(LOperand* value, LOperand* temp, LOperand* temp2) {
11600511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com    inputs_[0] = value;
11610511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com    temps_[0] = temp;
1162c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    temps_[1] = temp2;
11630511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  }
1164c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
116556c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* value() { return inputs_[0]; }
116656c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* temp() { return temps_[0]; }
116756c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* temp2() { return temps_[1]; }
116856c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
1169c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_CONCRETE_INSTRUCTION(ClassOfTestAndBranch,
1170c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org                               "class-of-test-and-branch")
11714f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org  DECLARE_HYDROGEN_ACCESSOR(ClassOfTestAndBranch)
1172c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1173ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) OVERRIDE;
1174c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org};
1175c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1176c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1177ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LCmpT FINAL : public LTemplateInstruction<1, 3, 0> {
1178c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
1179935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LCmpT(LOperand* context, LOperand* left, LOperand* right) {
1180935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org    inputs_[0] = context;
1181935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org    inputs_[1] = left;
1182935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org    inputs_[2] = right;
11830511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  }
1184c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1185935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LOperand* context() { return inputs_[0]; }
1186935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LOperand* left() { return inputs_[1]; }
1187935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LOperand* right() { return inputs_[2]; }
118856c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
1189c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_CONCRETE_INSTRUCTION(CmpT, "cmp-t")
11904f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org  DECLARE_HYDROGEN_ACCESSOR(CompareGeneric)
1191c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1192c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  Token::Value op() const { return hydrogen()->token(); }
1193c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org};
1194c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1195c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1196ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LInstanceOf FINAL : public LTemplateInstruction<1, 3, 0> {
1197c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
1198935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LInstanceOf(LOperand* context, LOperand* left, LOperand* right) {
1199935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org    inputs_[0] = context;
1200935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org    inputs_[1] = left;
1201935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org    inputs_[2] = right;
12020511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  }
1203c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1204935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LOperand* context() { return inputs_[0]; }
1205935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LOperand* left() { return inputs_[1]; }
1206935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LOperand* right() { return inputs_[2]; }
120756c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
1208c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_CONCRETE_INSTRUCTION(InstanceOf, "instance-of")
1209c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org};
1210c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1211c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1212ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LInstanceOfKnownGlobal FINAL : public LTemplateInstruction<1, 2, 1> {
1213c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
1214935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LInstanceOfKnownGlobal(LOperand* context, LOperand* value, LOperand* temp) {
1215935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org    inputs_[0] = context;
1216935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org    inputs_[1] = value;
12174d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org    temps_[0] = temp;
12180511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  }
1219c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1220935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LOperand* context() { return inputs_[0]; }
1221935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LOperand* value() { return inputs_[1]; }
122256c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* temp() { return temps_[0]; }
122356c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
1224c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_CONCRETE_INSTRUCTION(InstanceOfKnownGlobal,
1225c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org                               "instance-of-known-global")
1226c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_HYDROGEN_ACCESSOR(InstanceOfKnownGlobal)
1227c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1228c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  Handle<JSFunction> function() const { return hydrogen()->function(); }
12291044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org  LEnvironment* GetDeferredLazyDeoptimizationEnvironment() {
12301044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org    return lazy_deopt_env_;
12311044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org  }
123232cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org  virtual void SetDeferredLazyDeoptimizationEnvironment(
1233ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org      LEnvironment* env) OVERRIDE {
12341044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org    lazy_deopt_env_ = env;
12351044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org  }
12361044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org
12371044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org private:
12381044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org  LEnvironment* lazy_deopt_env_;
1239c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org};
1240c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1241c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1242ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LBoundsCheck FINAL : public LTemplateInstruction<0, 2, 0> {
1243c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
12440511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  LBoundsCheck(LOperand* index, LOperand* length) {
12450511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com    inputs_[0] = index;
12460511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com    inputs_[1] = length;
12470511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  }
1248c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
12490511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  LOperand* index() { return inputs_[0]; }
12500511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  LOperand* length() { return inputs_[1]; }
1251c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1252c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_CONCRETE_INSTRUCTION(BoundsCheck, "bounds-check")
1253304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org  DECLARE_HYDROGEN_ACCESSOR(BoundsCheck)
1254c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org};
1255c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1256c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1257ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LBitI FINAL : public LTemplateInstruction<1, 2, 0> {
1258c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
1259c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LBitI(LOperand* left, LOperand* right) {
12600511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com    inputs_[0] = left;
12610511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com    inputs_[1] = right;
12620511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  }
1263c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
126456c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* left() { return inputs_[0]; }
126556c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* right() { return inputs_[1]; }
126656c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
1267c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  Token::Value op() const { return hydrogen()->op(); }
12682ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  bool IsInteger32() const {
12692ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org    return hydrogen()->representation().IsInteger32();
12702ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  }
1271c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1272c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_CONCRETE_INSTRUCTION(BitI, "bit-i")
1273c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_HYDROGEN_ACCESSOR(Bitwise)
1274c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org};
1275c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1276c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1277ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LShiftI FINAL : public LTemplateInstruction<1, 2, 0> {
1278c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
1279c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  LShiftI(Token::Value op, LOperand* left, LOperand* right, bool can_deopt)
12800511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com      : op_(op), can_deopt_(can_deopt) {
12810511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com    inputs_[0] = left;
12820511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com    inputs_[1] = right;
12830511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  }
1284c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1285c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  Token::Value op() const { return op_; }
128656c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* left() { return inputs_[0]; }
128756c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* right() { return inputs_[1]; }
1288c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  bool can_deopt() const { return can_deopt_; }
1289c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1290c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_CONCRETE_INSTRUCTION(ShiftI, "shift-i")
1291c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1292c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org private:
1293c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  Token::Value op_;
1294c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  bool can_deopt_;
1295c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org};
1296c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1297c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1298ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LSubI FINAL : public LTemplateInstruction<1, 2, 0> {
1299c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
13000511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  LSubI(LOperand* left, LOperand* right) {
13010511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com    inputs_[0] = left;
13020511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com    inputs_[1] = right;
13030511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  }
1304c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
130556c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* left() { return inputs_[0]; }
130656c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* right() { return inputs_[1]; }
130756c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
1308c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_CONCRETE_INSTRUCTION(SubI, "sub-i")
1309c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_HYDROGEN_ACCESSOR(Sub)
1310c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org};
1311c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1312c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1313ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LConstantI FINAL : public LTemplateInstruction<1, 0, 0> {
1314c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
1315c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_CONCRETE_INSTRUCTION(ConstantI, "constant-i")
1316d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com  DECLARE_HYDROGEN_ACCESSOR(Constant)
1317c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1318d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com  int32_t value() const { return hydrogen()->Integer32Value(); }
1319c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org};
1320c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1321c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1322ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LConstantS FINAL : public LTemplateInstruction<1, 0, 0> {
1323b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org public:
1324b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  DECLARE_CONCRETE_INSTRUCTION(ConstantS, "constant-s")
1325b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  DECLARE_HYDROGEN_ACCESSOR(Constant)
1326b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org
1327b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  Smi* value() const { return Smi::FromInt(hydrogen()->Integer32Value()); }
1328b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org};
1329b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org
1330b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org
1331ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LConstantD FINAL : public LTemplateInstruction<1, 0, 1> {
1332c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
1333d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com  explicit LConstantD(LOperand* temp) {
13340511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com    temps_[0] = temp;
13350511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  }
133656c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
133756c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* temp() { return temps_[0]; }
133856c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
1339c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_CONCRETE_INSTRUCTION(ConstantD, "constant-d")
1340d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com  DECLARE_HYDROGEN_ACCESSOR(Constant)
1341c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1342d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com  double value() const { return hydrogen()->DoubleValue(); }
1343c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org};
1344c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1345c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1346ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LConstantE FINAL : public LTemplateInstruction<1, 0, 0> {
1347d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org public:
1348d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  DECLARE_CONCRETE_INSTRUCTION(ConstantE, "constant-e")
1349d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  DECLARE_HYDROGEN_ACCESSOR(Constant)
1350d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
1351d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  ExternalReference value() const {
1352d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    return hydrogen()->ExternalReferenceValue();
1353d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  }
1354d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org};
1355d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
1356d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
1357ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LConstantT FINAL : public LTemplateInstruction<1, 0, 0> {
1358c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
1359c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_CONCRETE_INSTRUCTION(ConstantT, "constant-t")
1360d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com  DECLARE_HYDROGEN_ACCESSOR(Constant)
1361c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1362639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  Handle<Object> value(Isolate* isolate) const {
1363639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org    return hydrogen()->handle(isolate);
1364639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  }
1365c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org};
1366c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1367c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1368ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LBranch FINAL : public LControlInstruction<1, 0> {
1369c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
13700511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  explicit LBranch(LOperand* value) {
13710511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com    inputs_[0] = value;
13720511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  }
1373c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
137456c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* value() { return inputs_[0]; }
137556c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
1376c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_CONCRETE_INSTRUCTION(Branch, "branch")
13774f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org  DECLARE_HYDROGEN_ACCESSOR(Branch)
1378c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1379ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) OVERRIDE;
1380c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org};
1381c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1382c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1383ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LDebugBreak FINAL : public LTemplateInstruction<0, 0, 0> {
13844e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org public:
13854e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(DebugBreak, "break")
13864e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org};
13874e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org
13884e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org
1389ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LCmpMapAndBranch FINAL : public LControlInstruction<1, 0> {
1390c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
13910511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  explicit LCmpMapAndBranch(LOperand* value) {
13920511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com    inputs_[0] = value;
13930511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  }
1394c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
139556c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* value() { return inputs_[0]; }
139656c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
1397c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_CONCRETE_INSTRUCTION(CmpMapAndBranch, "cmp-map-and-branch")
13980a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org  DECLARE_HYDROGEN_ACCESSOR(CompareMap)
1399c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1400528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Handle<Map> map() const { return hydrogen()->map().handle(); }
1401c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org};
1402c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1403c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1404ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LMapEnumLength FINAL : public LTemplateInstruction<1, 1, 0> {
1405355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org public:
1406355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org  explicit LMapEnumLength(LOperand* value) {
1407355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org    inputs_[0] = value;
1408355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org  }
1409355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org
141056c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* value() { return inputs_[0]; }
141156c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
1412355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org  DECLARE_CONCRETE_INSTRUCTION(MapEnumLength, "map-enum-length")
1413355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org};
1414355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org
1415355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org
1416ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LDateField FINAL : public LTemplateInstruction<1, 1, 0> {
14174efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org public:
14184efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org  LDateField(LOperand* date, Smi* index) : index_(index) {
14194efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org    inputs_[0] = date;
14204efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org  }
14214efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org
142256c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* date() { return inputs_[0]; }
142356c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  Smi* index() const { return index_; }
142456c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
14253d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(DateField, "date-field")
14263d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(DateField)
14274efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org
14284efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org private:
14294efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org  Smi* index_;
14304efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org};
14314efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org
14324efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org
1433ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LSeqStringGetChar FINAL : public LTemplateInstruction<1, 2, 0> {
1434e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org public:
1435e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  LSeqStringGetChar(LOperand* string, LOperand* index) {
1436e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org    inputs_[0] = string;
1437e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org    inputs_[1] = index;
1438e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  }
1439e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org
1440e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  LOperand* string() const { return inputs_[0]; }
1441e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  LOperand* index() const { return inputs_[1]; }
1442e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org
1443e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(SeqStringGetChar, "seq-string-get-char")
1444e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(SeqStringGetChar)
1445e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org};
1446e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org
1447e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org
1448ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LSeqStringSetChar FINAL : public LTemplateInstruction<1, 4, 0> {
144932280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org public:
14509af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org  LSeqStringSetChar(LOperand* context,
14519af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org                    LOperand* string,
145232280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org                    LOperand* index,
1453e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org                    LOperand* value) {
14549af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org    inputs_[0] = context;
14559af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org    inputs_[1] = string;
14569af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org    inputs_[2] = index;
14579af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org    inputs_[3] = value;
145832280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  }
145932280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org
14609af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org  LOperand* string() { return inputs_[1]; }
14619af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org  LOperand* index() { return inputs_[2]; }
14629af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org  LOperand* value() { return inputs_[3]; }
146332280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org
146432280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  DECLARE_CONCRETE_INSTRUCTION(SeqStringSetChar, "seq-string-set-char")
146532280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  DECLARE_HYDROGEN_ACCESSOR(SeqStringSetChar)
146632280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org};
146732280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org
146832280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org
1469ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LAddI FINAL : public LTemplateInstruction<1, 2, 0> {
1470c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
14710511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  LAddI(LOperand* left, LOperand* right) {
14720511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com    inputs_[0] = left;
14730511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com    inputs_[1] = right;
14740511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  }
1475c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
147656c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* left() { return inputs_[0]; }
147756c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* right() { return inputs_[1]; }
147856c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
1479906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org  static bool UseLea(HAdd* add) {
1480906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org    return !add->CheckFlag(HValue::kCanOverflow) &&
1481906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org        add->BetterLeftOperand()->UseCount() > 1;
1482906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org  }
1483906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org
1484c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_CONCRETE_INSTRUCTION(AddI, "add-i")
1485c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_HYDROGEN_ACCESSOR(Add)
1486c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org};
1487c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1488c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1489ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LMathMinMax FINAL : public LTemplateInstruction<1, 2, 0> {
1490471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org public:
1491471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  LMathMinMax(LOperand* left, LOperand* right) {
1492471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    inputs_[0] = left;
1493471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    inputs_[1] = right;
1494471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  }
1495471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
149656c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* left() { return inputs_[0]; }
149756c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* right() { return inputs_[1]; }
149856c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
1499e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  DECLARE_CONCRETE_INSTRUCTION(MathMinMax, "math-min-max")
1500471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  DECLARE_HYDROGEN_ACCESSOR(MathMinMax)
1501471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org};
1502471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
1503471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
1504ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LPower FINAL : public LTemplateInstruction<1, 2, 0> {
1505c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
15060511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  LPower(LOperand* left, LOperand* right) {
15070511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com    inputs_[0] = left;
15080511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com    inputs_[1] = right;
15090511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  }
1510c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
151156c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* left() { return inputs_[0]; }
151256c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* right() { return inputs_[1]; }
151356c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
1514c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_CONCRETE_INSTRUCTION(Power, "power")
1515c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_HYDROGEN_ACCESSOR(Power)
1516c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org};
1517c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1518c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1519ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LArithmeticD FINAL : public LTemplateInstruction<1, 2, 0> {
1520c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
1521c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  LArithmeticD(Token::Value op, LOperand* left, LOperand* right)
15220511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com      : op_(op) {
15230511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com    inputs_[0] = left;
15240511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com    inputs_[1] = right;
15250511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  }
1526c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1527c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  Token::Value op() const { return op_; }
152856c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* left() { return inputs_[0]; }
152956c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* right() { return inputs_[1]; }
1530c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1531ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual Opcode opcode() const OVERRIDE {
153232cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org    return LInstruction::kArithmeticD;
153332cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org  }
1534ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void CompileToNative(LCodeGen* generator) OVERRIDE;
1535ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual const char* Mnemonic() const OVERRIDE;
1536c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1537c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org private:
1538c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  Token::Value op_;
1539c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org};
1540c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1541c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1542ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LArithmeticT FINAL : public LTemplateInstruction<1, 3, 0> {
1543c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
1544935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LArithmeticT(Token::Value op,
1545935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org               LOperand* context,
1546935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org               LOperand* left,
1547935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org               LOperand* right)
15480511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com      : op_(op) {
1549935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org    inputs_[0] = context;
1550935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org    inputs_[1] = left;
1551935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org    inputs_[2] = right;
15520511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  }
1553c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
155456c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  Token::Value op() const { return op_; }
1555935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LOperand* context() { return inputs_[0]; }
1556935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LOperand* left() { return inputs_[1]; }
1557935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LOperand* right() { return inputs_[2]; }
155856c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
1559ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual Opcode opcode() const OVERRIDE {
156032cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org    return LInstruction::kArithmeticT;
156132cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org  }
1562ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void CompileToNative(LCodeGen* generator) OVERRIDE;
1563ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual const char* Mnemonic() const OVERRIDE;
1564c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1565c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org private:
1566c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  Token::Value op_;
1567c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org};
1568c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1569c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1570ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LReturn FINAL : public LTemplateInstruction<0, 3, 0> {
1571c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
1572935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  explicit LReturn(LOperand* value,
1573935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org                   LOperand* context,
1574935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org                   LOperand* parameter_count) {
15750511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com    inputs_[0] = value;
1576935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org    inputs_[1] = context;
1577935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org    inputs_[2] = parameter_count;
15780511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  }
1579c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
158056c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* value() { return inputs_[0]; }
1581935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LOperand* context() { return inputs_[1]; }
158256c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
15836e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org  bool has_constant_parameter_count() {
15846e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org    return parameter_count()->IsConstantOperand();
15856e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org  }
15866e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org  LConstantOperand* constant_parameter_count() {
1587e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(has_constant_parameter_count());
15886e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org    return LConstantOperand::cast(parameter_count());
15896e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org  }
1590935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LOperand* parameter_count() { return inputs_[2]; }
15916e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org
1592c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_CONCRETE_INSTRUCTION(Return, "return")
1593ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  DECLARE_HYDROGEN_ACCESSOR(Return)
1594c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org};
1595c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1596c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1597ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LLoadNamedField FINAL : public LTemplateInstruction<1, 1, 0> {
1598c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
159957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  explicit LLoadNamedField(LOperand* object) {
16000511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com    inputs_[0] = object;
16010511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  }
1602c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
160356c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* object() { return inputs_[0]; }
160456c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
1605c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_CONCRETE_INSTRUCTION(LoadNamedField, "load-named-field")
1606c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_HYDROGEN_ACCESSOR(LoadNamedField)
1607c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org};
1608c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1609c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1610ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LLoadNamedGeneric FINAL : public LTemplateInstruction<1, 2, 1> {
1611c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
16129d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  explicit LLoadNamedGeneric(LOperand* context, LOperand* object,
16139d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org                             LOperand* vector) {
1614935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org    inputs_[0] = context;
1615935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org    inputs_[1] = object;
16169d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org    temps_[0] = vector;
16170511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  }
1618c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1619c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_CONCRETE_INSTRUCTION(LoadNamedGeneric, "load-named-generic")
1620c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_HYDROGEN_ACCESSOR(LoadNamedGeneric)
1621c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1622935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LOperand* context() { return inputs_[0]; }
1623935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LOperand* object() { return inputs_[1]; }
16249d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  LOperand* temp_vector() { return temps_[0]; }
16259d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org
1626c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  Handle<Object> name() const { return hydrogen()->name(); }
1627c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org};
1628c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1629c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1630ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LLoadFunctionPrototype FINAL : public LTemplateInstruction<1, 1, 0> {
1631c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
1632496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org  explicit LLoadFunctionPrototype(LOperand* function) {
16330511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com    inputs_[0] = function;
16340511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  }
1635c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1636c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_CONCRETE_INSTRUCTION(LoadFunctionPrototype, "load-function-prototype")
1637c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_HYDROGEN_ACCESSOR(LoadFunctionPrototype)
1638c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
16390511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  LOperand* function() { return inputs_[0]; }
1640c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org};
1641c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1642c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1643ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LLoadRoot FINAL : public LTemplateInstruction<1, 0, 0> {
1644528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org public:
1645528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(LoadRoot, "load-root")
1646528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(LoadRoot)
1647528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org
1648528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Heap::RootListIndex index() const { return hydrogen()->index(); }
1649528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org};
1650528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org
1651528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org
165270d11c79c7833b9ab1ee185625fcf707b9480a40machenbach@chromium.orginline static bool ExternalArrayOpRequiresTemp(
165370d11c79c7833b9ab1ee185625fcf707b9480a40machenbach@chromium.org    Representation key_representation,
165470d11c79c7833b9ab1ee185625fcf707b9480a40machenbach@chromium.org    ElementsKind elements_kind) {
165570d11c79c7833b9ab1ee185625fcf707b9480a40machenbach@chromium.org  // Operations that require the key to be divided by two to be converted into
165670d11c79c7833b9ab1ee185625fcf707b9480a40machenbach@chromium.org  // an index cannot fold the scale operation into a load and need an extra
165770d11c79c7833b9ab1ee185625fcf707b9480a40machenbach@chromium.org  // temp register to do the work.
165870d11c79c7833b9ab1ee185625fcf707b9480a40machenbach@chromium.org  return SmiValuesAre31Bits() && key_representation.IsSmi() &&
165970d11c79c7833b9ab1ee185625fcf707b9480a40machenbach@chromium.org      (elements_kind == EXTERNAL_INT8_ELEMENTS ||
166070d11c79c7833b9ab1ee185625fcf707b9480a40machenbach@chromium.org       elements_kind == EXTERNAL_UINT8_ELEMENTS ||
166170d11c79c7833b9ab1ee185625fcf707b9480a40machenbach@chromium.org       elements_kind == EXTERNAL_UINT8_CLAMPED_ELEMENTS ||
166270d11c79c7833b9ab1ee185625fcf707b9480a40machenbach@chromium.org       elements_kind == UINT8_ELEMENTS ||
166370d11c79c7833b9ab1ee185625fcf707b9480a40machenbach@chromium.org       elements_kind == INT8_ELEMENTS ||
166470d11c79c7833b9ab1ee185625fcf707b9480a40machenbach@chromium.org       elements_kind == UINT8_CLAMPED_ELEMENTS);
166570d11c79c7833b9ab1ee185625fcf707b9480a40machenbach@chromium.org}
166670d11c79c7833b9ab1ee185625fcf707b9480a40machenbach@chromium.org
166770d11c79c7833b9ab1ee185625fcf707b9480a40machenbach@chromium.org
1668ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LLoadKeyed FINAL : public LTemplateInstruction<1, 2, 0> {
1669c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
1670e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  LLoadKeyed(LOperand* elements, LOperand* key) {
16710511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com    inputs_[0] = elements;
16720511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com    inputs_[1] = key;
16730511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  }
1674c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1675e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  DECLARE_CONCRETE_INSTRUCTION(LoadKeyed, "load-keyed")
1676e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  DECLARE_HYDROGEN_ACCESSOR(LoadKeyed)
1677c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1678e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  bool is_external() const {
1679e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org    return hydrogen()->is_external();
1680717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org  }
16815c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org  bool is_fixed_typed_array() const {
16825c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org    return hydrogen()->is_fixed_typed_array();
16835c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org  }
16845c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org  bool is_typed_elements() const {
16855c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org    return is_external() || is_fixed_typed_array();
16865c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org  }
1687717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org  LOperand* elements() { return inputs_[0]; }
1688717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org  LOperand* key() { return inputs_[1]; }
1689ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) OVERRIDE;
1690fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org  uint32_t base_offset() const { return hydrogen()->base_offset(); }
169183e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org  ElementsKind elements_kind() const {
16926d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org    return hydrogen()->elements_kind();
16937979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org  }
1694496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org};
1695496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org
1696496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org
1697ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LLoadKeyedGeneric FINAL : public LTemplateInstruction<1, 3, 1> {
1698c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
16999d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  LLoadKeyedGeneric(LOperand* context, LOperand* obj, LOperand* key,
17009d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org                    LOperand* vector) {
1701935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org    inputs_[0] = context;
1702935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org    inputs_[1] = obj;
1703935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org    inputs_[2] = key;
17049d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org    temps_[0] = vector;
17050511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  }
1706c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1707c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_CONCRETE_INSTRUCTION(LoadKeyedGeneric, "load-keyed-generic")
17089d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(LoadKeyedGeneric)
1709c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1710935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LOperand* context() { return inputs_[0]; }
1711935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LOperand* object() { return inputs_[1]; }
1712935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LOperand* key() { return inputs_[2]; }
17139d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  LOperand* temp_vector() { return temps_[0]; }
1714c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org};
1715c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1716c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1717ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LLoadGlobalCell FINAL : public LTemplateInstruction<1, 0, 0> {
1718c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
1719c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org  DECLARE_CONCRETE_INSTRUCTION(LoadGlobalCell, "load-global-cell")
1720c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org  DECLARE_HYDROGEN_ACCESSOR(LoadGlobalCell)
1721c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org};
1722c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org
1723c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org
1724ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LLoadGlobalGeneric FINAL : public LTemplateInstruction<1, 2, 1> {
1725c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org public:
17269d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  explicit LLoadGlobalGeneric(LOperand* context, LOperand* global_object,
17279d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org                              LOperand* vector) {
1728935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org    inputs_[0] = context;
1729935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org    inputs_[1] = global_object;
17309d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org    temps_[0] = vector;
1731c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org  }
1732c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org
1733c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org  DECLARE_CONCRETE_INSTRUCTION(LoadGlobalGeneric, "load-global-generic")
1734c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org  DECLARE_HYDROGEN_ACCESSOR(LoadGlobalGeneric)
1735c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org
1736935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LOperand* context() { return inputs_[0]; }
1737935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LOperand* global_object() { return inputs_[1]; }
17389d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  LOperand* temp_vector() { return temps_[0]; }
17399d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org
1740c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org  Handle<Object> name() const { return hydrogen()->name(); }
1741c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org  bool for_typeof() const { return hydrogen()->for_typeof(); }
1742c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org};
1743c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1744c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1745ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LStoreGlobalCell FINAL : public LTemplateInstruction<0, 1, 1> {
1746c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
1747e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org  explicit LStoreGlobalCell(LOperand* value, LOperand* temp) {
17480511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com    inputs_[0] = value;
1749e78f9fcf40d01605c74cacb606ccabae36ba46bddanno@chromium.org    temps_[0] = temp;
17500511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  }
1751c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
175256c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* value() { return inputs_[0]; }
175356c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* temp() { return temps_[0]; }
175456c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
175574f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org  DECLARE_CONCRETE_INSTRUCTION(StoreGlobalCell, "store-global-cell")
175674f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org  DECLARE_HYDROGEN_ACCESSOR(StoreGlobalCell)
175774f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org};
175874f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org
175974f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org
1760ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LLoadContextSlot FINAL : public LTemplateInstruction<1, 1, 0> {
1761c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
176283aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  explicit LLoadContextSlot(LOperand* context) {
176383aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org    inputs_[0] = context;
176483aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  }
176583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org
176656c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* context() { return inputs_[0]; }
176756c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
1768c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_CONCRETE_INSTRUCTION(LoadContextSlot, "load-context-slot")
1769c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_HYDROGEN_ACCESSOR(LoadContextSlot)
1770c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
17710511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  int slot_index() { return hydrogen()->slot_index(); }
1772c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1773ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) OVERRIDE;
1774c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org};
1775c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1776c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1777ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LStoreContextSlot FINAL : public LTemplateInstruction<0, 2, 1> {
17783a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org public:
17798f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  LStoreContextSlot(LOperand* context, LOperand* value, LOperand* temp) {
17803a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org    inputs_[0] = context;
17813a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org    inputs_[1] = value;
17828f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org    temps_[0] = temp;
17833a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  }
17843a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
178556c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* context() { return inputs_[0]; }
178656c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* value() { return inputs_[1]; }
178756c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* temp() { return temps_[0]; }
178856c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
17893a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  DECLARE_CONCRETE_INSTRUCTION(StoreContextSlot, "store-context-slot")
17903a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  DECLARE_HYDROGEN_ACCESSOR(StoreContextSlot)
17913a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
17923a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  int slot_index() { return hydrogen()->slot_index(); }
17933a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
1794ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) OVERRIDE;
17953a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org};
17963a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
17973a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
1798ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LPushArgument FINAL : public LTemplateInstruction<0, 1, 0> {
1799c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
18000511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  explicit LPushArgument(LOperand* value) {
18010511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com    inputs_[0] = value;
18020511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  }
1803c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
180456c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* value() { return inputs_[0]; }
180556c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
1806c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_CONCRETE_INSTRUCTION(PushArgument, "push-argument")
1807c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org};
1808c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1809c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1810ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LDrop FINAL : public LTemplateInstruction<0, 0, 0> {
181128faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org public:
181228faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org  explicit LDrop(int count) : count_(count) { }
181328faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org
181428faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org  int count() const { return count_; }
181528faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org
181628faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(Drop, "drop")
181728faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org
181828faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org private:
181928faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org  int count_;
182028faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org};
182128faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org
182228faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org
1823ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LStoreCodeEntry FINAL: public LTemplateInstruction<0, 2, 0> {
1824662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org public:
1825662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  LStoreCodeEntry(LOperand* function, LOperand* code_object) {
1826662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org    inputs_[0] = function;
18273ee7a7ed19002e4a0efbf6cdb2a201f21763a80adanno@chromium.org    inputs_[1] = code_object;
1828662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  }
1829662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org
1830662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  LOperand* function() { return inputs_[0]; }
18313ee7a7ed19002e4a0efbf6cdb2a201f21763a80adanno@chromium.org  LOperand* code_object() { return inputs_[1]; }
1832662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org
1833662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  virtual void PrintDataTo(StringStream* stream);
1834662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org
1835662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  DECLARE_CONCRETE_INSTRUCTION(StoreCodeEntry, "store-code-entry")
1836662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  DECLARE_HYDROGEN_ACCESSOR(StoreCodeEntry)
1837662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org};
1838662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org
1839662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org
1840ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LInnerAllocatedObject FINAL: public LTemplateInstruction<1, 2, 0> {
18412bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org public:
1842ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org  LInnerAllocatedObject(LOperand* base_object, LOperand* offset) {
18432bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org    inputs_[0] = base_object;
1844ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org    inputs_[1] = offset;
18452bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  }
18462bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org
1847ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org  LOperand* base_object() const { return inputs_[0]; }
1848ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org  LOperand* offset() const { return inputs_[1]; }
18492bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org
1850ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) OVERRIDE;
18512bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org
1852ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(InnerAllocatedObject, "inner-allocated-object")
18532bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org};
18542bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org
18552bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org
1856ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LThisFunction FINAL : public LTemplateInstruction<1, 0, 0> {
1857394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com public:
1858d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(ThisFunction, "this-function")
1859394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  DECLARE_HYDROGEN_ACCESSOR(ThisFunction)
1860d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org};
1861d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org
1862d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org
1863ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LContext FINAL : public LTemplateInstruction<1, 0, 0> {
1864496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org public:
1865496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org  DECLARE_CONCRETE_INSTRUCTION(Context, "context")
186694b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org  DECLARE_HYDROGEN_ACCESSOR(Context)
1867496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org};
1868496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org
1869496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org
1870ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LDeclareGlobals FINAL : public LTemplateInstruction<0, 1, 0> {
187156454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org public:
1872935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  explicit LDeclareGlobals(LOperand* context) {
1873935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org    inputs_[0] = context;
1874935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  }
1875935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org
1876935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LOperand* context() { return inputs_[0]; }
1877935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org
187856454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org  DECLARE_CONCRETE_INSTRUCTION(DeclareGlobals, "declare-globals")
187956454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org  DECLARE_HYDROGEN_ACCESSOR(DeclareGlobals)
188056454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org};
188156454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org
188256454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org
1883ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LCallJSFunction FINAL : public LTemplateInstruction<1, 1, 0> {
1884160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org public:
188526ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  explicit LCallJSFunction(LOperand* function) {
188626ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org    inputs_[0] = function;
1887160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  }
1888160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org
188926ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  LOperand* function() { return inputs_[0]; }
189056c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
189126ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(CallJSFunction, "call-js-function")
189226ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(CallJSFunction)
1893160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org
1894ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) OVERRIDE;
1895160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org
1896160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  int arity() const { return hydrogen()->argument_count() - 1; }
1897160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org};
1898160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org
1899160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org
1900ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LCallWithDescriptor FINAL : public LTemplateResultInstruction<1> {
1901c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
19029aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org  LCallWithDescriptor(CallInterfaceDescriptor descriptor,
1903ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org                      const ZoneList<LOperand*>& operands, Zone* zone)
19049aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org      : inputs_(descriptor.GetRegisterParameterCount() + 1, zone) {
19059aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org    DCHECK(descriptor.GetRegisterParameterCount() + 1 == operands.length());
190626ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org    inputs_.AddAll(operands, zone);
19070511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  }
19080511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com
190926ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  LOperand* target() const { return inputs_[0]; }
1910c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1911e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(CallWithDescriptor)
1912e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org
191326ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org private:
191426ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(CallWithDescriptor, "call-with-descriptor")
19153a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
1916ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) OVERRIDE;
1917c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1918c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  int arity() const { return hydrogen()->argument_count() - 1; }
191926ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org
192026ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  ZoneList<LOperand*> inputs_;
192126ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org
192226ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  // Iterator support.
1923ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual int InputCount() FINAL OVERRIDE { return inputs_.length(); }
1924ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual LOperand* InputAt(int i) FINAL OVERRIDE { return inputs_[i]; }
192526ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org
1926ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual int TempCount() FINAL OVERRIDE { return 0; }
1927ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual LOperand* TempAt(int i) FINAL OVERRIDE { return NULL; }
1928c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org};
1929c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1930c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1931ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LInvokeFunction FINAL : public LTemplateInstruction<1, 2, 0> {
1932c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
193326ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  LInvokeFunction(LOperand* context, LOperand* function) {
1934935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org    inputs_[0] = context;
193526ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org    inputs_[1] = function;
1936935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  }
1937935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org
1938935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LOperand* context() { return inputs_[0]; }
193926ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  LOperand* function() { return inputs_[1]; }
1940935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org
194126ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(InvokeFunction, "invoke-function")
194226ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(InvokeFunction)
1943a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1944ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) OVERRIDE;
1945d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1946c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  int arity() const { return hydrogen()->argument_count() - 1; }
1947c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org};
1948a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1949a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1950ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LCallFunction FINAL : public LTemplateInstruction<1, 2, 0> {
1951c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
1952935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LCallFunction(LOperand* context, LOperand* function) {
1953935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org    inputs_[0] = context;
1954935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org    inputs_[1] = function;
1955c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  }
19563a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
1957c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_CONCRETE_INSTRUCTION(CallFunction, "call-function")
1958c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_HYDROGEN_ACCESSOR(CallFunction)
1959d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1960935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LOperand* context() { return inputs_[0]; }
1961935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LOperand* function() { return inputs_[1]; }
1962c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  int arity() const { return hydrogen()->argument_count() - 1; }
1963c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org};
1964d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1965d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1966ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LCallNew FINAL : public LTemplateInstruction<1, 2, 0> {
1967c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
1968935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LCallNew(LOperand* context, LOperand* constructor) {
1969935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org    inputs_[0] = context;
1970935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org    inputs_[1] = constructor;
19710511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  }
1972c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1973935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LOperand* context() { return inputs_[0]; }
1974935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LOperand* constructor() { return inputs_[1]; }
197556c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
1976c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_CONCRETE_INSTRUCTION(CallNew, "call-new")
1977c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_HYDROGEN_ACCESSOR(CallNew)
1978c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1979ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) OVERRIDE;
1980c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1981c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  int arity() const { return hydrogen()->argument_count() - 1; }
1982c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org};
1983c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1984c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
1985ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LCallNewArray FINAL : public LTemplateInstruction<1, 2, 0> {
19864a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org public:
1987935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LCallNewArray(LOperand* context, LOperand* constructor) {
1988935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org    inputs_[0] = context;
1989935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org    inputs_[1] = constructor;
19904a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  }
19914a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org
1992935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LOperand* context() { return inputs_[0]; }
1993935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LOperand* constructor() { return inputs_[1]; }
19944a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org
19954a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  DECLARE_CONCRETE_INSTRUCTION(CallNewArray, "call-new-array")
19964a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  DECLARE_HYDROGEN_ACCESSOR(CallNewArray)
19974a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org
1998ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) OVERRIDE;
19994a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org
20004a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  int arity() const { return hydrogen()->argument_count() - 1; }
20014a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org};
20024a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org
20034a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org
2004ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LCallRuntime FINAL : public LTemplateInstruction<1, 1, 0> {
2005c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
2006935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  explicit LCallRuntime(LOperand* context) {
2007935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org    inputs_[0] = context;
2008935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  }
2009935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org
2010935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LOperand* context() { return inputs_[0]; }
2011935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org
2012c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_CONCRETE_INSTRUCTION(CallRuntime, "call-runtime")
2013c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_HYDROGEN_ACCESSOR(CallRuntime)
2014c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
2015ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual bool ClobbersDoubleRegisters(Isolate* isolate) const OVERRIDE {
2016fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org    return save_doubles() == kDontSaveFPRegs;
2017fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  }
2018fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org
2019ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  const Runtime::Function* function() const { return hydrogen()->function(); }
2020c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  int arity() const { return hydrogen()->argument_count(); }
2021fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  SaveFPRegsMode save_doubles() const { return hydrogen()->save_doubles(); }
2022c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org};
2023c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
2024c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
2025ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LInteger32ToDouble FINAL : public LTemplateInstruction<1, 1, 0> {
2026c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
20270511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  explicit LInteger32ToDouble(LOperand* value) {
20280511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com    inputs_[0] = value;
20290511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  }
2030c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
203156c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* value() { return inputs_[0]; }
203256c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
2033c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_CONCRETE_INSTRUCTION(Integer32ToDouble, "int32-to-double")
2034c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org};
2035c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
2036c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
2037ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LUint32ToDouble FINAL : public LTemplateInstruction<1, 1, 0> {
203846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org public:
20397e6132b924829c353864933f29124419916db550machenbach@chromium.org  explicit LUint32ToDouble(LOperand* value) {
204046839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org    inputs_[0] = value;
204146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  }
204246839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org
204356c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* value() { return inputs_[0]; }
204456c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
204546839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  DECLARE_CONCRETE_INSTRUCTION(Uint32ToDouble, "uint32-to-double")
204646839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org};
204746839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org
204846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org
2049ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LNumberTagI FINAL : public LTemplateInstruction<1, 1, 2> {
2050c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
2051e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org  LNumberTagI(LOperand* value, LOperand* temp1, LOperand* temp2) {
20520511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com    inputs_[0] = value;
2053e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org    temps_[0] = temp1;
2054e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org    temps_[1] = temp2;
20550511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  }
2056c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
205756c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* value() { return inputs_[0]; }
2058e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org  LOperand* temp1() { return temps_[0]; }
2059e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org  LOperand* temp2() { return temps_[1]; }
206056c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
2061c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_CONCRETE_INSTRUCTION(NumberTagI, "number-tag-i")
2062c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org};
2063c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
2064c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
2065ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LNumberTagU FINAL : public LTemplateInstruction<1, 1, 2> {
206646839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org public:
2067bc176057ae476990672de915df235c9aeadc8521titzer@chromium.org  LNumberTagU(LOperand* value, LOperand* temp1, LOperand* temp2) {
206846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org    inputs_[0] = value;
2069bc176057ae476990672de915df235c9aeadc8521titzer@chromium.org    temps_[0] = temp1;
2070bc176057ae476990672de915df235c9aeadc8521titzer@chromium.org    temps_[1] = temp2;
207146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  }
207246839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org
207356c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* value() { return inputs_[0]; }
2074bc176057ae476990672de915df235c9aeadc8521titzer@chromium.org  LOperand* temp1() { return temps_[0]; }
2075bc176057ae476990672de915df235c9aeadc8521titzer@chromium.org  LOperand* temp2() { return temps_[1]; }
207656c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
207746839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  DECLARE_CONCRETE_INSTRUCTION(NumberTagU, "number-tag-u")
207846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org};
207946839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org
208046839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org
2081ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LNumberTagD FINAL : public LTemplateInstruction<1, 1, 1> {
2082c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
20830511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  explicit LNumberTagD(LOperand* value, LOperand* temp) {
20840511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com    inputs_[0] = value;
20850511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com    temps_[0] = temp;
20860511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  }
2087c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
208856c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* value() { return inputs_[0]; }
208956c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* temp() { return temps_[0]; }
209056c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
2091c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_CONCRETE_INSTRUCTION(NumberTagD, "number-tag-d")
209294b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org  DECLARE_HYDROGEN_ACCESSOR(Change)
2093a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org};
2094a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2095a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2096c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org// Sometimes truncating conversion from a tagged value to an int32.
2097ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LDoubleToI FINAL : public LTemplateInstruction<1, 1, 0> {
2098a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org public:
20993a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  explicit LDoubleToI(LOperand* value) {
21000511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com    inputs_[0] = value;
21010511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  }
2102a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
210356c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* value() { return inputs_[0]; }
210456c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
2105c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_CONCRETE_INSTRUCTION(DoubleToI, "double-to-i")
2106c54d36599f1e72bddd09d5b7a980304c7b638048ricow@chromium.org  DECLARE_HYDROGEN_ACCESSOR(UnaryOperation)
2107a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2108c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  bool truncating() { return hydrogen()->CanTruncateToInt32(); }
2109a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org};
2110a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2111a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2112ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LDoubleToSmi FINAL : public LTemplateInstruction<1, 1, 0> {
2113a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org public:
2114a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  explicit LDoubleToSmi(LOperand* value) {
2115a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org    inputs_[0] = value;
2116a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  }
2117a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org
2118a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  LOperand* value() { return inputs_[0]; }
2119a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org
2120a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  DECLARE_CONCRETE_INSTRUCTION(DoubleToSmi, "double-to-smi")
2121a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  DECLARE_HYDROGEN_ACCESSOR(UnaryOperation)
2122a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org};
2123a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org
2124a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org
2125c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org// Truncating conversion from a tagged value to an int32.
2126ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LTaggedToI FINAL : public LTemplateInstruction<1, 1, 1> {
2127a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org public:
21280511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  LTaggedToI(LOperand* value, LOperand* temp) {
21290511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com    inputs_[0] = value;
21300511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com    temps_[0] = temp;
21310511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  }
2132a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
213356c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* value() { return inputs_[0]; }
213456c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* temp() { return temps_[0]; }
213556c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
2136c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_CONCRETE_INSTRUCTION(TaggedToI, "tagged-to-i")
2137528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(Change)
2138a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2139c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  bool truncating() { return hydrogen()->CanTruncateToInt32(); }
2140c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org};
2141c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
2142c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
2143ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LSmiTag FINAL : public LTemplateInstruction<1, 1, 0> {
2144c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
21450511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  explicit LSmiTag(LOperand* value) {
21460511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com    inputs_[0] = value;
21470511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  }
2148c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
214956c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* value() { return inputs_[0]; }
215056c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
2151c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_CONCRETE_INSTRUCTION(SmiTag, "smi-tag")
2152381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(Change)
2153c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org};
2154c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
2155c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
2156ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LNumberUntagD FINAL : public LTemplateInstruction<1, 1, 0> {
2157c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
21580511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  explicit LNumberUntagD(LOperand* value) {
21590511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com    inputs_[0] = value;
21600511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  }
2161c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
216256c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* value() { return inputs_[0]; }
216356c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
2164c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_CONCRETE_INSTRUCTION(NumberUntagD, "double-untag")
21656d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org  DECLARE_HYDROGEN_ACCESSOR(Change);
2166c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org};
2167c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
2168c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
2169ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LSmiUntag FINAL : public LTemplateInstruction<1, 1, 0> {
2170c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
21710511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  LSmiUntag(LOperand* value, bool needs_check)
21720511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com      : needs_check_(needs_check) {
21730511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com    inputs_[0] = value;
21740511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  }
2175c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
217656c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* value() { return inputs_[0]; }
2177c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  bool needs_check() const { return needs_check_; }
2178c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
217956c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  DECLARE_CONCRETE_INSTRUCTION(SmiUntag, "smi-untag")
218056c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
2181c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org private:
2182c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  bool needs_check_;
2183c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org};
2184c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
2185c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
2186ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LStoreNamedField FINAL : public LTemplateInstruction<0, 2, 1> {
2187c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
21883a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  LStoreNamedField(LOperand* object, LOperand* value, LOperand* temp) {
21893a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org    inputs_[0] = object;
21903a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org    inputs_[1] = value;
21913a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org    temps_[0] = temp;
2192a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
2193a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
219456c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* object() { return inputs_[0]; }
219556c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* value() { return inputs_[1]; }
219656c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* temp() { return temps_[0]; }
219756c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
21983a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  DECLARE_CONCRETE_INSTRUCTION(StoreNamedField, "store-named-field")
21993a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  DECLARE_HYDROGEN_ACCESSOR(StoreNamedField)
2200c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
2201ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) OVERRIDE;
2202c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
2203f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  Representation representation() const {
2204f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org    return hydrogen()->field_representation();
2205f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  }
2206c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org};
2207c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
2208c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
2209ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LStoreNamedGeneric FINAL : public LTemplateInstruction<0, 3, 0> {
2210c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
2211935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LStoreNamedGeneric(LOperand* context, LOperand* object, LOperand* value) {
2212935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org    inputs_[0] = context;
2213935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org    inputs_[1] = object;
2214935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org    inputs_[2] = value;
22153a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  }
2216c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
2217935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LOperand* context() { return inputs_[0]; }
2218935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LOperand* object() { return inputs_[1]; }
2219935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LOperand* value() { return inputs_[2]; }
222056c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
2221c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_CONCRETE_INSTRUCTION(StoreNamedGeneric, "store-named-generic")
2222c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_HYDROGEN_ACCESSOR(StoreNamedGeneric)
22233a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
2224ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) OVERRIDE;
22253a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
22263a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  Handle<Object> name() const { return hydrogen()->name(); }
2227486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  StrictMode strict_mode() { return hydrogen()->strict_mode(); }
2228c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org};
2229c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
2230c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
2231ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LStoreKeyed FINAL : public LTemplateInstruction<0, 3, 0> {
2232c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
2233e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  LStoreKeyed(LOperand* object, LOperand* key, LOperand* value) {
223456c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org    inputs_[0] = object;
22350511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com    inputs_[1] = key;
223656c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org    inputs_[2] = value;
2237a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
2238d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
2239e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  bool is_external() const { return hydrogen()->is_external(); }
22405c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org  bool is_fixed_typed_array() const {
22415c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org    return hydrogen()->is_fixed_typed_array();
22425c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org  }
22435c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org  bool is_typed_elements() const {
22445c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org    return is_external() || is_fixed_typed_array();
22455c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org  }
224656c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* elements() { return inputs_[0]; }
224756c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* key() { return inputs_[1]; }
224856c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* value() { return inputs_[2]; }
2249e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  ElementsKind elements_kind() const { return hydrogen()->elements_kind(); }
225056c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
2251e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  DECLARE_CONCRETE_INSTRUCTION(StoreKeyed, "store-keyed")
2252e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  DECLARE_HYDROGEN_ACCESSOR(StoreKeyed)
2253717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org
2254ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) OVERRIDE;
225528faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org  bool NeedsCanonicalization() { return hydrogen()->NeedsCanonicalization(); }
2256fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org  uint32_t base_offset() const { return hydrogen()->base_offset(); }
2257717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org};
2258717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org
2259717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org
2260ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LStoreKeyedGeneric FINAL : public LTemplateInstruction<0, 4, 0> {
2261c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
2262935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LStoreKeyedGeneric(LOperand* context,
2263935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org                     LOperand* object,
2264935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org                     LOperand* key,
2265935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org                     LOperand* value) {
2266935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org    inputs_[0] = context;
2267935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org    inputs_[1] = object;
2268935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org    inputs_[2] = key;
2269935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org    inputs_[3] = value;
22703a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  }
2271c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
2272935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LOperand* context() { return inputs_[0]; }
2273935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LOperand* object() { return inputs_[1]; }
2274935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LOperand* key() { return inputs_[2]; }
2275935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LOperand* value() { return inputs_[3]; }
227656c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
2277c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_CONCRETE_INSTRUCTION(StoreKeyedGeneric, "store-keyed-generic")
227844bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org  DECLARE_HYDROGEN_ACCESSOR(StoreKeyedGeneric)
22793a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
2280ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) OVERRIDE;
22813a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
2282486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  StrictMode strict_mode() { return hydrogen()->strict_mode(); }
22833a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org};
22843a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
22853a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
2286ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LTransitionElementsKind FINAL : public LTemplateInstruction<0, 2, 2> {
2287394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com public:
2288394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  LTransitionElementsKind(LOperand* object,
2289935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org                          LOperand* context,
2290394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com                          LOperand* new_map_temp,
229156c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org                          LOperand* temp) {
2292394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com    inputs_[0] = object;
2293935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org    inputs_[1] = context;
2294394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com    temps_[0] = new_map_temp;
229556c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org    temps_[1] = temp;
2296394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  }
2297394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com
229856c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* object() { return inputs_[0]; }
2299935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LOperand* context() { return inputs_[1]; }
230056c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* new_map_temp() { return temps_[0]; }
230156c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* temp() { return temps_[1]; }
230256c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
2303394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  DECLARE_CONCRETE_INSTRUCTION(TransitionElementsKind,
2304394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com                               "transition-elements-kind")
2305394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  DECLARE_HYDROGEN_ACCESSOR(TransitionElementsKind)
2306394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com
2307ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) OVERRIDE;
2308394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com
2309528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Handle<Map> original_map() { return hydrogen()->original_map().handle(); }
2310528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Handle<Map> transitioned_map() {
2311528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    return hydrogen()->transitioned_map().handle();
2312528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  }
2313003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org  ElementsKind from_kind() { return hydrogen()->from_kind(); }
2314003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org  ElementsKind to_kind() { return hydrogen()->to_kind(); }
2315394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com};
2316394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com
2317394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com
2318ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LTrapAllocationMemento FINAL : public LTemplateInstruction<0, 1, 1> {
231994b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org public:
232094b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org  LTrapAllocationMemento(LOperand* object,
232194b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org                         LOperand* temp) {
232294b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org    inputs_[0] = object;
232394b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org    temps_[0] = temp;
232494b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org  }
232594b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org
232694b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org  LOperand* object() { return inputs_[0]; }
232794b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org  LOperand* temp() { return temps_[0]; }
232894b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org
232994b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org  DECLARE_CONCRETE_INSTRUCTION(TrapAllocationMemento,
233094b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org                               "trap-allocation-memento")
233194b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org};
233294b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org
233394b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org
2334ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LStringAdd FINAL : public LTemplateInstruction<1, 3, 0> {
2335160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org public:
2336935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LStringAdd(LOperand* context, LOperand* left, LOperand* right) {
2337935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org    inputs_[0] = context;
2338935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org    inputs_[1] = left;
2339935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org    inputs_[2] = right;
2340160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org  }
2341160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org
2342935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LOperand* context() { return inputs_[0]; }
2343935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LOperand* left() { return inputs_[1]; }
2344935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LOperand* right() { return inputs_[2]; }
234556c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
234656c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  DECLARE_CONCRETE_INSTRUCTION(StringAdd, "string-add")
234756c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  DECLARE_HYDROGEN_ACCESSOR(StringAdd)
2348160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org};
2349160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org
2350160a7b0747492f3f735353d9582521f3314bf4dfdanno@chromium.org
2351ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LStringCharCodeAt FINAL : public LTemplateInstruction<1, 3, 0> {
23523a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org public:
2353935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LStringCharCodeAt(LOperand* context, LOperand* string, LOperand* index) {
2354935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org    inputs_[0] = context;
2355935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org    inputs_[1] = string;
2356935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org    inputs_[2] = index;
23573a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  }
23583a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
2359935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LOperand* context() { return inputs_[0]; }
2360935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LOperand* string() { return inputs_[1]; }
2361935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LOperand* index() { return inputs_[2]; }
236256c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
236356c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  DECLARE_CONCRETE_INSTRUCTION(StringCharCodeAt, "string-char-code-at")
236456c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  DECLARE_HYDROGEN_ACCESSOR(StringCharCodeAt)
2365c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org};
2366c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
2367c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
2368ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LStringCharFromCode FINAL : public LTemplateInstruction<1, 2, 0> {
2369b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org public:
2370935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  explicit LStringCharFromCode(LOperand* context, LOperand* char_code) {
2371935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org    inputs_[0] = context;
2372935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org    inputs_[1] = char_code;
2373b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org  }
2374b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org
2375935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LOperand* context() { return inputs_[0]; }
2376935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LOperand* char_code() { return inputs_[1]; }
237756c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
2378b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org  DECLARE_CONCRETE_INSTRUCTION(StringCharFromCode, "string-char-from-code")
2379b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org  DECLARE_HYDROGEN_ACCESSOR(StringCharFromCode)
2380b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org};
2381b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org
2382b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org
2383ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LCheckValue FINAL : public LTemplateInstruction<0, 1, 0> {
2384c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
23851f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org  explicit LCheckValue(LOperand* value) {
23860511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com    inputs_[0] = value;
23870511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  }
2388c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
238956c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* value() { return inputs_[0]; }
239064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org
23911f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org  DECLARE_CONCRETE_INSTRUCTION(CheckValue, "check-value")
23921f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org  DECLARE_HYDROGEN_ACCESSOR(CheckValue)
2393c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org};
2394c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
2395c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
2396ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LCheckInstanceType FINAL : public LTemplateInstruction<0, 1, 0> {
2397c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
239883aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org  explicit LCheckInstanceType(LOperand* value) {
23990511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com    inputs_[0] = value;
24000511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  }
2401c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
240256c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* value() { return inputs_[0]; }
240356c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
2404c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_CONCRETE_INSTRUCTION(CheckInstanceType, "check-instance-type")
2405c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_HYDROGEN_ACCESSOR(CheckInstanceType)
2406a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org};
2407a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2408a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2409ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LCheckMaps FINAL : public LTemplateInstruction<0, 1, 0> {
2410a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org public:
2411af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org  explicit LCheckMaps(LOperand* value = NULL) {
24120511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com    inputs_[0] = value;
24130511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  }
2414c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
241556c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* value() { return inputs_[0]; }
241656c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
24171456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(CheckMaps, "check-maps")
24181456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org  DECLARE_HYDROGEN_ACCESSOR(CheckMaps)
2419c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org};
2420c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
2421c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
2422ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LCheckSmi FINAL : public LTemplateInstruction<1, 1, 0> {
2423a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org public:
2424badaffc570baec00166b0ad3bdc96995751a7e13ricow@chromium.org  explicit LCheckSmi(LOperand* value) {
24250511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com    inputs_[0] = value;
24260511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  }
2427a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
242856c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* value() { return inputs_[0]; }
242956c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
2430badaffc570baec00166b0ad3bdc96995751a7e13ricow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(CheckSmi, "check-smi")
2431badaffc570baec00166b0ad3bdc96995751a7e13ricow@chromium.org};
2432badaffc570baec00166b0ad3bdc96995751a7e13ricow@chromium.org
2433a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2434ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LClampDToUint8 FINAL : public LTemplateInstruction<1, 1, 0> {
2435c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org public:
243689e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org  explicit LClampDToUint8(LOperand* unclamped) {
243756c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org    inputs_[0] = unclamped;
2438c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org  }
2439c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org
2440c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org  LOperand* unclamped() { return inputs_[0]; }
2441c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org
2442c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org  DECLARE_CONCRETE_INSTRUCTION(ClampDToUint8, "clamp-d-to-uint8")
2443c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org};
2444c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org
2445c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org
2446ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LClampIToUint8 FINAL : public LTemplateInstruction<1, 1, 0> {
2447c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org public:
244856c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  explicit LClampIToUint8(LOperand* unclamped) {
244956c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org    inputs_[0] = unclamped;
2450c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org  }
2451c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org
2452c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org  LOperand* unclamped() { return inputs_[0]; }
2453c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org
2454c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org  DECLARE_CONCRETE_INSTRUCTION(ClampIToUint8, "clamp-i-to-uint8")
2455c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org};
2456c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org
2457c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org
2458ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LClampTToUint8 FINAL : public LTemplateInstruction<1, 1, 1> {
2459c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org public:
246056c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LClampTToUint8(LOperand* unclamped,
246189e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org                 LOperand* temp_xmm) {
246256c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org    inputs_[0] = unclamped;
246389e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org    temps_[0] = temp_xmm;
2464c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org  }
2465c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org
2466c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org  LOperand* unclamped() { return inputs_[0]; }
246789e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org  LOperand* temp_xmm() { return temps_[0]; }
2468c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org
2469c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org  DECLARE_CONCRETE_INSTRUCTION(ClampTToUint8, "clamp-t-to-uint8")
2470c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org};
2471c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org
2472c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org
2473ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LCheckNonSmi FINAL : public LTemplateInstruction<0, 1, 0> {
2474badaffc570baec00166b0ad3bdc96995751a7e13ricow@chromium.org public:
2475badaffc570baec00166b0ad3bdc96995751a7e13ricow@chromium.org  explicit LCheckNonSmi(LOperand* value) {
2476badaffc570baec00166b0ad3bdc96995751a7e13ricow@chromium.org    inputs_[0] = value;
2477a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
2478d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
247956c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* value() { return inputs_[0]; }
248056c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
2481badaffc570baec00166b0ad3bdc96995751a7e13ricow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(CheckNonSmi, "check-non-smi")
24821510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  DECLARE_HYDROGEN_ACCESSOR(CheckHeapObject)
24831510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org};
24841510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
24851510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
2486ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LDoubleBits FINAL : public LTemplateInstruction<1, 1, 0> {
2487ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org public:
2488ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  explicit LDoubleBits(LOperand* value) {
2489ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org    inputs_[0] = value;
2490ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  }
2491ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
2492ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  LOperand* value() { return inputs_[0]; }
2493ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
2494ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(DoubleBits, "double-bits")
2495ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(DoubleBits)
2496ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org};
2497ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
2498ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
2499ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LConstructDouble FINAL : public LTemplateInstruction<1, 2, 0> {
2500ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org public:
2501ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  LConstructDouble(LOperand* hi, LOperand* lo) {
2502ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org    inputs_[0] = hi;
2503ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org    inputs_[1] = lo;
2504ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  }
2505ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
2506ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  LOperand* hi() { return inputs_[0]; }
2507ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  LOperand* lo() { return inputs_[1]; }
2508ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
2509ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(ConstructDouble, "construct-double")
2510ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org};
2511ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
2512ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
2513ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LAllocate FINAL : public LTemplateInstruction<1, 2, 1> {
251494b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org public:
2515935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LAllocate(LOperand* context, LOperand* size, LOperand* temp) {
2516935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org    inputs_[0] = context;
2517935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org    inputs_[1] = size;
251894b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org    temps_[0] = temp;
251994b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org  }
252094b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org
2521935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LOperand* context() { return inputs_[0]; }
2522935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LOperand* size() { return inputs_[1]; }
252394b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org  LOperand* temp() { return temps_[0]; }
252494b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org
252594b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org  DECLARE_CONCRETE_INSTRUCTION(Allocate, "allocate")
252694b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org  DECLARE_HYDROGEN_ACCESSOR(Allocate)
252794b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org};
252894b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org
252994b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org
2530ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LRegExpLiteral FINAL : public LTemplateInstruction<1, 1, 0> {
2531c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
2532935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  explicit LRegExpLiteral(LOperand* context) {
2533935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org    inputs_[0] = context;
2534935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  }
2535935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org
2536935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LOperand* context() { return inputs_[0]; }
2537935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org
2538c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_CONCRETE_INSTRUCTION(RegExpLiteral, "regexp-literal")
2539c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_HYDROGEN_ACCESSOR(RegExpLiteral)
2540c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org};
2541c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
2542c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
2543ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LFunctionLiteral FINAL : public LTemplateInstruction<1, 1, 0> {
2544c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
2545935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  explicit LFunctionLiteral(LOperand* context) {
2546935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org    inputs_[0] = context;
2547935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  }
2548935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org
2549935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LOperand* context() { return inputs_[0]; }
2550935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org
2551c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_CONCRETE_INSTRUCTION(FunctionLiteral, "function-literal")
2552c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_HYDROGEN_ACCESSOR(FunctionLiteral)
2553c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org};
2554c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
2555c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
2556ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LToFastProperties FINAL : public LTemplateInstruction<1, 1, 0> {
2557ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org public:
2558ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  explicit LToFastProperties(LOperand* value) {
2559ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    inputs_[0] = value;
2560ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  }
2561ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
256256c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* value() { return inputs_[0]; }
256356c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
2564ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  DECLARE_CONCRETE_INSTRUCTION(ToFastProperties, "to-fast-properties")
2565ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  DECLARE_HYDROGEN_ACCESSOR(ToFastProperties)
2566ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org};
2567ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
2568ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
2569ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LTypeof FINAL : public LTemplateInstruction<1, 2, 0> {
2570c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
2571935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LTypeof(LOperand* context, LOperand* value) {
2572935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org    inputs_[0] = context;
2573935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org    inputs_[1] = value;
25740511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  }
2575c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
2576935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LOperand* context() { return inputs_[0]; }
2577935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LOperand* value() { return inputs_[1]; }
257856c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
2579c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_CONCRETE_INSTRUCTION(Typeof, "typeof")
2580c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org};
2581c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
2582c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
2583ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LTypeofIsAndBranch FINAL : public LControlInstruction<1, 0> {
2584c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
25850511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  explicit LTypeofIsAndBranch(LOperand* value) {
25860511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com    inputs_[0] = value;
25870511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  }
2588c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
258956c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* value() { return inputs_[0]; }
259056c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
2591c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_CONCRETE_INSTRUCTION(TypeofIsAndBranch, "typeof-is-and-branch")
25924f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org  DECLARE_HYDROGEN_ACCESSOR(TypeofIsAndBranch)
2593c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
25940511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  Handle<String> type_literal() { return hydrogen()->type_literal(); }
2595d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
2596ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) OVERRIDE;
2597c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org};
2598c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
2599c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
2600ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LIsConstructCallAndBranch FINAL : public LControlInstruction<0, 1> {
2601d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com public:
2602d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com  explicit LIsConstructCallAndBranch(LOperand* temp) {
2603d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com    temps_[0] = temp;
2604d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com  }
2605d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com
260656c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  LOperand* temp() { return temps_[0]; }
260756c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
2608d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com  DECLARE_CONCRETE_INSTRUCTION(IsConstructCallAndBranch,
2609d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com                               "is-construct-call-and-branch")
26104f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org  DECLARE_HYDROGEN_ACCESSOR(IsConstructCallAndBranch)
2611d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com};
2612d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com
2613d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com
2614ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LOsrEntry FINAL : public LTemplateInstruction<0, 0, 0> {
2615c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
26161510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  LOsrEntry() {}
2617c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
2618ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual bool HasInterestingComment(LCodeGen* gen) const OVERRIDE {
261932cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org    return false;
262032cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org  }
2621c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_CONCRETE_INSTRUCTION(OsrEntry, "osr-entry")
2622c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org};
2623d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
2624d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
2625ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LStackCheck FINAL : public LTemplateInstruction<0, 1, 0> {
2626c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public:
2627935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  explicit LStackCheck(LOperand* context) {
2628935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org    inputs_[0] = context;
2629935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  }
2630935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org
2631935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LOperand* context() { return inputs_[0]; }
2632935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org
2633c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  DECLARE_CONCRETE_INSTRUCTION(StackCheck, "stack-check")
263404921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org  DECLARE_HYDROGEN_ACCESSOR(StackCheck)
263504921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org
263604921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org  Label* done_label() { return &done_label_; }
263704921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org
263804921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org private:
263904921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org  Label done_label_;
2640d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org};
2641d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
2642d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
2643ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LForInPrepareMap FINAL : public LTemplateInstruction<1, 2, 0> {
2644be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org public:
2645935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LForInPrepareMap(LOperand* context, LOperand* object) {
2646935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org    inputs_[0] = context;
2647935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org    inputs_[1] = object;
2648be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org  }
2649be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org
2650935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LOperand* context() { return inputs_[0]; }
2651935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  LOperand* object() { return inputs_[1]; }
2652be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org
2653be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org  DECLARE_CONCRETE_INSTRUCTION(ForInPrepareMap, "for-in-prepare-map")
2654be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org};
2655be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org
2656be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org
2657ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LForInCacheArray FINAL : public LTemplateInstruction<1, 1, 0> {
2658be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org public:
2659be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org  explicit LForInCacheArray(LOperand* map) {
2660be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org    inputs_[0] = map;
2661be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org  }
2662be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org
2663be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org  LOperand* map() { return inputs_[0]; }
2664be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org
2665be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org  DECLARE_CONCRETE_INSTRUCTION(ForInCacheArray, "for-in-cache-array")
2666be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org
2667be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org  int idx() {
2668be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org    return HForInCacheArray::cast(this->hydrogen_value())->idx();
2669be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org  }
2670be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org};
2671be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org
2672be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org
2673ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LCheckMapValue FINAL : public LTemplateInstruction<0, 2, 0> {
2674be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org public:
2675be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org  LCheckMapValue(LOperand* value, LOperand* map) {
2676be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org    inputs_[0] = value;
2677be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org    inputs_[1] = map;
2678be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org  }
2679be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org
2680be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org  LOperand* value() { return inputs_[0]; }
2681be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org  LOperand* map() { return inputs_[1]; }
2682be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org
2683be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org  DECLARE_CONCRETE_INSTRUCTION(CheckMapValue, "check-map-value")
2684be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org};
2685be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org
2686be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org
2687ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LLoadFieldByIndex FINAL : public LTemplateInstruction<1, 2, 0> {
2688be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org public:
2689be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org  LLoadFieldByIndex(LOperand* object, LOperand* index) {
2690be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org    inputs_[0] = object;
2691be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org    inputs_[1] = index;
2692be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org  }
2693be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org
2694be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org  LOperand* object() { return inputs_[0]; }
2695be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org  LOperand* index() { return inputs_[1]; }
2696be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org
2697be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org  DECLARE_CONCRETE_INSTRUCTION(LoadFieldByIndex, "load-field-by-index")
2698be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org};
2699be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org
2700be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org
27011e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.orgclass LStoreFrameContext: public LTemplateInstruction<0, 1, 0> {
27021e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org public:
27031e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  explicit LStoreFrameContext(LOperand* context) {
27041e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org    inputs_[0] = context;
27051e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  }
27061e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org
27071e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  LOperand* context() { return inputs_[0]; }
27081e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org
27091e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(StoreFrameContext, "store-frame-context")
27101e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org};
27111e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org
27121e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org
27131e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.orgclass LAllocateBlockContext: public LTemplateInstruction<1, 2, 0> {
27141e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org public:
27151e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  LAllocateBlockContext(LOperand* context, LOperand* function) {
27161e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org    inputs_[0] = context;
27171e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org    inputs_[1] = function;
27181e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  }
27191e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org
27201e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  LOperand* context() { return inputs_[0]; }
27211e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  LOperand* function() { return inputs_[1]; }
27221e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org
27231e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  Handle<ScopeInfo> scope_info() { return hydrogen()->scope_info(); }
27241e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org
27251e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(AllocateBlockContext, "allocate-block-context")
27261e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(AllocateBlockContext)
27271e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org};
27281e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org
27291e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org
2730d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.orgclass LChunkBuilder;
2731ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LPlatformChunk FINAL : public LChunk {
2732d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org public:
273328583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org  LPlatformChunk(CompilationInfo* info, HGraph* graph)
2734895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org      : LChunk(info, graph),
2735895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org        dehoisted_key_ids_(graph->GetMaximumValueID(), graph->zone()) { }
2736c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
2737c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  int GetNextSpillIndex(RegisterKind kind);
2738c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  LOperand* GetNextSpillSlot(RegisterKind kind);
2739895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  BitVector* GetDehoistedKeyIds() { return &dehoisted_key_ids_; }
2740895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  bool IsDehoistedKey(HValue* value) {
2741895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org    return dehoisted_key_ids_.Contains(value->id());
2742895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  }
2743895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org
2744895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org private:
2745895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  BitVector dehoisted_key_ids_;
2746a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org};
2747a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2748a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2749ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LChunkBuilder FINAL : public LChunkBuilderBase {
2750a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org public:
27518f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  LChunkBuilder(CompilationInfo* info, HGraph* graph, LAllocator* allocator)
2752b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org      : LChunkBuilderBase(info, graph),
2753d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        current_instruction_(NULL),
2754d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        current_block_(NULL),
2755d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org        next_block_(NULL),
2756b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        allocator_(allocator) {}
2757a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org
2758a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // Build the sequence for the graph.
275928583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org  LPlatformChunk* Build();
2760a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2761a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // Declare methods that deal with the individual node types.
2762c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org#define DECLARE_DO(type) LInstruction* Do##type(H##type* node);
2763a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  HYDROGEN_CONCRETE_INSTRUCTION_LIST(DECLARE_DO)
2764a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org#undef DECLARE_DO
2765a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2766e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  LInstruction* DoMathFloor(HUnaryMathOperation* instr);
2767e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  LInstruction* DoMathRound(HUnaryMathOperation* instr);
2768dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  LInstruction* DoMathFround(HUnaryMathOperation* instr);
2769e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  LInstruction* DoMathAbs(HUnaryMathOperation* instr);
2770e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  LInstruction* DoMathLog(HUnaryMathOperation* instr);
2771e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  LInstruction* DoMathExp(HUnaryMathOperation* instr);
2772e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  LInstruction* DoMathSqrt(HUnaryMathOperation* instr);
2773e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  LInstruction* DoMathPowHalf(HUnaryMathOperation* instr);
2774f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LInstruction* DoMathClz32(HUnaryMathOperation* instr);
2775ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  LInstruction* DoDivByPowerOf2I(HDiv* instr);
2776bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  LInstruction* DoDivByConstI(HDiv* instr);
2777ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org  LInstruction* DoDivI(HDiv* instr);
2778ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  LInstruction* DoModByPowerOf2I(HMod* instr);
2779bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  LInstruction* DoModByConstI(HMod* instr);
2780ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  LInstruction* DoModI(HMod* instr);
2781ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  LInstruction* DoFlooringDivByPowerOf2I(HMathFloorOfDiv* instr);
2782ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  LInstruction* DoFlooringDivByConstI(HMathFloorOfDiv* instr);
2783ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org  LInstruction* DoFlooringDivI(HMathFloorOfDiv* instr);
2784e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
2785d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org private:
2786c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  // Methods for getting operands for Use / Define / Temp.
2787c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  LUnallocated* ToUnallocated(Register reg);
2788c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  LUnallocated* ToUnallocated(XMMRegister reg);
2789c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
2790c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  // Methods for setting up define-use relationships.
27910511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  MUST_USE_RESULT LOperand* Use(HValue* value, LUnallocated* operand);
27920511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  MUST_USE_RESULT LOperand* UseFixed(HValue* value, Register fixed_register);
27930511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  MUST_USE_RESULT LOperand* UseFixedDouble(HValue* value,
27940511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com                                           XMMRegister fixed_register);
2795c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
2796c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  // A value that is guaranteed to be allocated to a register.
2797c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  // Operand created by UseRegister is guaranteed to be live until the end of
2798c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  // instruction. This means that register allocator will not reuse it's
2799c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  // register for any other operand inside instruction.
2800c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  // Operand created by UseRegisterAtStart is guaranteed to be live only at
2801c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  // instruction start. Register allocator is free to assign the same register
2802c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  // to some other operand used inside instruction (i.e. temporary or
2803c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  // output).
28040511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  MUST_USE_RESULT LOperand* UseRegister(HValue* value);
28050511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  MUST_USE_RESULT LOperand* UseRegisterAtStart(HValue* value);
2806c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
28070a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org  // An input operand in a register that may be trashed.
28080511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  MUST_USE_RESULT LOperand* UseTempRegister(HValue* value);
28090511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com
281071ea97f146aa116d61baeba1912b87a60feda71fhpayer@chromium.org  // An input operand in a register that may be trashed or a constant operand.
281171ea97f146aa116d61baeba1912b87a60feda71fhpayer@chromium.org  MUST_USE_RESULT LOperand* UseTempRegisterOrConstant(HValue* value);
281271ea97f146aa116d61baeba1912b87a60feda71fhpayer@chromium.org
28130a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org  // An input operand in a register or stack slot.
28140511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  MUST_USE_RESULT LOperand* Use(HValue* value);
28150511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  MUST_USE_RESULT LOperand* UseAtStart(HValue* value);
28160511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com
28170a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org  // An input operand in a register, stack slot or a constant operand.
28180511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  MUST_USE_RESULT LOperand* UseOrConstant(HValue* value);
28190511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  MUST_USE_RESULT LOperand* UseOrConstantAtStart(HValue* value);
28200511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com
28210a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org  // An input operand in a register or a constant operand.
28220511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  MUST_USE_RESULT LOperand* UseRegisterOrConstant(HValue* value);
28230511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  MUST_USE_RESULT LOperand* UseRegisterOrConstantAtStart(HValue* value);
28240511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com
2825f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  // An input operand in a constant operand.
2826f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  MUST_USE_RESULT LOperand* UseConstant(HValue* value);
2827f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
28280a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org  // An input operand in register, stack slot or a constant operand.
28290a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org  // Will not be moved to a register even if one is freely available.
2830ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual MUST_USE_RESULT LOperand* UseAny(HValue* value) OVERRIDE;
28310a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org
28320511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  // Temporary operand that must be in a register.
28330511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  MUST_USE_RESULT LUnallocated* TempRegister();
28340511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  MUST_USE_RESULT LOperand* FixedTemp(Register reg);
28350511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  MUST_USE_RESULT LOperand* FixedTemp(XMMRegister reg);
28360511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com
2837c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  // Methods for setting up define-use relationships.
2838c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  // Return the same instruction that they are passed.
283926ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  LInstruction* Define(LTemplateResultInstruction<1>* instr,
284026ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org                       LUnallocated* result);
284126ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  LInstruction* DefineAsRegister(LTemplateResultInstruction<1>* instr);
284226ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  LInstruction* DefineAsSpilled(LTemplateResultInstruction<1>* instr,
284326ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org                                int index);
284426ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  LInstruction* DefineSameAsFirst(LTemplateResultInstruction<1>* instr);
284526ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  LInstruction* DefineFixed(LTemplateResultInstruction<1>* instr,
284626ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org                            Register reg);
284726ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  LInstruction* DefineFixedDouble(LTemplateResultInstruction<1>* instr,
284826ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org                                  XMMRegister reg);
2849b645116853c677aca8a316381b87441ba6004f67danno@chromium.org  // Assigns an environment to an instruction.  An instruction which can
2850b645116853c677aca8a316381b87441ba6004f67danno@chromium.org  // deoptimize must have an environment.
2851c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  LInstruction* AssignEnvironment(LInstruction* instr);
2852b645116853c677aca8a316381b87441ba6004f67danno@chromium.org  // Assigns a pointer map to an instruction.  An instruction which can
2853b645116853c677aca8a316381b87441ba6004f67danno@chromium.org  // trigger a GC or a lazy deoptimization must have a pointer map.
2854c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  LInstruction* AssignPointerMap(LInstruction* instr);
2855c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
2856c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  enum CanDeoptimize { CAN_DEOPTIMIZE_EAGERLY, CANNOT_DEOPTIMIZE_EAGERLY };
2857c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
2858b645116853c677aca8a316381b87441ba6004f67danno@chromium.org  // Marks a call for the register allocator.  Assigns a pointer map to
2859b645116853c677aca8a316381b87441ba6004f67danno@chromium.org  // support GC and lazy deoptimization.  Assigns an environment to support
2860b645116853c677aca8a316381b87441ba6004f67danno@chromium.org  // eager deoptimization if CAN_DEOPTIMIZE_EAGERLY.
2861c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  LInstruction* MarkAsCall(
2862c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org      LInstruction* instr,
2863c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org      HInstruction* hinstr,
2864c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org      CanDeoptimize can_deoptimize = CANNOT_DEOPTIMIZE_EAGERLY);
2865c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
2866c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  void VisitInstruction(HInstruction* current);
2867011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  void AddInstruction(LInstruction* instr, HInstruction* current);
2868c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
2869d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  void DoBasicBlock(HBasicBlock* block, HBasicBlock* next_block);
2870c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  LInstruction* DoShift(Token::Value op, HBitwiseBinaryOperation* instr);
2871c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  LInstruction* DoArithmeticD(Token::Value op,
2872c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org                              HArithmeticBinaryOperation* instr);
2873c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  LInstruction* DoArithmeticT(Token::Value op,
2874528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org                              HBinaryOperation* instr);
2875895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  void FindDehoistedKeyDefinitions(HValue* candidate);
2876d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
2877d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  HInstruction* current_instruction_;
2878d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  HBasicBlock* current_block_;
2879d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  HBasicBlock* next_block_;
2880d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org  LAllocator* allocator_;
2881d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
2882a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  DISALLOW_COPY_AND_ASSIGN(LChunkBuilder);
2883a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org};
2884a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2885c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org#undef DECLARE_HYDROGEN_ACCESSOR
2886c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org#undef DECLARE_CONCRETE_INSTRUCTION
2887a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
28880511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com} }  // namespace v8::int
2889a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2890a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org#endif  // V8_X64_LITHIUM_X64_H_
2891