1864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// Copyright 2012 the V8 project authors. All rights reserved.
2864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// Use of this source code is governed by a BSD-style license that can be
3864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// found in the LICENSE file.
4864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
5864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org#ifndef V8_X87_LITHIUM_X87_H_
6864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org#define V8_X87_LITHIUM_X87_H_
7864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
8196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/hydrogen.h"
9196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/lithium-allocator.h"
10196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/lithium.h"
11196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/safepoint-table.h"
12196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/utils.h"
13864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
14864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgnamespace v8 {
15864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgnamespace internal {
16864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
17864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// Forward declarations.
18864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LCodeGen;
19864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
20864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org#define LITHIUM_CONCRETE_INSTRUCTION_LIST(V)    \
21864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(AccessArgumentsAt)                          \
22864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(AddI)                                       \
23e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org  V(AllocateBlockContext)                       \
24864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(Allocate)                                   \
25864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(ApplyArguments)                             \
26864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(ArgumentsElements)                          \
27864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(ArgumentsLength)                            \
28864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(ArithmeticD)                                \
29864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(ArithmeticT)                                \
30864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(BitI)                                       \
31864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(BoundsCheck)                                \
32864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(Branch)                                     \
33864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(CallJSFunction)                             \
34864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(CallWithDescriptor)                         \
35864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(CallFunction)                               \
36864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(CallNew)                                    \
37864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(CallNewArray)                               \
38864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(CallRuntime)                                \
39864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(CallStub)                                   \
40864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(CheckInstanceType)                          \
41864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(CheckMaps)                                  \
42864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(CheckMapValue)                              \
43864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(CheckNonSmi)                                \
44864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(CheckSmi)                                   \
45864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(CheckValue)                                 \
46864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(ClampDToUint8)                              \
47864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(ClampIToUint8)                              \
48864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(ClampTToUint8NoSSE2)                        \
49864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(ClassOfTestAndBranch)                       \
50864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(ClobberDoubles)                             \
51864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(CompareMinusZeroAndBranch)                  \
52864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(CompareNumericAndBranch)                    \
53864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(CmpObjectEqAndBranch)                       \
54864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(CmpHoleAndBranch)                           \
55864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(CmpMapAndBranch)                            \
56864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(CmpT)                                       \
57864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(ConstantD)                                  \
58864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(ConstantE)                                  \
59864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(ConstantI)                                  \
60864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(ConstantS)                                  \
61864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(ConstantT)                                  \
62864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(ConstructDouble)                            \
63864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(Context)                                    \
64864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(DateField)                                  \
65864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(DebugBreak)                                 \
66864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(DeclareGlobals)                             \
67864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(Deoptimize)                                 \
68864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(DivByConstI)                                \
69864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(DivByPowerOf2I)                             \
70864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(DivI)                                       \
71864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(DoubleBits)                                 \
72864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(DoubleToI)                                  \
73864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(DoubleToSmi)                                \
74864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(Drop)                                       \
75864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(Dummy)                                      \
76864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(DummyUse)                                   \
77864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(FlooringDivByConstI)                        \
78864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(FlooringDivByPowerOf2I)                     \
79864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(FlooringDivI)                               \
80864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(ForInCacheArray)                            \
81864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(ForInPrepareMap)                            \
82864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(FunctionLiteral)                            \
83864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(GetCachedArrayIndex)                        \
84864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(Goto)                                       \
85864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(HasCachedArrayIndexAndBranch)               \
86864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(HasInstanceTypeAndBranch)                   \
87864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(InnerAllocatedObject)                       \
88864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(InstanceOf)                                 \
89864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(InstanceOfKnownGlobal)                      \
90864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(InstructionGap)                             \
91864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(Integer32ToDouble)                          \
92864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(InvokeFunction)                             \
93864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(IsConstructCallAndBranch)                   \
94864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(IsObjectAndBranch)                          \
95864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(IsStringAndBranch)                          \
96864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(IsSmiAndBranch)                             \
97864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(IsUndetectableAndBranch)                    \
98864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(Label)                                      \
99864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(LazyBailout)                                \
100864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(LoadContextSlot)                            \
101864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(LoadFieldByIndex)                           \
102864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(LoadFunctionPrototype)                      \
103864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(LoadGlobalCell)                             \
104864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(LoadGlobalGeneric)                          \
105864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(LoadKeyed)                                  \
106864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(LoadKeyedGeneric)                           \
107864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(LoadNamedField)                             \
108864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(LoadNamedGeneric)                           \
109864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(LoadRoot)                                   \
110864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(MapEnumLength)                              \
111864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(MathAbs)                                    \
112864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(MathClz32)                                  \
113864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(MathExp)                                    \
114864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(MathFloor)                                  \
115864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(MathLog)                                    \
116864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(MathMinMax)                                 \
117864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(MathPowHalf)                                \
118864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(MathRound)                                  \
119864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(MathSqrt)                                   \
120864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(ModByConstI)                                \
121864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(ModByPowerOf2I)                             \
122864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(ModI)                                       \
123864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(MulI)                                       \
124864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(NumberTagD)                                 \
125864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(NumberTagI)                                 \
126864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(NumberTagU)                                 \
127864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(NumberUntagD)                               \
128864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(OsrEntry)                                   \
129864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(Parameter)                                  \
130864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(Power)                                      \
131864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(PushArgument)                               \
132864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(RegExpLiteral)                              \
133864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(Return)                                     \
134864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(SeqStringGetChar)                           \
135864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(SeqStringSetChar)                           \
136864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(ShiftI)                                     \
137864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(SmiTag)                                     \
138864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(SmiUntag)                                   \
139864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(StackCheck)                                 \
140864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(StoreCodeEntry)                             \
141864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(StoreContextSlot)                           \
142e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org  V(StoreFrameContext)                          \
143864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(StoreGlobalCell)                            \
144864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(StoreKeyed)                                 \
145864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(StoreKeyedGeneric)                          \
146864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(StoreNamedField)                            \
147864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(StoreNamedGeneric)                          \
148864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(StringAdd)                                  \
149864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(StringCharCodeAt)                           \
150864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(StringCharFromCode)                         \
151864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(StringCompareAndBranch)                     \
152864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(SubI)                                       \
153864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(TaggedToI)                                  \
154864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(ThisFunction)                               \
155864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(ToFastProperties)                           \
156864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(TransitionElementsKind)                     \
157864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(TrapAllocationMemento)                      \
158864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(Typeof)                                     \
159864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(TypeofIsAndBranch)                          \
160864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(Uint32ToDouble)                             \
161864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(UnknownOSRValue)                            \
162864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  V(WrapReceiver)
163864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
164864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
165864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org#define DECLARE_CONCRETE_INSTRUCTION(type, mnemonic)                        \
166864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual Opcode opcode() const V8_FINAL V8_OVERRIDE {                      \
167864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    return LInstruction::k##type;                                           \
168864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }                                                                         \
169864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual void CompileToNative(LCodeGen* generator) V8_FINAL V8_OVERRIDE;   \
170864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual const char* Mnemonic() const V8_FINAL V8_OVERRIDE {               \
171864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    return mnemonic;                                                        \
172864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }                                                                         \
173864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  static L##type* cast(LInstruction* instr) {                               \
174864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    ASSERT(instr->Is##type());                                              \
175864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    return reinterpret_cast<L##type*>(instr);                               \
176864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
177864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
178864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
179864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org#define DECLARE_HYDROGEN_ACCESSOR(type)     \
180864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  H##type* hydrogen() const {               \
181864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    return H##type::cast(hydrogen_value()); \
182864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
183864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
184864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
185864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LInstruction : public ZoneObject {
186864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
187864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LInstruction()
188864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org      : environment_(NULL),
189864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org        hydrogen_value_(NULL),
190864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org        bit_field_(IsCallBits::encode(false)) {
191864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
192864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
193864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual ~LInstruction() {}
194864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
195864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual void CompileToNative(LCodeGen* generator) = 0;
196864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual const char* Mnemonic() const = 0;
197864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual void PrintTo(StringStream* stream);
198864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream);
199864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual void PrintOutputOperandTo(StringStream* stream);
200864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
201864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  enum Opcode {
202864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    // Declare a unique enum value for each instruction.
203864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org#define DECLARE_OPCODE(type) k##type,
204864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    LITHIUM_CONCRETE_INSTRUCTION_LIST(DECLARE_OPCODE)
205864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    kNumberOfInstructions
206864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org#undef DECLARE_OPCODE
207864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  };
208864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
209864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual Opcode opcode() const = 0;
210864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
211864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  // Declare non-virtual type testers for all leaf IR classes.
212864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org#define DECLARE_PREDICATE(type) \
213864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  bool Is##type() const { return opcode() == k##type; }
214864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LITHIUM_CONCRETE_INSTRUCTION_LIST(DECLARE_PREDICATE)
215864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org#undef DECLARE_PREDICATE
216864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
217864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  // Declare virtual predicates for instructions that don't have
218864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  // an opcode.
219864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual bool IsGap() const { return false; }
220864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
221864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual bool IsControl() const { return false; }
222864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
223864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  void set_environment(LEnvironment* env) { environment_ = env; }
224864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LEnvironment* environment() const { return environment_; }
225864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  bool HasEnvironment() const { return environment_ != NULL; }
226864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
227864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  void set_pointer_map(LPointerMap* p) { pointer_map_.set(p); }
228864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LPointerMap* pointer_map() const { return pointer_map_.get(); }
229864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  bool HasPointerMap() const { return pointer_map_.is_set(); }
230864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
231864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  void set_hydrogen_value(HValue* value) { hydrogen_value_ = value; }
232864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  HValue* hydrogen_value() const { return hydrogen_value_; }
233864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
234864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual void SetDeferredLazyDeoptimizationEnvironment(LEnvironment* env) { }
235864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
236864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  void MarkAsCall() { bit_field_ = IsCallBits::update(bit_field_, true); }
237864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  bool IsCall() const { return IsCallBits::decode(bit_field_); }
238864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
239864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  // Interface to the register allocator and iterators.
240864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  bool ClobbersTemps() const { return IsCall(); }
241864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  bool ClobbersRegisters() const { return IsCall(); }
242864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual bool ClobbersDoubleRegisters(Isolate* isolate) const {
243864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    return IsCall() ||
244864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org           // We only have rudimentary X87Stack tracking, thus in general
245864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org           // cannot handle phi-nodes.
246864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org        (IsControl());
247864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
248864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
249864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual bool HasResult() const = 0;
250864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual LOperand* result() const = 0;
251864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
252864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  bool HasDoubleRegisterResult();
253864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  bool HasDoubleRegisterInput();
254864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  bool IsDoubleInput(X87Register reg, LCodeGen* cgen);
255864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
256864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* FirstInput() { return InputAt(0); }
257864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* Output() { return HasResult() ? result() : NULL; }
258864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
259864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual bool HasInterestingComment(LCodeGen* gen) const { return true; }
260864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
261864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org#ifdef DEBUG
262864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  void VerifyCall();
263864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org#endif
264864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
265864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org private:
266864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  // Iterator support.
267864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  friend class InputIterator;
268864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual int InputCount() = 0;
269864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual LOperand* InputAt(int i) = 0;
270864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
271864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  friend class TempIterator;
272864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual int TempCount() = 0;
273864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual LOperand* TempAt(int i) = 0;
274864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
275864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  class IsCallBits: public BitField<bool, 0, 1> {};
276864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
277864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LEnvironment* environment_;
278864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  SetOncePointer<LPointerMap> pointer_map_;
279864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  HValue* hydrogen_value_;
280864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  int bit_field_;
281864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
282864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
283864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
284864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// R = number of result operands (0 or 1).
285864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgtemplate<int R>
286864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LTemplateResultInstruction : public LInstruction {
287864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
288864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  // Allow 0 or 1 output operands.
289864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  STATIC_ASSERT(R == 0 || R == 1);
290864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual bool HasResult() const V8_FINAL V8_OVERRIDE {
291864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    return R != 0 && result() != NULL;
292864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
293864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  void set_result(LOperand* operand) { results_[0] = operand; }
294864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* result() const { return results_[0]; }
295864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
296864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org protected:
297864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  EmbeddedContainer<LOperand*, R> results_;
298864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
299864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
300864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
301864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// R = number of result operands (0 or 1).
302864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// I = number of input operands.
303864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// T = number of temporary operands.
304864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgtemplate<int R, int I, int T>
305864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LTemplateInstruction : public LTemplateResultInstruction<R> {
306864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org protected:
307864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  EmbeddedContainer<LOperand*, I> inputs_;
308864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  EmbeddedContainer<LOperand*, T> temps_;
309864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
310864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org private:
311864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  // Iterator support.
312864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual int InputCount() V8_FINAL V8_OVERRIDE { return I; }
313864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual LOperand* InputAt(int i) V8_FINAL V8_OVERRIDE { return inputs_[i]; }
314864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
315864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual int TempCount() V8_FINAL V8_OVERRIDE { return T; }
316864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual LOperand* TempAt(int i) V8_FINAL V8_OVERRIDE { return temps_[i]; }
317864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
318864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
319864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
320864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LGap : public LTemplateInstruction<0, 0, 0> {
321864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
322864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  explicit LGap(HBasicBlock* block) : block_(block) {
323864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    parallel_moves_[BEFORE] = NULL;
324864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    parallel_moves_[START] = NULL;
325864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    parallel_moves_[END] = NULL;
326864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    parallel_moves_[AFTER] = NULL;
327864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
328864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
329864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  // Can't use the DECLARE-macro here because of sub-classes.
330864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual bool IsGap() const V8_FINAL V8_OVERRIDE { return true; }
331864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE;
332864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  static LGap* cast(LInstruction* instr) {
333864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    ASSERT(instr->IsGap());
334864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    return reinterpret_cast<LGap*>(instr);
335864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
336864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
337864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  bool IsRedundant() const;
338864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
339864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  HBasicBlock* block() const { return block_; }
340864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
341864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  enum InnerPosition {
342864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    BEFORE,
343864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    START,
344864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    END,
345864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    AFTER,
346864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    FIRST_INNER_POSITION = BEFORE,
347864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    LAST_INNER_POSITION = AFTER
348864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  };
349864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
350864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LParallelMove* GetOrCreateParallelMove(InnerPosition pos, Zone* zone)  {
351864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    if (parallel_moves_[pos] == NULL) {
352864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org      parallel_moves_[pos] = new(zone) LParallelMove(zone);
353864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    }
354864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    return parallel_moves_[pos];
355864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
356864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
357864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LParallelMove* GetParallelMove(InnerPosition pos)  {
358864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    return parallel_moves_[pos];
359864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
360864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
361864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org private:
362864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LParallelMove* parallel_moves_[LAST_INNER_POSITION + 1];
363864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  HBasicBlock* block_;
364864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
365864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
366864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
367864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LInstructionGap V8_FINAL : public LGap {
368864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
369864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  explicit LInstructionGap(HBasicBlock* block) : LGap(block) { }
370864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
371864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual bool HasInterestingComment(LCodeGen* gen) const V8_OVERRIDE {
372864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    return !IsRedundant();
373864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
374864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
375864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(InstructionGap, "gap")
376864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
377864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
378864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
379864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LClobberDoubles V8_FINAL : public LTemplateInstruction<0, 0, 0> {
380864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
381864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  explicit LClobberDoubles(Isolate* isolate) { }
382864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
383864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual bool ClobbersDoubleRegisters(Isolate* isolate) const V8_OVERRIDE {
384864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    return true;
385864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
386864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
387864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(ClobberDoubles, "clobber-d")
388864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
389864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
390864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
391864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LGoto V8_FINAL : public LTemplateInstruction<0, 0, 0> {
392864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
393864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  explicit LGoto(HBasicBlock* block) : block_(block) { }
394864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
395864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual bool HasInterestingComment(LCodeGen* gen) const V8_OVERRIDE;
396864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(Goto, "goto")
397864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE;
398864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual bool IsControl() const V8_OVERRIDE { return true; }
399864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
400864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  int block_id() const { return block_->block_id(); }
401864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual bool ClobbersDoubleRegisters(Isolate* isolate) const V8_OVERRIDE {
402864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    return false;
403864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
404864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
405864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  bool jumps_to_join() const { return block_->predecessors()->length() > 1; }
406864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
407864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org private:
408864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  HBasicBlock* block_;
409864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
410864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
411864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
412864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LLazyBailout V8_FINAL : public LTemplateInstruction<0, 0, 0> {
413864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
414864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(LazyBailout, "lazy-bailout")
415864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
416864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
417864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
418864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LDummy V8_FINAL : public LTemplateInstruction<1, 0, 0> {
419864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
420864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  explicit LDummy() { }
421864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(Dummy, "dummy")
422864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
423864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
424864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
425864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LDummyUse V8_FINAL : public LTemplateInstruction<1, 1, 0> {
426864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
427864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  explicit LDummyUse(LOperand* value) {
428864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = value;
429864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
430864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(DummyUse, "dummy-use")
431864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
432864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
433864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
434864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LDeoptimize V8_FINAL : public LTemplateInstruction<0, 0, 0> {
435864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
436e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org  virtual bool IsControl() const V8_OVERRIDE { return true; }
437864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(Deoptimize, "deoptimize")
438864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(Deoptimize)
439864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
440864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
441864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
442864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LLabel V8_FINAL : public LGap {
443864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
444864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  explicit LLabel(HBasicBlock* block)
445864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org      : LGap(block), replacement_(NULL) { }
446864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
447864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual bool HasInterestingComment(LCodeGen* gen) const V8_OVERRIDE {
448864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    return false;
449864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
450864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(Label, "label")
451864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
452864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE;
453864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
454864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  int block_id() const { return block()->block_id(); }
455864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  bool is_loop_header() const { return block()->IsLoopHeader(); }
456864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  bool is_osr_entry() const { return block()->is_osr_entry(); }
457864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  Label* label() { return &label_; }
458864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LLabel* replacement() const { return replacement_; }
459864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  void set_replacement(LLabel* label) { replacement_ = label; }
460864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  bool HasReplacement() const { return replacement_ != NULL; }
461864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
462864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org private:
463864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  Label label_;
464864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LLabel* replacement_;
465864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
466864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
467864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
468864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LParameter V8_FINAL : public LTemplateInstruction<1, 0, 0> {
469864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
470864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual bool HasInterestingComment(LCodeGen* gen) const V8_OVERRIDE {
471864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    return false;
472864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
473864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(Parameter, "parameter")
474864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
475864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
476864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
477864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LCallStub V8_FINAL : public LTemplateInstruction<1, 1, 0> {
478864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
479864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  explicit LCallStub(LOperand* context) {
480864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = context;
481864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
482864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
483864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* context() { return inputs_[0]; }
484864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
485864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(CallStub, "call-stub")
486864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(CallStub)
487864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
488864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
489864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
490864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LUnknownOSRValue V8_FINAL : public LTemplateInstruction<1, 0, 0> {
491864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
492864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual bool HasInterestingComment(LCodeGen* gen) const V8_OVERRIDE {
493864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    return false;
494864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
495864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(UnknownOSRValue, "unknown-osr-value")
496864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
497864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
498864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
499864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgtemplate<int I, int T>
500864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LControlInstruction: public LTemplateInstruction<0, I, T> {
501864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
502864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LControlInstruction() : false_label_(NULL), true_label_(NULL) { }
503864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
504864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual bool IsControl() const V8_FINAL V8_OVERRIDE { return true; }
505864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
506864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  int SuccessorCount() { return hydrogen()->SuccessorCount(); }
507864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  HBasicBlock* SuccessorAt(int i) { return hydrogen()->SuccessorAt(i); }
508864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
509864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  int TrueDestination(LChunk* chunk) {
510864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    return chunk->LookupDestination(true_block_id());
511864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
512864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  int FalseDestination(LChunk* chunk) {
513864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    return chunk->LookupDestination(false_block_id());
514864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
515864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
516864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  Label* TrueLabel(LChunk* chunk) {
517864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    if (true_label_ == NULL) {
518864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org      true_label_ = chunk->GetAssemblyLabel(TrueDestination(chunk));
519864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    }
520864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    return true_label_;
521864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
522864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  Label* FalseLabel(LChunk* chunk) {
523864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    if (false_label_ == NULL) {
524864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org      false_label_ = chunk->GetAssemblyLabel(FalseDestination(chunk));
525864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    }
526864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    return false_label_;
527864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
528864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
529864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org protected:
530864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  int true_block_id() { return SuccessorAt(0)->block_id(); }
531864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  int false_block_id() { return SuccessorAt(1)->block_id(); }
532864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
533864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org private:
534864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  HControlInstruction* hydrogen() {
535864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    return HControlInstruction::cast(this->hydrogen_value());
536864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
537864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
538864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  Label* false_label_;
539864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  Label* true_label_;
540864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
541864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
542864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
543864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LWrapReceiver V8_FINAL : public LTemplateInstruction<1, 2, 1> {
544864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
545864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LWrapReceiver(LOperand* receiver,
546864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org                LOperand* function,
547864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org                LOperand* temp) {
548864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = receiver;
549864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[1] = function;
550864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    temps_[0] = temp;
551864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
552864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
553864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* receiver() { return inputs_[0]; }
554864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* function() { return inputs_[1]; }
555864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* temp() { return temps_[0]; }
556864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
557864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(WrapReceiver, "wrap-receiver")
558864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(WrapReceiver)
559864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
560864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
561864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
562864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LApplyArguments V8_FINAL : public LTemplateInstruction<1, 4, 0> {
563864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
564864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LApplyArguments(LOperand* function,
565864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org                  LOperand* receiver,
566864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org                  LOperand* length,
567864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org                  LOperand* elements) {
568864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = function;
569864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[1] = receiver;
570864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[2] = length;
571864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[3] = elements;
572864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
573864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
574864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* function() { return inputs_[0]; }
575864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* receiver() { return inputs_[1]; }
576864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* length() { return inputs_[2]; }
577864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* elements() { return inputs_[3]; }
578864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
579864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(ApplyArguments, "apply-arguments")
580864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
581864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
582864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
583864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LAccessArgumentsAt V8_FINAL : public LTemplateInstruction<1, 3, 0> {
584864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
585864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LAccessArgumentsAt(LOperand* arguments, LOperand* length, LOperand* index) {
586864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = arguments;
587864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[1] = length;
588864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[2] = index;
589864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
590864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
591864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* arguments() { return inputs_[0]; }
592864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* length() { return inputs_[1]; }
593864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* index() { return inputs_[2]; }
594864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
595864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(AccessArgumentsAt, "access-arguments-at")
596864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
597864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE;
598864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
599864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
600864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
601864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LArgumentsLength V8_FINAL : public LTemplateInstruction<1, 1, 0> {
602864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
603864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  explicit LArgumentsLength(LOperand* elements) {
604864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = elements;
605864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
606864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
607864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* elements() { return inputs_[0]; }
608864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
609864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(ArgumentsLength, "arguments-length")
610864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
611864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
612864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
613864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LArgumentsElements V8_FINAL : public LTemplateInstruction<1, 0, 0> {
614864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
615864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(ArgumentsElements, "arguments-elements")
616864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(ArgumentsElements)
617864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
618864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
619864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
620864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LDebugBreak V8_FINAL : public LTemplateInstruction<0, 0, 0> {
621864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
622864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(DebugBreak, "break")
623864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
624864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
625864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
626864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LModByPowerOf2I V8_FINAL : public LTemplateInstruction<1, 1, 0> {
627864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
628864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LModByPowerOf2I(LOperand* dividend, int32_t divisor) {
629864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = dividend;
630864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    divisor_ = divisor;
631864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
632864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
633864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* dividend() { return inputs_[0]; }
634864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  int32_t divisor() const { return divisor_; }
635864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
636864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(ModByPowerOf2I, "mod-by-power-of-2-i")
637864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(Mod)
638864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
639864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org private:
640864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  int32_t divisor_;
641864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
642864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
643864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
644864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LModByConstI V8_FINAL : public LTemplateInstruction<1, 1, 2> {
645864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
646864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LModByConstI(LOperand* dividend,
647864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org               int32_t divisor,
648864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org               LOperand* temp1,
649864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org               LOperand* temp2) {
650864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = dividend;
651864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    divisor_ = divisor;
652864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    temps_[0] = temp1;
653864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    temps_[1] = temp2;
654864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
655864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
656864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* dividend() { return inputs_[0]; }
657864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  int32_t divisor() const { return divisor_; }
658864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* temp1() { return temps_[0]; }
659864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* temp2() { return temps_[1]; }
660864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
661864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(ModByConstI, "mod-by-const-i")
662864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(Mod)
663864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
664864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org private:
665864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  int32_t divisor_;
666864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
667864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
668864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
669864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LModI V8_FINAL : public LTemplateInstruction<1, 2, 1> {
670864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
671864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LModI(LOperand* left, LOperand* right, LOperand* temp) {
672864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = left;
673864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[1] = right;
674864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    temps_[0] = temp;
675864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
676864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
677864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* left() { return inputs_[0]; }
678864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* right() { return inputs_[1]; }
679864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* temp() { return temps_[0]; }
680864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
681864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(ModI, "mod-i")
682864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(Mod)
683864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
684864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
685864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
686864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LDivByPowerOf2I V8_FINAL : public LTemplateInstruction<1, 1, 0> {
687864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
688864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LDivByPowerOf2I(LOperand* dividend, int32_t divisor) {
689864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = dividend;
690864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    divisor_ = divisor;
691864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
692864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
693864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* dividend() { return inputs_[0]; }
694864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  int32_t divisor() const { return divisor_; }
695864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
696864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(DivByPowerOf2I, "div-by-power-of-2-i")
697864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(Div)
698864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
699864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org private:
700864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  int32_t divisor_;
701864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
702864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
703864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
704864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LDivByConstI V8_FINAL : public LTemplateInstruction<1, 1, 2> {
705864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
706864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LDivByConstI(LOperand* dividend,
707864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org               int32_t divisor,
708864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org               LOperand* temp1,
709864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org               LOperand* temp2) {
710864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = dividend;
711864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    divisor_ = divisor;
712864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    temps_[0] = temp1;
713864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    temps_[1] = temp2;
714864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
715864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
716864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* dividend() { return inputs_[0]; }
717864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  int32_t divisor() const { return divisor_; }
718864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* temp1() { return temps_[0]; }
719864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* temp2() { return temps_[1]; }
720864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
721864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(DivByConstI, "div-by-const-i")
722864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(Div)
723864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
724864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org private:
725864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  int32_t divisor_;
726864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
727864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
728864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
729864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LDivI V8_FINAL : public LTemplateInstruction<1, 2, 1> {
730864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
731864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LDivI(LOperand* dividend, LOperand* divisor, LOperand* temp) {
732864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = dividend;
733864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[1] = divisor;
734864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    temps_[0] = temp;
735864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
736864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
737864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* dividend() { return inputs_[0]; }
738864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* divisor() { return inputs_[1]; }
739864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* temp() { return temps_[0]; }
740864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
741864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(DivI, "div-i")
742864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(BinaryOperation)
743864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
744864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
745864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
746864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LFlooringDivByPowerOf2I V8_FINAL : public LTemplateInstruction<1, 1, 0> {
747864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
748864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LFlooringDivByPowerOf2I(LOperand* dividend, int32_t divisor) {
749864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = dividend;
750864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    divisor_ = divisor;
751864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
752864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
753864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* dividend() { return inputs_[0]; }
754864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  int32_t divisor() const { return divisor_; }
755864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
756864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(FlooringDivByPowerOf2I,
757864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org                               "flooring-div-by-power-of-2-i")
758864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(MathFloorOfDiv)
759864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
760864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org private:
761864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  int32_t divisor_;
762864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
763864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
764864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
765864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LFlooringDivByConstI V8_FINAL : public LTemplateInstruction<1, 1, 3> {
766864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
767864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LFlooringDivByConstI(LOperand* dividend,
768864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org                       int32_t divisor,
769864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org                       LOperand* temp1,
770864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org                       LOperand* temp2,
771864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org                       LOperand* temp3) {
772864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = dividend;
773864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    divisor_ = divisor;
774864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    temps_[0] = temp1;
775864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    temps_[1] = temp2;
776864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    temps_[2] = temp3;
777864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
778864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
779864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* dividend() { return inputs_[0]; }
780864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  int32_t divisor() const { return divisor_; }
781864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* temp1() { return temps_[0]; }
782864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* temp2() { return temps_[1]; }
783864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* temp3() { return temps_[2]; }
784864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
785864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(FlooringDivByConstI, "flooring-div-by-const-i")
786864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(MathFloorOfDiv)
787864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
788864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org private:
789864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  int32_t divisor_;
790864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
791864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
792864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
793864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LFlooringDivI V8_FINAL : public LTemplateInstruction<1, 2, 1> {
794864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
795864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LFlooringDivI(LOperand* dividend, LOperand* divisor, LOperand* temp) {
796864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = dividend;
797864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[1] = divisor;
798864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    temps_[0] = temp;
799864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
800864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
801864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* dividend() { return inputs_[0]; }
802864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* divisor() { return inputs_[1]; }
803864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* temp() { return temps_[0]; }
804864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
805864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(FlooringDivI, "flooring-div-i")
806864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(MathFloorOfDiv)
807864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
808864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
809864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
810864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LMulI V8_FINAL : public LTemplateInstruction<1, 2, 1> {
811864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
812864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LMulI(LOperand* left, LOperand* right, LOperand* temp) {
813864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = left;
814864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[1] = right;
815864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    temps_[0] = temp;
816864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
817864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
818864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* left() { return inputs_[0]; }
819864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* right() { return inputs_[1]; }
820864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* temp() { return temps_[0]; }
821864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
822864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(MulI, "mul-i")
823864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(Mul)
824864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
825864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
826864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
827864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LCompareNumericAndBranch V8_FINAL : public LControlInstruction<2, 0> {
828864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
829864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LCompareNumericAndBranch(LOperand* left, LOperand* right) {
830864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = left;
831864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[1] = right;
832864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
833864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
834864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* left() { return inputs_[0]; }
835864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* right() { return inputs_[1]; }
836864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
837864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(CompareNumericAndBranch,
838864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org                               "compare-numeric-and-branch")
839864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(CompareNumericAndBranch)
840864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
841864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  Token::Value op() const { return hydrogen()->token(); }
842864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  bool is_double() const {
843864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    return hydrogen()->representation().IsDouble();
844864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
845864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
846864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream);
847864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
848864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
849864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
850864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LMathFloor V8_FINAL : public LTemplateInstruction<1, 1, 0> {
851864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
852864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  explicit LMathFloor(LOperand* value) {
853864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = value;
854864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
855864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
856864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* value() { return inputs_[0]; }
857864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
858864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(MathFloor, "math-floor")
859864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(UnaryMathOperation)
860864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
861864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
862864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
863864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LMathRound V8_FINAL : public LTemplateInstruction<1, 1, 0> {
864864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
865864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  explicit LMathRound(LOperand* value) {
866864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = value;
867864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
868864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
869864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* value() { return inputs_[0]; }
870864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
871864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(MathRound, "math-round")
872864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(UnaryMathOperation)
873864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
874864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
875864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
876864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LMathAbs V8_FINAL : public LTemplateInstruction<1, 2, 0> {
877864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
878864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LMathAbs(LOperand* context, LOperand* value) {
879864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[1] = context;
880864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = value;
881864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
882864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
883864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* context() { return inputs_[1]; }
884864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* value() { return inputs_[0]; }
885864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
886864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(MathAbs, "math-abs")
887864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(UnaryMathOperation)
888864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
889864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
890864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
891864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LMathLog V8_FINAL : public LTemplateInstruction<1, 1, 0> {
892864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
893864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  explicit LMathLog(LOperand* value) {
894864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = value;
895864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
896864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
897864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* value() { return inputs_[0]; }
898864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
899864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(MathLog, "math-log")
900864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
901864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
902864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
903864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LMathClz32 V8_FINAL : public LTemplateInstruction<1, 1, 0> {
904864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
905864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  explicit LMathClz32(LOperand* value) {
906864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = value;
907864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
908864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
909864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* value() { return inputs_[0]; }
910864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
911864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(MathClz32, "math-clz32")
912864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
913864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
914864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
915864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LMathExp V8_FINAL : public LTemplateInstruction<1, 1, 2> {
916864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
917864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LMathExp(LOperand* value,
918864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org           LOperand* temp1,
919864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org           LOperand* temp2) {
920864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = value;
921864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    temps_[0] = temp1;
922864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    temps_[1] = temp2;
923864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    ExternalReference::InitializeMathExpData();
924864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
925864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
926864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* value() { return inputs_[0]; }
927864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* temp1() { return temps_[0]; }
928864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* temp2() { return temps_[1]; }
929864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
930864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(MathExp, "math-exp")
931864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
932864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
933864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
934864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LMathSqrt V8_FINAL : public LTemplateInstruction<1, 1, 0> {
935864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
936864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  explicit LMathSqrt(LOperand* value) {
937864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = value;
938864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
939864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
940864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* value() { return inputs_[0]; }
941864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
942864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(MathSqrt, "math-sqrt")
943864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
944864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
945864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
946864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LMathPowHalf V8_FINAL : public LTemplateInstruction<1, 1, 1> {
947864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
948864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LMathPowHalf(LOperand* value, LOperand* temp) {
949864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = value;
950864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    temps_[0] = temp;
951864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
952864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
953864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* value() { return inputs_[0]; }
954864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* temp() { return temps_[0]; }
955864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
956864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(MathPowHalf, "math-pow-half")
957864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
958864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
959864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
960864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LCmpObjectEqAndBranch V8_FINAL : public LControlInstruction<2, 0> {
961864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
962864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LCmpObjectEqAndBranch(LOperand* left, LOperand* right) {
963864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = left;
964864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[1] = right;
965864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
966864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
967864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* left() { return inputs_[0]; }
968864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* right() { return inputs_[1]; }
969864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
970864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(CmpObjectEqAndBranch, "cmp-object-eq-and-branch")
971864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
972864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
973864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
974864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LCmpHoleAndBranch V8_FINAL : public LControlInstruction<1, 0> {
975864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
976864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  explicit LCmpHoleAndBranch(LOperand* object) {
977864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = object;
978864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
979864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
980864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* object() { return inputs_[0]; }
981864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
982864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(CmpHoleAndBranch, "cmp-hole-and-branch")
983864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(CompareHoleAndBranch)
984864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
985864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
986864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
987864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LCompareMinusZeroAndBranch V8_FINAL : public LControlInstruction<1, 1> {
988864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
989864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LCompareMinusZeroAndBranch(LOperand* value, LOperand* temp) {
990864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = value;
991864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    temps_[0] = temp;
992864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
993864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
994864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* value() { return inputs_[0]; }
995864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* temp() { return temps_[0]; }
996864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
997864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(CompareMinusZeroAndBranch,
998864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org                               "cmp-minus-zero-and-branch")
999864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(CompareMinusZeroAndBranch)
1000864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
1001864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1002864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1003864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LIsObjectAndBranch V8_FINAL : public LControlInstruction<1, 1> {
1004864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
1005864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LIsObjectAndBranch(LOperand* value, LOperand* temp) {
1006864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = value;
1007864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    temps_[0] = temp;
1008864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
1009864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1010864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* value() { return inputs_[0]; }
1011864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* temp() { return temps_[0]; }
1012864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1013864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(IsObjectAndBranch, "is-object-and-branch")
1014864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1015864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE;
1016864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
1017864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1018864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1019864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LIsStringAndBranch V8_FINAL : public LControlInstruction<1, 1> {
1020864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
1021864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LIsStringAndBranch(LOperand* value, LOperand* temp) {
1022864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = value;
1023864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    temps_[0] = temp;
1024864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
1025864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1026864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* value() { return inputs_[0]; }
1027864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* temp() { return temps_[0]; }
1028864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1029864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(IsStringAndBranch, "is-string-and-branch")
1030864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(IsStringAndBranch)
1031864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1032864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE;
1033864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
1034864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1035864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1036864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LIsSmiAndBranch V8_FINAL : public LControlInstruction<1, 0> {
1037864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
1038864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  explicit LIsSmiAndBranch(LOperand* value) {
1039864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = value;
1040864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
1041864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1042864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* value() { return inputs_[0]; }
1043864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1044864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(IsSmiAndBranch, "is-smi-and-branch")
1045864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(IsSmiAndBranch)
1046864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1047864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE;
1048864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
1049864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1050864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1051864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LIsUndetectableAndBranch V8_FINAL : public LControlInstruction<1, 1> {
1052864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
1053864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LIsUndetectableAndBranch(LOperand* value, LOperand* temp) {
1054864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = value;
1055864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    temps_[0] = temp;
1056864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
1057864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1058864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* value() { return inputs_[0]; }
1059864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* temp() { return temps_[0]; }
1060864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1061864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(IsUndetectableAndBranch,
1062864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org                               "is-undetectable-and-branch")
1063864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(IsUndetectableAndBranch)
1064864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1065864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE;
1066864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
1067864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1068864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1069864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LStringCompareAndBranch V8_FINAL : public LControlInstruction<3, 0> {
1070864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
1071864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LStringCompareAndBranch(LOperand* context, LOperand* left, LOperand* right) {
1072864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = context;
1073864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[1] = left;
1074864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[2] = right;
1075864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
1076864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1077864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* context() { return inputs_[1]; }
1078864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* left() { return inputs_[1]; }
1079864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* right() { return inputs_[2]; }
1080864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1081864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(StringCompareAndBranch,
1082864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org                               "string-compare-and-branch")
1083864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(StringCompareAndBranch)
1084864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1085864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE;
1086864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1087864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  Token::Value op() const { return hydrogen()->token(); }
1088864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
1089864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1090864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1091864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LHasInstanceTypeAndBranch V8_FINAL : public LControlInstruction<1, 1> {
1092864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
1093864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LHasInstanceTypeAndBranch(LOperand* value, LOperand* temp) {
1094864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = value;
1095864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    temps_[0] = temp;
1096864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
1097864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1098864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* value() { return inputs_[0]; }
1099864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* temp() { return temps_[0]; }
1100864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1101864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(HasInstanceTypeAndBranch,
1102864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org                               "has-instance-type-and-branch")
1103864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(HasInstanceTypeAndBranch)
1104864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1105864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE;
1106864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
1107864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1108864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1109864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LGetCachedArrayIndex V8_FINAL : public LTemplateInstruction<1, 1, 0> {
1110864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
1111864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  explicit LGetCachedArrayIndex(LOperand* value) {
1112864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = value;
1113864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
1114864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1115864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* value() { return inputs_[0]; }
1116864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1117864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(GetCachedArrayIndex, "get-cached-array-index")
1118864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(GetCachedArrayIndex)
1119864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
1120864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1121864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1122864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LHasCachedArrayIndexAndBranch V8_FINAL
1123864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    : public LControlInstruction<1, 0> {
1124864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
1125864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  explicit LHasCachedArrayIndexAndBranch(LOperand* value) {
1126864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = value;
1127864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
1128864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1129864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* value() { return inputs_[0]; }
1130864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1131864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(HasCachedArrayIndexAndBranch,
1132864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org                               "has-cached-array-index-and-branch")
1133864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1134864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE;
1135864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
1136864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1137864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1138864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LIsConstructCallAndBranch V8_FINAL : public LControlInstruction<0, 1> {
1139864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
1140864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  explicit LIsConstructCallAndBranch(LOperand* temp) {
1141864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    temps_[0] = temp;
1142864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
1143864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1144864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* temp() { return temps_[0]; }
1145864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1146864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(IsConstructCallAndBranch,
1147864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org                               "is-construct-call-and-branch")
1148864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
1149864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1150864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1151864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LClassOfTestAndBranch V8_FINAL : public LControlInstruction<1, 2> {
1152864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
1153864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LClassOfTestAndBranch(LOperand* value, LOperand* temp, LOperand* temp2) {
1154864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = value;
1155864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    temps_[0] = temp;
1156864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    temps_[1] = temp2;
1157864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
1158864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1159864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* value() { return inputs_[0]; }
1160864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* temp() { return temps_[0]; }
1161864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* temp2() { return temps_[1]; }
1162864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1163864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(ClassOfTestAndBranch,
1164864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org                               "class-of-test-and-branch")
1165864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(ClassOfTestAndBranch)
1166864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1167864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE;
1168864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
1169864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1170864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1171864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LCmpT V8_FINAL : public LTemplateInstruction<1, 3, 0> {
1172864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
1173864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LCmpT(LOperand* context, LOperand* left, LOperand* right) {
1174864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = context;
1175864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[1] = left;
1176864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[2] = right;
1177864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
1178864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1179864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(CmpT, "cmp-t")
1180864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(CompareGeneric)
1181864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1182864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* context() { return inputs_[0]; }
1183864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  Token::Value op() const { return hydrogen()->token(); }
1184864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
1185864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1186864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1187864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LInstanceOf V8_FINAL : public LTemplateInstruction<1, 3, 0> {
1188864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
1189864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LInstanceOf(LOperand* context, LOperand* left, LOperand* right) {
1190864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = context;
1191864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[1] = left;
1192864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[2] = right;
1193864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
1194864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1195864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* context() { return inputs_[0]; }
1196864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1197864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(InstanceOf, "instance-of")
1198864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
1199864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1200864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1201864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LInstanceOfKnownGlobal V8_FINAL : public LTemplateInstruction<1, 2, 1> {
1202864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
1203864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LInstanceOfKnownGlobal(LOperand* context, LOperand* value, LOperand* temp) {
1204864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = context;
1205864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[1] = value;
1206864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    temps_[0] = temp;
1207864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
1208864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1209864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* context() { return inputs_[0]; }
1210864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* value() { return inputs_[1]; }
1211864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* temp() { return temps_[0]; }
1212864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1213864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(InstanceOfKnownGlobal,
1214864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org                               "instance-of-known-global")
1215864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(InstanceOfKnownGlobal)
1216864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1217864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  Handle<JSFunction> function() const { return hydrogen()->function(); }
1218864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LEnvironment* GetDeferredLazyDeoptimizationEnvironment() {
1219864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    return lazy_deopt_env_;
1220864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
1221864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual void SetDeferredLazyDeoptimizationEnvironment(
1222864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org      LEnvironment* env) V8_OVERRIDE {
1223864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    lazy_deopt_env_ = env;
1224864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
1225864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1226864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org private:
1227864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LEnvironment* lazy_deopt_env_;
1228864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
1229864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1230864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1231864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LBoundsCheck V8_FINAL : public LTemplateInstruction<0, 2, 0> {
1232864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
1233864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LBoundsCheck(LOperand* index, LOperand* length) {
1234864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = index;
1235864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[1] = length;
1236864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
1237864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1238864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* index() { return inputs_[0]; }
1239864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* length() { return inputs_[1]; }
1240864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1241864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(BoundsCheck, "bounds-check")
1242864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(BoundsCheck)
1243864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
1244864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1245864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1246864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LBitI V8_FINAL : public LTemplateInstruction<1, 2, 0> {
1247864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
1248864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LBitI(LOperand* left, LOperand* right) {
1249864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = left;
1250864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[1] = right;
1251864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
1252864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1253864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* left() { return inputs_[0]; }
1254864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* right() { return inputs_[1]; }
1255864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1256864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(BitI, "bit-i")
1257864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(Bitwise)
1258864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1259864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  Token::Value op() const { return hydrogen()->op(); }
1260864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
1261864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1262864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1263864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LShiftI V8_FINAL : public LTemplateInstruction<1, 2, 0> {
1264864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
1265864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LShiftI(Token::Value op, LOperand* left, LOperand* right, bool can_deopt)
1266864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org      : op_(op), can_deopt_(can_deopt) {
1267864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = left;
1268864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[1] = right;
1269864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
1270864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1271864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* left() { return inputs_[0]; }
1272864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* right() { return inputs_[1]; }
1273864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1274864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(ShiftI, "shift-i")
1275864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1276864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  Token::Value op() const { return op_; }
1277864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  bool can_deopt() const { return can_deopt_; }
1278864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1279864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org private:
1280864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  Token::Value op_;
1281864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  bool can_deopt_;
1282864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
1283864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1284864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1285864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LSubI V8_FINAL : public LTemplateInstruction<1, 2, 0> {
1286864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
1287864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LSubI(LOperand* left, LOperand* right) {
1288864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = left;
1289864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[1] = right;
1290864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
1291864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1292864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* left() { return inputs_[0]; }
1293864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* right() { return inputs_[1]; }
1294864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1295864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(SubI, "sub-i")
1296864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(Sub)
1297864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
1298864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1299864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1300864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LConstantI V8_FINAL : public LTemplateInstruction<1, 0, 0> {
1301864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
1302864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(ConstantI, "constant-i")
1303864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(Constant)
1304864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1305864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  int32_t value() const { return hydrogen()->Integer32Value(); }
1306864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
1307864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1308864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1309864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LConstantS V8_FINAL : public LTemplateInstruction<1, 0, 0> {
1310864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
1311864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(ConstantS, "constant-s")
1312864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(Constant)
1313864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1314864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  Smi* value() const { return Smi::FromInt(hydrogen()->Integer32Value()); }
1315864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
1316864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1317864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1318864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LConstantD V8_FINAL : public LTemplateInstruction<1, 0, 1> {
1319864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
1320864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  explicit LConstantD(LOperand* temp) {
1321864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    temps_[0] = temp;
1322864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
1323864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1324864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* temp() { return temps_[0]; }
1325864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1326864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(ConstantD, "constant-d")
1327864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(Constant)
1328864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1329864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  double value() const { return hydrogen()->DoubleValue(); }
1330864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
1331864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1332864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1333864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LConstantE V8_FINAL : public LTemplateInstruction<1, 0, 0> {
1334864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
1335864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(ConstantE, "constant-e")
1336864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(Constant)
1337864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1338864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  ExternalReference value() const {
1339864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    return hydrogen()->ExternalReferenceValue();
1340864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
1341864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
1342864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1343864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1344864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LConstantT V8_FINAL : public LTemplateInstruction<1, 0, 0> {
1345864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
1346864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(ConstantT, "constant-t")
1347864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(Constant)
1348864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1349864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  Handle<Object> value(Isolate* isolate) const {
1350864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    return hydrogen()->handle(isolate);
1351864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
1352864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
1353864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1354864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1355864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LBranch V8_FINAL : public LControlInstruction<1, 1> {
1356864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
1357864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LBranch(LOperand* value, LOperand* temp) {
1358864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = value;
1359864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    temps_[0] = temp;
1360864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
1361864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1362864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* value() { return inputs_[0]; }
1363864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* temp() { return temps_[0]; }
1364864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1365864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(Branch, "branch")
1366864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(Branch)
1367864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1368864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE;
1369864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
1370864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1371864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1372864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LCmpMapAndBranch V8_FINAL : public LControlInstruction<1, 0> {
1373864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
1374864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  explicit LCmpMapAndBranch(LOperand* value) {
1375864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = value;
1376864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
1377864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1378864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* value() { return inputs_[0]; }
1379864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1380864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(CmpMapAndBranch, "cmp-map-and-branch")
1381864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(CompareMap)
1382864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1383864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  Handle<Map> map() const { return hydrogen()->map().handle(); }
1384864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
1385864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1386864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1387864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LMapEnumLength V8_FINAL : public LTemplateInstruction<1, 1, 0> {
1388864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
1389864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  explicit LMapEnumLength(LOperand* value) {
1390864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = value;
1391864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
1392864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1393864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* value() { return inputs_[0]; }
1394864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1395864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(MapEnumLength, "map-enum-length")
1396864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
1397864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1398864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1399864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LDateField V8_FINAL : public LTemplateInstruction<1, 1, 1> {
1400864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
1401864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LDateField(LOperand* date, LOperand* temp, Smi* index)
1402864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org      : index_(index) {
1403864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = date;
1404864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    temps_[0] = temp;
1405864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
1406864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1407864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* date() { return inputs_[0]; }
1408864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* temp() { return temps_[0]; }
1409864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1410864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(DateField, "date-field")
1411864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(DateField)
1412864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1413864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  Smi* index() const { return index_; }
1414864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1415864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org private:
1416864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  Smi* index_;
1417864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
1418864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1419864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1420864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LSeqStringGetChar V8_FINAL : public LTemplateInstruction<1, 2, 0> {
1421864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
1422864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LSeqStringGetChar(LOperand* string, LOperand* index) {
1423864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = string;
1424864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[1] = index;
1425864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
1426864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1427864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* string() const { return inputs_[0]; }
1428864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* index() const { return inputs_[1]; }
1429864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1430864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(SeqStringGetChar, "seq-string-get-char")
1431864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(SeqStringGetChar)
1432864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
1433864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1434864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1435864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LSeqStringSetChar V8_FINAL : public LTemplateInstruction<1, 4, 0> {
1436864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
1437864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LSeqStringSetChar(LOperand* context,
1438864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org                    LOperand* string,
1439864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org                    LOperand* index,
1440864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org                    LOperand* value) {
1441864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = context;
1442864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[1] = string;
1443864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[2] = index;
1444864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[3] = value;
1445864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
1446864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1447864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* string() { return inputs_[1]; }
1448864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* index() { return inputs_[2]; }
1449864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* value() { return inputs_[3]; }
1450864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1451864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(SeqStringSetChar, "seq-string-set-char")
1452864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(SeqStringSetChar)
1453864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
1454864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1455864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1456864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LAddI V8_FINAL : public LTemplateInstruction<1, 2, 0> {
1457864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
1458864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LAddI(LOperand* left, LOperand* right) {
1459864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = left;
1460864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[1] = right;
1461864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
1462864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1463864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* left() { return inputs_[0]; }
1464864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* right() { return inputs_[1]; }
1465864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1466864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  static bool UseLea(HAdd* add) {
1467864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    return !add->CheckFlag(HValue::kCanOverflow) &&
1468864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org        add->BetterLeftOperand()->UseCount() > 1;
1469864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
1470864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1471864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(AddI, "add-i")
1472864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(Add)
1473864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
1474864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1475864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1476864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LMathMinMax V8_FINAL : public LTemplateInstruction<1, 2, 0> {
1477864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
1478864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LMathMinMax(LOperand* left, LOperand* right) {
1479864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = left;
1480864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[1] = right;
1481864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
1482864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1483864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* left() { return inputs_[0]; }
1484864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* right() { return inputs_[1]; }
1485864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1486864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(MathMinMax, "math-min-max")
1487864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(MathMinMax)
1488864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
1489864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1490864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1491864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LPower V8_FINAL : public LTemplateInstruction<1, 2, 0> {
1492864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
1493864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LPower(LOperand* left, LOperand* right) {
1494864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = left;
1495864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[1] = right;
1496864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
1497864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1498864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* left() { return inputs_[0]; }
1499864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* right() { return inputs_[1]; }
1500864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1501864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(Power, "power")
1502864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(Power)
1503864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
1504864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1505864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1506864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LArithmeticD V8_FINAL : public LTemplateInstruction<1, 2, 0> {
1507864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
1508864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LArithmeticD(Token::Value op, LOperand* left, LOperand* right)
1509864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org      : op_(op) {
1510864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = left;
1511864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[1] = right;
1512864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
1513864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1514864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* left() { return inputs_[0]; }
1515864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* right() { return inputs_[1]; }
1516864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1517864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  Token::Value op() const { return op_; }
1518864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1519864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual Opcode opcode() const V8_OVERRIDE {
1520864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    return LInstruction::kArithmeticD;
1521864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
1522864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual void CompileToNative(LCodeGen* generator) V8_OVERRIDE;
1523864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual const char* Mnemonic() const V8_OVERRIDE;
1524864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1525864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org private:
1526864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  Token::Value op_;
1527864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
1528864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1529864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1530864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LArithmeticT V8_FINAL : public LTemplateInstruction<1, 3, 0> {
1531864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
1532864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LArithmeticT(Token::Value op,
1533864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org               LOperand* context,
1534864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org               LOperand* left,
1535864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org               LOperand* right)
1536864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org      : op_(op) {
1537864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = context;
1538864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[1] = left;
1539864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[2] = right;
1540864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
1541864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1542864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* context() { return inputs_[0]; }
1543864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* left() { return inputs_[1]; }
1544864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* right() { return inputs_[2]; }
1545864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1546864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual Opcode opcode() const V8_OVERRIDE {
1547864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    return LInstruction::kArithmeticT;
1548864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
1549864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual void CompileToNative(LCodeGen* generator) V8_OVERRIDE;
1550864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual const char* Mnemonic() const V8_OVERRIDE;
1551864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1552864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  Token::Value op() const { return op_; }
1553864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1554864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org private:
1555864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  Token::Value op_;
1556864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
1557864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1558864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1559864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LReturn V8_FINAL : public LTemplateInstruction<0, 3, 0> {
1560864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
1561864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  explicit LReturn(LOperand* value,
1562864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org                   LOperand* context,
1563864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org                   LOperand* parameter_count) {
1564864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = value;
1565864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[1] = context;
1566864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[2] = parameter_count;
1567864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
1568864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1569864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  bool has_constant_parameter_count() {
1570864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    return parameter_count()->IsConstantOperand();
1571864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
1572864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LConstantOperand* constant_parameter_count() {
1573864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    ASSERT(has_constant_parameter_count());
1574864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    return LConstantOperand::cast(parameter_count());
1575864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
1576864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* parameter_count() { return inputs_[2]; }
1577864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1578864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(Return, "return")
1579864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(Return)
1580864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
1581864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1582864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1583864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LLoadNamedField V8_FINAL : public LTemplateInstruction<1, 1, 0> {
1584864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
1585864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  explicit LLoadNamedField(LOperand* object) {
1586864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = object;
1587864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
1588864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1589864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* object() { return inputs_[0]; }
1590864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1591864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(LoadNamedField, "load-named-field")
1592864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(LoadNamedField)
1593864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
1594864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1595864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1596864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LLoadNamedGeneric V8_FINAL : public LTemplateInstruction<1, 2, 0> {
1597864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
1598864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LLoadNamedGeneric(LOperand* context, LOperand* object) {
1599864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = context;
1600864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[1] = object;
1601864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
1602864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1603864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* context() { return inputs_[0]; }
1604864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* object() { return inputs_[1]; }
1605864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1606864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(LoadNamedGeneric, "load-named-generic")
1607864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(LoadNamedGeneric)
1608864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1609864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  Handle<Object> name() const { return hydrogen()->name(); }
1610864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
1611864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1612864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1613864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LLoadFunctionPrototype V8_FINAL : public LTemplateInstruction<1, 1, 1> {
1614864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
1615864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LLoadFunctionPrototype(LOperand* function, LOperand* temp) {
1616864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = function;
1617864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    temps_[0] = temp;
1618864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
1619864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1620864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* function() { return inputs_[0]; }
1621864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* temp() { return temps_[0]; }
1622864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1623864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(LoadFunctionPrototype, "load-function-prototype")
1624864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(LoadFunctionPrototype)
1625864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
1626864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1627864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1628864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LLoadRoot V8_FINAL : public LTemplateInstruction<1, 0, 0> {
1629864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
1630864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(LoadRoot, "load-root")
1631864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(LoadRoot)
1632864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1633864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  Heap::RootListIndex index() const { return hydrogen()->index(); }
1634864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
1635864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1636864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1637864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LLoadKeyed V8_FINAL : public LTemplateInstruction<1, 2, 0> {
1638864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
1639864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LLoadKeyed(LOperand* elements, LOperand* key) {
1640864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = elements;
1641864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[1] = key;
1642864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
1643864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* elements() { return inputs_[0]; }
1644864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* key() { return inputs_[1]; }
1645864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  ElementsKind elements_kind() const {
1646864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    return hydrogen()->elements_kind();
1647864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
1648864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  bool is_external() const {
1649864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    return hydrogen()->is_external();
1650864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
1651864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  bool is_fixed_typed_array() const {
1652864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    return hydrogen()->is_fixed_typed_array();
1653864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
1654864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  bool is_typed_elements() const {
1655864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    return is_external() || is_fixed_typed_array();
1656864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
1657864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1658864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(LoadKeyed, "load-keyed")
1659864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(LoadKeyed)
1660864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1661864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE;
1662864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  uint32_t base_offset() const { return hydrogen()->base_offset(); }
1663864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  bool key_is_smi() {
1664864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    return hydrogen()->key()->representation().IsTagged();
1665864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
1666864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
1667864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1668864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1669864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orginline static bool ExternalArrayOpRequiresTemp(
1670864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    Representation key_representation,
1671864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    ElementsKind elements_kind) {
1672864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  // Operations that require the key to be divided by two to be converted into
1673864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  // an index cannot fold the scale operation into a load and need an extra
1674864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  // temp register to do the work.
1675864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  return key_representation.IsSmi() &&
1676864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org      (elements_kind == EXTERNAL_INT8_ELEMENTS ||
1677864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org       elements_kind == EXTERNAL_UINT8_ELEMENTS ||
1678864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org       elements_kind == EXTERNAL_UINT8_CLAMPED_ELEMENTS ||
1679864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org       elements_kind == UINT8_ELEMENTS ||
1680864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org       elements_kind == INT8_ELEMENTS ||
1681864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org       elements_kind == UINT8_CLAMPED_ELEMENTS);
1682864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org}
1683864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1684864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1685864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LLoadKeyedGeneric V8_FINAL : public LTemplateInstruction<1, 3, 0> {
1686864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
1687864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LLoadKeyedGeneric(LOperand* context, LOperand* obj, LOperand* key) {
1688864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = context;
1689864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[1] = obj;
1690864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[2] = key;
1691864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
1692864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1693864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* context() { return inputs_[0]; }
1694864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* object() { return inputs_[1]; }
1695864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* key() { return inputs_[2]; }
1696864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1697864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(LoadKeyedGeneric, "load-keyed-generic")
1698864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
1699864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1700864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1701864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LLoadGlobalCell V8_FINAL : public LTemplateInstruction<1, 0, 0> {
1702864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
1703864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(LoadGlobalCell, "load-global-cell")
1704864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(LoadGlobalCell)
1705864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
1706864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1707864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1708864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LLoadGlobalGeneric V8_FINAL : public LTemplateInstruction<1, 2, 0> {
1709864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
1710864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LLoadGlobalGeneric(LOperand* context, LOperand* global_object) {
1711864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = context;
1712864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[1] = global_object;
1713864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
1714864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1715864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* context() { return inputs_[0]; }
1716864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* global_object() { return inputs_[1]; }
1717864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1718864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(LoadGlobalGeneric, "load-global-generic")
1719864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(LoadGlobalGeneric)
1720864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1721864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  Handle<Object> name() const { return hydrogen()->name(); }
1722864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  bool for_typeof() const { return hydrogen()->for_typeof(); }
1723864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
1724864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1725864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1726864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LStoreGlobalCell V8_FINAL : public LTemplateInstruction<0, 1, 0> {
1727864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
1728864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  explicit LStoreGlobalCell(LOperand* value) {
1729864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = value;
1730864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
1731864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1732864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* value() { return inputs_[0]; }
1733864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1734864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(StoreGlobalCell, "store-global-cell")
1735864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(StoreGlobalCell)
1736864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
1737864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1738864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1739864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LLoadContextSlot V8_FINAL : public LTemplateInstruction<1, 1, 0> {
1740864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
1741864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  explicit LLoadContextSlot(LOperand* context) {
1742864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = context;
1743864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
1744864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1745864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* context() { return inputs_[0]; }
1746864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1747864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(LoadContextSlot, "load-context-slot")
1748864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(LoadContextSlot)
1749864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1750864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  int slot_index() { return hydrogen()->slot_index(); }
1751864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1752864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE;
1753864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
1754864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1755864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1756864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LStoreContextSlot V8_FINAL : public LTemplateInstruction<0, 2, 1> {
1757864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
1758864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LStoreContextSlot(LOperand* context, LOperand* value, LOperand* temp) {
1759864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = context;
1760864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[1] = value;
1761864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    temps_[0] = temp;
1762864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
1763864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1764864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* context() { return inputs_[0]; }
1765864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* value() { return inputs_[1]; }
1766864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* temp() { return temps_[0]; }
1767864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1768864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(StoreContextSlot, "store-context-slot")
1769864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(StoreContextSlot)
1770864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1771864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  int slot_index() { return hydrogen()->slot_index(); }
1772864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1773864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE;
1774864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
1775864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1776864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1777864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LPushArgument V8_FINAL : public LTemplateInstruction<0, 1, 0> {
1778864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
1779864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  explicit LPushArgument(LOperand* value) {
1780864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = value;
1781864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
1782864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1783864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* value() { return inputs_[0]; }
1784864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1785864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(PushArgument, "push-argument")
1786864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
1787864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1788864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1789864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LDrop V8_FINAL : public LTemplateInstruction<0, 0, 0> {
1790864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
1791864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  explicit LDrop(int count) : count_(count) { }
1792864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1793864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  int count() const { return count_; }
1794864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1795864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(Drop, "drop")
1796864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1797864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org private:
1798864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  int count_;
1799864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
1800864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1801864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
18023ee7a7ed19002e4a0efbf6cdb2a201f21763a80adanno@chromium.orgclass LStoreCodeEntry V8_FINAL: public LTemplateInstruction<0, 2, 0> {
1803864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
1804864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LStoreCodeEntry(LOperand* function, LOperand* code_object) {
1805864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = function;
18063ee7a7ed19002e4a0efbf6cdb2a201f21763a80adanno@chromium.org    inputs_[1] = code_object;
1807864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
1808864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1809864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* function() { return inputs_[0]; }
18103ee7a7ed19002e4a0efbf6cdb2a201f21763a80adanno@chromium.org  LOperand* code_object() { return inputs_[1]; }
1811864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1812864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream);
1813864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1814864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(StoreCodeEntry, "store-code-entry")
1815864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(StoreCodeEntry)
1816864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
1817864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1818864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1819864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LInnerAllocatedObject V8_FINAL: public LTemplateInstruction<1, 2, 0> {
1820864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
1821864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LInnerAllocatedObject(LOperand* base_object, LOperand* offset) {
1822864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = base_object;
1823864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[1] = offset;
1824864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
1825864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1826864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* base_object() const { return inputs_[0]; }
1827864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* offset() const { return inputs_[1]; }
1828864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1829864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream);
1830864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1831864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(InnerAllocatedObject, "inner-allocated-object")
1832864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
1833864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1834864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1835864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LThisFunction V8_FINAL : public LTemplateInstruction<1, 0, 0> {
1836864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
1837864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(ThisFunction, "this-function")
1838864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(ThisFunction)
1839864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
1840864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1841864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1842864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LContext V8_FINAL : public LTemplateInstruction<1, 0, 0> {
1843864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
1844864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(Context, "context")
1845864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(Context)
1846864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
1847864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1848864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1849864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LDeclareGlobals V8_FINAL : public LTemplateInstruction<0, 1, 0> {
1850864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
1851864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  explicit LDeclareGlobals(LOperand* context) {
1852864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = context;
1853864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
1854864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1855864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* context() { return inputs_[0]; }
1856864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1857864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(DeclareGlobals, "declare-globals")
1858864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(DeclareGlobals)
1859864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
1860864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1861864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1862864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LCallJSFunction V8_FINAL : public LTemplateInstruction<1, 1, 0> {
1863864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
1864864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  explicit LCallJSFunction(LOperand* function) {
1865864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = function;
1866864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
1867864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1868864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* function() { return inputs_[0]; }
1869864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1870864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(CallJSFunction, "call-js-function")
1871864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(CallJSFunction)
1872864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1873864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE;
1874864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1875864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  int arity() const { return hydrogen()->argument_count() - 1; }
1876864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
1877864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1878864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1879864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LCallWithDescriptor V8_FINAL : public LTemplateResultInstruction<1> {
1880864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
1881864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LCallWithDescriptor(const CallInterfaceDescriptor* descriptor,
1882196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org                      const ZoneList<LOperand*>& operands,
1883864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org                      Zone* zone)
1884864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    : inputs_(descriptor->environment_length() + 1, zone) {
1885864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    ASSERT(descriptor->environment_length() + 1 == operands.length());
1886864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_.AddAll(operands, zone);
1887864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
1888864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1889864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* target() const { return inputs_[0]; }
1890864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1891864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org private:
1892864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(CallWithDescriptor, "call-with-descriptor")
1893864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(CallWithDescriptor)
1894864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1895864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE;
1896864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1897864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  int arity() const { return hydrogen()->argument_count() - 1; }
1898864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1899864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  ZoneList<LOperand*> inputs_;
1900864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1901864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  // Iterator support.
1902864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual int InputCount() V8_FINAL V8_OVERRIDE { return inputs_.length(); }
1903864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual LOperand* InputAt(int i) V8_FINAL V8_OVERRIDE { return inputs_[i]; }
1904864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1905864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual int TempCount() V8_FINAL V8_OVERRIDE { return 0; }
1906864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual LOperand* TempAt(int i) V8_FINAL V8_OVERRIDE { return NULL; }
1907864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
1908864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1909864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1910864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LInvokeFunction V8_FINAL : public LTemplateInstruction<1, 2, 0> {
1911864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
1912864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LInvokeFunction(LOperand* context, LOperand* function) {
1913864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = context;
1914864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[1] = function;
1915864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
1916864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1917864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* context() { return inputs_[0]; }
1918864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* function() { return inputs_[1]; }
1919864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1920864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(InvokeFunction, "invoke-function")
1921864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(InvokeFunction)
1922864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1923864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE;
1924864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1925864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  int arity() const { return hydrogen()->argument_count() - 1; }
1926864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
1927864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1928864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1929864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LCallFunction V8_FINAL : public LTemplateInstruction<1, 2, 0> {
1930864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
1931864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  explicit LCallFunction(LOperand* context, LOperand* function) {
1932864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = context;
1933864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[1] = function;
1934864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
1935864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1936864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* context() { return inputs_[0]; }
1937864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* function() { return inputs_[1]; }
1938864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1939864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(CallFunction, "call-function")
1940864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(CallFunction)
1941864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1942864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  int arity() const { return hydrogen()->argument_count() - 1; }
1943864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
1944864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1945864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1946864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LCallNew V8_FINAL : public LTemplateInstruction<1, 2, 0> {
1947864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
1948864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LCallNew(LOperand* context, LOperand* constructor) {
1949864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = context;
1950864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[1] = constructor;
1951864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
1952864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1953864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* context() { return inputs_[0]; }
1954864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* constructor() { return inputs_[1]; }
1955864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1956864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(CallNew, "call-new")
1957864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(CallNew)
1958864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1959864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE;
1960864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1961864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  int arity() const { return hydrogen()->argument_count() - 1; }
1962864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
1963864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1964864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1965864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LCallNewArray V8_FINAL : public LTemplateInstruction<1, 2, 0> {
1966864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
1967864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LCallNewArray(LOperand* context, LOperand* constructor) {
1968864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = context;
1969864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[1] = constructor;
1970864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
1971864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1972864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* context() { return inputs_[0]; }
1973864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* constructor() { return inputs_[1]; }
1974864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1975864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(CallNewArray, "call-new-array")
1976864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(CallNewArray)
1977864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1978864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE;
1979864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1980864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  int arity() const { return hydrogen()->argument_count() - 1; }
1981864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
1982864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1983864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1984864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LCallRuntime V8_FINAL : public LTemplateInstruction<1, 1, 0> {
1985864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
1986864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  explicit LCallRuntime(LOperand* context) {
1987864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = context;
1988864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
1989864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1990864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* context() { return inputs_[0]; }
1991864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1992864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(CallRuntime, "call-runtime")
1993864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(CallRuntime)
1994864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1995864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual bool ClobbersDoubleRegisters(Isolate* isolate) const V8_OVERRIDE {
1996864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    return true;
1997864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
1998864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
1999864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  const Runtime::Function* function() const { return hydrogen()->function(); }
2000864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  int arity() const { return hydrogen()->argument_count(); }
2001864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
2002864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2003864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2004864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LInteger32ToDouble V8_FINAL : public LTemplateInstruction<1, 1, 0> {
2005864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
2006864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  explicit LInteger32ToDouble(LOperand* value) {
2007864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = value;
2008864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
2009864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2010864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* value() { return inputs_[0]; }
2011864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2012864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(Integer32ToDouble, "int32-to-double")
2013864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
2014864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2015864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2016864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LUint32ToDouble V8_FINAL : public LTemplateInstruction<1, 1, 1> {
2017864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
2018864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  explicit LUint32ToDouble(LOperand* value) {
2019864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = value;
2020864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
2021864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2022864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* value() { return inputs_[0]; }
2023864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2024864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(Uint32ToDouble, "uint32-to-double")
2025864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
2026864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2027864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2028864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LNumberTagI V8_FINAL : public LTemplateInstruction<1, 1, 1> {
2029864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
2030864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LNumberTagI(LOperand* value, LOperand* temp) {
2031864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = value;
2032864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    temps_[0] = temp;
2033864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
2034864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2035864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* value() { return inputs_[0]; }
2036864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* temp() { return temps_[0]; }
2037864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2038864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(NumberTagI, "number-tag-i")
2039864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
2040864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2041864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2042864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LNumberTagU V8_FINAL : public LTemplateInstruction<1, 1, 1> {
2043864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
2044864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LNumberTagU(LOperand* value, LOperand* temp) {
2045864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = value;
2046864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    temps_[0] = temp;
2047864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
2048864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2049864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* value() { return inputs_[0]; }
2050864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* temp() { return temps_[0]; }
2051864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2052864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(NumberTagU, "number-tag-u")
2053864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
2054864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2055864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2056864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LNumberTagD V8_FINAL : public LTemplateInstruction<1, 1, 1> {
2057864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
2058864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LNumberTagD(LOperand* value, LOperand* temp) {
2059864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = value;
2060864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    temps_[0] = temp;
2061864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
2062864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2063864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* value() { return inputs_[0]; }
2064864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* temp() { return temps_[0]; }
2065864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2066864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(NumberTagD, "number-tag-d")
2067864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(Change)
2068864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
2069864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2070864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2071864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// Sometimes truncating conversion from a tagged value to an int32.
2072864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LDoubleToI V8_FINAL : public LTemplateInstruction<1, 1, 0> {
2073864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
2074864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  explicit LDoubleToI(LOperand* value) {
2075864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = value;
2076864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
2077864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2078864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* value() { return inputs_[0]; }
2079864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2080864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(DoubleToI, "double-to-i")
2081864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(UnaryOperation)
2082864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2083864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  bool truncating() { return hydrogen()->CanTruncateToInt32(); }
2084864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
2085864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2086864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2087864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LDoubleToSmi V8_FINAL : public LTemplateInstruction<1, 1, 0> {
2088864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
2089864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  explicit LDoubleToSmi(LOperand* value) {
2090864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = value;
2091864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
2092864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2093864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* value() { return inputs_[0]; }
2094864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2095864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(DoubleToSmi, "double-to-smi")
2096864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(UnaryOperation)
2097864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
2098864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2099864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2100864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// Truncating conversion from a tagged value to an int32.
2101864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LTaggedToI V8_FINAL : public LTemplateInstruction<1, 1, 0> {
2102864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
2103864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  explicit LTaggedToI(LOperand* value) {
2104864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = value;
2105864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
2106864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2107864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* value() { return inputs_[0]; }
2108864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2109864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(TaggedToI, "tagged-to-i")
2110864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(Change)
2111864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2112864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  bool truncating() { return hydrogen()->CanTruncateToInt32(); }
2113864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
2114864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2115864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2116864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LSmiTag V8_FINAL : public LTemplateInstruction<1, 1, 0> {
2117864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
2118864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  explicit LSmiTag(LOperand* value) {
2119864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = value;
2120864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
2121864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2122864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* value() { return inputs_[0]; }
2123864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2124864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(SmiTag, "smi-tag")
2125864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(Change)
2126864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
2127864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2128864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2129864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LNumberUntagD V8_FINAL : public LTemplateInstruction<1, 1, 1> {
2130864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
2131864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  explicit LNumberUntagD(LOperand* value, LOperand* temp) {
2132864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = value;
2133864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    temps_[0] = temp;
2134864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
2135864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2136864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* value() { return inputs_[0]; }
2137864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* temp() { return temps_[0]; }
2138864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2139864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(NumberUntagD, "double-untag")
2140864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(Change);
2141864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
2142864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2143864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2144864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LSmiUntag V8_FINAL : public LTemplateInstruction<1, 1, 0> {
2145864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
2146864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LSmiUntag(LOperand* value, bool needs_check)
2147864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org      : needs_check_(needs_check) {
2148864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = value;
2149864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
2150864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2151864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* value() { return inputs_[0]; }
2152864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2153864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(SmiUntag, "smi-untag")
2154864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2155864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  bool needs_check() const { return needs_check_; }
2156864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2157864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org private:
2158864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  bool needs_check_;
2159864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
2160864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2161864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2162864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LStoreNamedField V8_FINAL : public LTemplateInstruction<0, 2, 2> {
2163864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
2164864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LStoreNamedField(LOperand* obj,
2165864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org                   LOperand* val,
2166864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org                   LOperand* temp,
2167864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org                   LOperand* temp_map) {
2168864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = obj;
2169864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[1] = val;
2170864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    temps_[0] = temp;
2171864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    temps_[1] = temp_map;
2172864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
2173864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2174864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* object() { return inputs_[0]; }
2175864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* value() { return inputs_[1]; }
2176864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* temp() { return temps_[0]; }
2177864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* temp_map() { return temps_[1]; }
2178864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2179864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(StoreNamedField, "store-named-field")
2180864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(StoreNamedField)
2181864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2182864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE;
2183864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
2184864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2185864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2186864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LStoreNamedGeneric V8_FINAL : public LTemplateInstruction<0, 3, 0> {
2187864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
2188864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LStoreNamedGeneric(LOperand* context, LOperand* object, LOperand* value) {
2189864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = context;
2190864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[1] = object;
2191864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[2] = value;
2192864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
2193864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2194864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* context() { return inputs_[0]; }
2195864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* object() { return inputs_[1]; }
2196864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* value() { return inputs_[2]; }
2197864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2198864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(StoreNamedGeneric, "store-named-generic")
2199864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(StoreNamedGeneric)
2200864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2201864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE;
2202864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  Handle<Object> name() const { return hydrogen()->name(); }
2203864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  StrictMode strict_mode() { return hydrogen()->strict_mode(); }
2204864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
2205864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2206864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2207864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LStoreKeyed V8_FINAL : public LTemplateInstruction<0, 3, 0> {
2208864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
2209864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LStoreKeyed(LOperand* obj, LOperand* key, LOperand* val) {
2210864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = obj;
2211864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[1] = key;
2212864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[2] = val;
2213864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
2214864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2215864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  bool is_external() const { return hydrogen()->is_external(); }
2216864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  bool is_fixed_typed_array() const {
2217864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    return hydrogen()->is_fixed_typed_array();
2218864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
2219864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  bool is_typed_elements() const {
2220864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    return is_external() || is_fixed_typed_array();
2221864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
2222864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* elements() { return inputs_[0]; }
2223864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* key() { return inputs_[1]; }
2224864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* value() { return inputs_[2]; }
2225864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  ElementsKind elements_kind() const {
2226864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    return hydrogen()->elements_kind();
2227864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
2228864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2229864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(StoreKeyed, "store-keyed")
2230864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(StoreKeyed)
2231864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2232864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE;
2233864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  uint32_t base_offset() const { return hydrogen()->base_offset(); }
2234864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  bool NeedsCanonicalization() { return hydrogen()->NeedsCanonicalization(); }
2235864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
2236864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2237864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2238864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LStoreKeyedGeneric V8_FINAL : public LTemplateInstruction<0, 4, 0> {
2239864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
2240864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LStoreKeyedGeneric(LOperand* context,
2241864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org                     LOperand* object,
2242864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org                     LOperand* key,
2243864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org                     LOperand* value) {
2244864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = context;
2245864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[1] = object;
2246864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[2] = key;
2247864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[3] = value;
2248864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
2249864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2250864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* context() { return inputs_[0]; }
2251864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* object() { return inputs_[1]; }
2252864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* key() { return inputs_[2]; }
2253864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* value() { return inputs_[3]; }
2254864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2255864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(StoreKeyedGeneric, "store-keyed-generic")
2256864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(StoreKeyedGeneric)
2257864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2258864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE;
2259864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2260864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  StrictMode strict_mode() { return hydrogen()->strict_mode(); }
2261864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
2262864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2263864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2264864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LTransitionElementsKind V8_FINAL : public LTemplateInstruction<0, 2, 2> {
2265864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
2266864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LTransitionElementsKind(LOperand* object,
2267864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org                          LOperand* context,
2268864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org                          LOperand* new_map_temp,
2269864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org                          LOperand* temp) {
2270864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = object;
2271864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[1] = context;
2272864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    temps_[0] = new_map_temp;
2273864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    temps_[1] = temp;
2274864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
2275864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2276864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* context() { return inputs_[1]; }
2277864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* object() { return inputs_[0]; }
2278864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* new_map_temp() { return temps_[0]; }
2279864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* temp() { return temps_[1]; }
2280864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2281864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(TransitionElementsKind,
2282864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org                               "transition-elements-kind")
2283864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(TransitionElementsKind)
2284864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2285864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE;
2286864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2287864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  Handle<Map> original_map() { return hydrogen()->original_map().handle(); }
2288864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  Handle<Map> transitioned_map() {
2289864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    return hydrogen()->transitioned_map().handle();
2290864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
2291864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  ElementsKind from_kind() { return hydrogen()->from_kind(); }
2292864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  ElementsKind to_kind() { return hydrogen()->to_kind(); }
2293864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
2294864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2295864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2296864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LTrapAllocationMemento V8_FINAL  : public LTemplateInstruction<0, 1, 1> {
2297864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
2298864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LTrapAllocationMemento(LOperand* object,
2299864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org                         LOperand* temp) {
2300864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = object;
2301864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    temps_[0] = temp;
2302864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
2303864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2304864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* object() { return inputs_[0]; }
2305864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* temp() { return temps_[0]; }
2306864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2307864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(TrapAllocationMemento,
2308864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org                               "trap-allocation-memento")
2309864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
2310864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2311864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2312864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LStringAdd V8_FINAL : public LTemplateInstruction<1, 3, 0> {
2313864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
2314864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LStringAdd(LOperand* context, LOperand* left, LOperand* right) {
2315864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = context;
2316864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[1] = left;
2317864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[2] = right;
2318864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
2319864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2320864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* context() { return inputs_[0]; }
2321864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* left() { return inputs_[1]; }
2322864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* right() { return inputs_[2]; }
2323864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2324864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(StringAdd, "string-add")
2325864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(StringAdd)
2326864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
2327864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2328864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2329864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LStringCharCodeAt V8_FINAL : public LTemplateInstruction<1, 3, 0> {
2330864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
2331864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LStringCharCodeAt(LOperand* context, LOperand* string, LOperand* index) {
2332864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = context;
2333864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[1] = string;
2334864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[2] = index;
2335864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
2336864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2337864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* context() { return inputs_[0]; }
2338864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* string() { return inputs_[1]; }
2339864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* index() { return inputs_[2]; }
2340864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2341864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(StringCharCodeAt, "string-char-code-at")
2342864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(StringCharCodeAt)
2343864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
2344864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2345864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2346864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LStringCharFromCode V8_FINAL : public LTemplateInstruction<1, 2, 0> {
2347864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
2348864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LStringCharFromCode(LOperand* context, LOperand* char_code) {
2349864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = context;
2350864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[1] = char_code;
2351864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
2352864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2353864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* context() { return inputs_[0]; }
2354864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* char_code() { return inputs_[1]; }
2355864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2356864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(StringCharFromCode, "string-char-from-code")
2357864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(StringCharFromCode)
2358864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
2359864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2360864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2361864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LCheckValue V8_FINAL : public LTemplateInstruction<0, 1, 0> {
2362864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
2363864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  explicit LCheckValue(LOperand* value) {
2364864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = value;
2365864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
2366864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2367864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* value() { return inputs_[0]; }
2368864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2369864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(CheckValue, "check-value")
2370864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(CheckValue)
2371864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
2372864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2373864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2374864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LCheckInstanceType V8_FINAL : public LTemplateInstruction<0, 1, 1> {
2375864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
2376864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LCheckInstanceType(LOperand* value, LOperand* temp) {
2377864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = value;
2378864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    temps_[0] = temp;
2379864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
2380864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2381864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* value() { return inputs_[0]; }
2382864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* temp() { return temps_[0]; }
2383864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2384864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(CheckInstanceType, "check-instance-type")
2385864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(CheckInstanceType)
2386864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
2387864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2388864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2389864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LCheckMaps V8_FINAL : public LTemplateInstruction<0, 1, 0> {
2390864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
2391864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  explicit LCheckMaps(LOperand* value = NULL) {
2392864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = value;
2393864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
2394864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2395864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* value() { return inputs_[0]; }
2396864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2397864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(CheckMaps, "check-maps")
2398864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(CheckMaps)
2399864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
2400864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2401864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2402864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LCheckSmi V8_FINAL : public LTemplateInstruction<1, 1, 0> {
2403864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
2404864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  explicit LCheckSmi(LOperand* value) {
2405864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = value;
2406864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
2407864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2408864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* value() { return inputs_[0]; }
2409864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2410864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(CheckSmi, "check-smi")
2411864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
2412864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2413864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2414864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LClampDToUint8 V8_FINAL : public LTemplateInstruction<1, 1, 0> {
2415864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
2416864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  explicit LClampDToUint8(LOperand* value) {
2417864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = value;
2418864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
2419864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2420864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* unclamped() { return inputs_[0]; }
2421864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2422864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(ClampDToUint8, "clamp-d-to-uint8")
2423864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
2424864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2425864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2426864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LClampIToUint8 V8_FINAL : public LTemplateInstruction<1, 1, 0> {
2427864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
2428864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  explicit LClampIToUint8(LOperand* value) {
2429864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = value;
2430864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
2431864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2432864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* unclamped() { return inputs_[0]; }
2433864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2434864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(ClampIToUint8, "clamp-i-to-uint8")
2435864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
2436864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2437864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2438864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org// Truncating conversion from a tagged value to an int32.
2439864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LClampTToUint8NoSSE2 V8_FINAL : public LTemplateInstruction<1, 1, 3> {
2440864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
2441864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LClampTToUint8NoSSE2(LOperand* unclamped,
2442864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org                       LOperand* temp1,
2443864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org                       LOperand* temp2,
2444864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org                       LOperand* temp3) {
2445864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = unclamped;
2446864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    temps_[0] = temp1;
2447864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    temps_[1] = temp2;
2448864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    temps_[2] = temp3;
2449864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
2450864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2451864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* unclamped() { return inputs_[0]; }
2452864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* scratch() { return temps_[0]; }
2453864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* scratch2() { return temps_[1]; }
2454864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* scratch3() { return temps_[2]; }
2455864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2456864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(ClampTToUint8NoSSE2,
2457864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org                               "clamp-t-to-uint8-nosse2")
2458864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(UnaryOperation)
2459864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
2460864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2461864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2462864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LCheckNonSmi V8_FINAL : public LTemplateInstruction<0, 1, 0> {
2463864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
2464864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  explicit LCheckNonSmi(LOperand* value) {
2465864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = value;
2466864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
2467864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2468864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* value() { return inputs_[0]; }
2469864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2470864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(CheckNonSmi, "check-non-smi")
2471864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(CheckHeapObject)
2472864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
2473864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2474864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2475864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LDoubleBits V8_FINAL : public LTemplateInstruction<1, 1, 0> {
2476864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
2477864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  explicit LDoubleBits(LOperand* value) {
2478864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = value;
2479864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
2480864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2481864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* value() { return inputs_[0]; }
2482864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2483864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(DoubleBits, "double-bits")
2484864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(DoubleBits)
2485864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
2486864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2487864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2488864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LConstructDouble V8_FINAL : public LTemplateInstruction<1, 2, 0> {
2489864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
2490864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LConstructDouble(LOperand* hi, LOperand* lo) {
2491864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = hi;
2492864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[1] = lo;
2493864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
2494864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2495864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* hi() { return inputs_[0]; }
2496864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* lo() { return inputs_[1]; }
2497864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2498864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(ConstructDouble, "construct-double")
2499864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
2500864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2501864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2502864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LAllocate V8_FINAL : public LTemplateInstruction<1, 2, 1> {
2503864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
2504864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LAllocate(LOperand* context, LOperand* size, LOperand* temp) {
2505864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = context;
2506864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[1] = size;
2507864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    temps_[0] = temp;
2508864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
2509864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2510864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* context() { return inputs_[0]; }
2511864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* size() { return inputs_[1]; }
2512864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* temp() { return temps_[0]; }
2513864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2514864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(Allocate, "allocate")
2515864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(Allocate)
2516864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
2517864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2518864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2519864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LRegExpLiteral V8_FINAL : public LTemplateInstruction<1, 1, 0> {
2520864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
2521864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  explicit LRegExpLiteral(LOperand* context) {
2522864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = context;
2523864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
2524864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2525864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* context() { return inputs_[0]; }
2526864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2527864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(RegExpLiteral, "regexp-literal")
2528864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(RegExpLiteral)
2529864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
2530864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2531864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2532864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LFunctionLiteral V8_FINAL : public LTemplateInstruction<1, 1, 0> {
2533864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
2534864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  explicit LFunctionLiteral(LOperand* context) {
2535864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = context;
2536864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
2537864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2538864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* context() { return inputs_[0]; }
2539864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2540864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(FunctionLiteral, "function-literal")
2541864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(FunctionLiteral)
2542864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
2543864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2544864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2545864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LToFastProperties V8_FINAL : public LTemplateInstruction<1, 1, 0> {
2546864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
2547864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  explicit LToFastProperties(LOperand* value) {
2548864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = value;
2549864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
2550864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2551864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* value() { return inputs_[0]; }
2552864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2553864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(ToFastProperties, "to-fast-properties")
2554864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(ToFastProperties)
2555864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
2556864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2557864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2558864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LTypeof V8_FINAL : public LTemplateInstruction<1, 2, 0> {
2559864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
2560864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LTypeof(LOperand* context, LOperand* value) {
2561864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = context;
2562864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[1] = value;
2563864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
2564864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2565864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* context() { return inputs_[0]; }
2566864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* value() { return inputs_[1]; }
2567864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2568864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(Typeof, "typeof")
2569864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
2570864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2571864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2572864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LTypeofIsAndBranch V8_FINAL : public LControlInstruction<1, 0> {
2573864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
2574864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  explicit LTypeofIsAndBranch(LOperand* value) {
2575864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = value;
2576864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
2577864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2578864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* value() { return inputs_[0]; }
2579864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2580864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(TypeofIsAndBranch, "typeof-is-and-branch")
2581864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(TypeofIsAndBranch)
2582864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2583864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  Handle<String> type_literal() { return hydrogen()->type_literal(); }
2584864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2585864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE;
2586864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
2587864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2588864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2589864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LOsrEntry V8_FINAL : public LTemplateInstruction<0, 0, 0> {
2590864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
2591864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual bool HasInterestingComment(LCodeGen* gen) const V8_OVERRIDE {
2592864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    return false;
2593864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
2594864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(OsrEntry, "osr-entry")
2595864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
2596864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2597864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2598864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LStackCheck V8_FINAL : public LTemplateInstruction<0, 1, 0> {
2599864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
2600864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  explicit LStackCheck(LOperand* context) {
2601864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = context;
2602864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
2603864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2604864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* context() { return inputs_[0]; }
2605864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2606864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(StackCheck, "stack-check")
2607864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(StackCheck)
2608864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2609864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  Label* done_label() { return &done_label_; }
2610864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2611864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org private:
2612864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  Label done_label_;
2613864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
2614864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2615864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2616864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LForInPrepareMap V8_FINAL : public LTemplateInstruction<1, 2, 0> {
2617864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
2618864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LForInPrepareMap(LOperand* context, LOperand* object) {
2619864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = context;
2620864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[1] = object;
2621864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
2622864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2623864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* context() { return inputs_[0]; }
2624864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* object() { return inputs_[1]; }
2625864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2626864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(ForInPrepareMap, "for-in-prepare-map")
2627864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
2628864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2629864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2630864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LForInCacheArray V8_FINAL : public LTemplateInstruction<1, 1, 0> {
2631864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
2632864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  explicit LForInCacheArray(LOperand* map) {
2633864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = map;
2634864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
2635864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2636864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* map() { return inputs_[0]; }
2637864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2638864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(ForInCacheArray, "for-in-cache-array")
2639864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2640864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  int idx() {
2641864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    return HForInCacheArray::cast(this->hydrogen_value())->idx();
2642864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
2643864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
2644864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2645864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2646864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LCheckMapValue V8_FINAL : public LTemplateInstruction<0, 2, 0> {
2647864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
2648864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LCheckMapValue(LOperand* value, LOperand* map) {
2649864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = value;
2650864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[1] = map;
2651864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
2652864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2653864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* value() { return inputs_[0]; }
2654864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* map() { return inputs_[1]; }
2655864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2656864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(CheckMapValue, "check-map-value")
2657864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
2658864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2659864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2660864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LLoadFieldByIndex V8_FINAL : public LTemplateInstruction<1, 2, 0> {
2661864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
2662864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LLoadFieldByIndex(LOperand* object, LOperand* index) {
2663864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[0] = object;
2664864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    inputs_[1] = index;
2665864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  }
2666864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2667864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* object() { return inputs_[0]; }
2668864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* index() { return inputs_[1]; }
2669864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2670864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(LoadFieldByIndex, "load-field-by-index")
2671864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
2672864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2673864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2674e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.orgclass LStoreFrameContext: public LTemplateInstruction<0, 1, 0> {
2675e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org public:
2676e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org  explicit LStoreFrameContext(LOperand* context) {
2677e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org    inputs_[0] = context;
2678e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org  }
2679e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org
2680e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org  LOperand* context() { return inputs_[0]; }
2681e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org
2682e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(StoreFrameContext, "store-frame-context")
2683e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org};
2684e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org
2685e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org
2686e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.orgclass LAllocateBlockContext: public LTemplateInstruction<1, 2, 0> {
2687e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org public:
2688e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org  LAllocateBlockContext(LOperand* context, LOperand* function) {
2689e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org    inputs_[0] = context;
2690e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org    inputs_[1] = function;
2691e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org  }
2692e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org
2693e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org  LOperand* context() { return inputs_[0]; }
2694e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org  LOperand* function() { return inputs_[1]; }
2695e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org
2696e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org  Handle<ScopeInfo> scope_info() { return hydrogen()->scope_info(); }
2697e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org
2698e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(AllocateBlockContext, "allocate-block-context")
2699e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(AllocateBlockContext)
2700e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org};
2701e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org
2702e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org
2703864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LChunkBuilder;
2704864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LPlatformChunk V8_FINAL : public LChunk {
2705864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
2706864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LPlatformChunk(CompilationInfo* info, HGraph* graph)
2707864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org      : LChunk(info, graph),
2708864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org        num_double_slots_(0) { }
2709864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2710864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  int GetNextSpillIndex(RegisterKind kind);
2711864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* GetNextSpillSlot(RegisterKind kind);
2712864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2713864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  int num_double_slots() const { return num_double_slots_; }
2714864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2715864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org private:
2716864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  int num_double_slots_;
2717864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
2718864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2719864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2720864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.orgclass LChunkBuilder V8_FINAL : public LChunkBuilderBase {
2721864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org public:
2722864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LChunkBuilder(CompilationInfo* info, HGraph* graph, LAllocator* allocator)
2723864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org      : LChunkBuilderBase(graph->zone()),
2724864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org        chunk_(NULL),
2725864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org        info_(info),
2726864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org        graph_(graph),
2727864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org        status_(UNUSED),
2728864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org        current_instruction_(NULL),
2729864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org        current_block_(NULL),
2730864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org        next_block_(NULL),
2731864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org        allocator_(allocator) { }
2732864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2733864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  Isolate* isolate() const { return graph_->isolate(); }
2734864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2735864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  // Build the sequence for the graph.
2736864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LPlatformChunk* Build();
2737864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2738864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  // Declare methods that deal with the individual node types.
2739864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org#define DECLARE_DO(type) LInstruction* Do##type(H##type* node);
2740864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  HYDROGEN_CONCRETE_INSTRUCTION_LIST(DECLARE_DO)
2741864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org#undef DECLARE_DO
2742864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2743864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LInstruction* DoMathFloor(HUnaryMathOperation* instr);
2744864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LInstruction* DoMathRound(HUnaryMathOperation* instr);
2745864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LInstruction* DoMathAbs(HUnaryMathOperation* instr);
2746864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LInstruction* DoMathLog(HUnaryMathOperation* instr);
2747864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LInstruction* DoMathExp(HUnaryMathOperation* instr);
2748864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LInstruction* DoMathSqrt(HUnaryMathOperation* instr);
2749864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LInstruction* DoMathPowHalf(HUnaryMathOperation* instr);
2750864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LInstruction* DoMathClz32(HUnaryMathOperation* instr);
2751864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LInstruction* DoDivByPowerOf2I(HDiv* instr);
2752864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LInstruction* DoDivByConstI(HDiv* instr);
2753864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LInstruction* DoDivI(HDiv* instr);
2754864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LInstruction* DoModByPowerOf2I(HMod* instr);
2755864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LInstruction* DoModByConstI(HMod* instr);
2756864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LInstruction* DoModI(HMod* instr);
2757864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LInstruction* DoFlooringDivByPowerOf2I(HMathFloorOfDiv* instr);
2758864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LInstruction* DoFlooringDivByConstI(HMathFloorOfDiv* instr);
2759864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LInstruction* DoFlooringDivI(HMathFloorOfDiv* instr);
2760864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2761864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org private:
2762864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  enum Status {
2763864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    UNUSED,
2764864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    BUILDING,
2765864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    DONE,
2766864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org    ABORTED
2767864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  };
2768864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2769864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LPlatformChunk* chunk() const { return chunk_; }
2770864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  CompilationInfo* info() const { return info_; }
2771864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  HGraph* graph() const { return graph_; }
2772864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2773864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  bool is_unused() const { return status_ == UNUSED; }
2774864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  bool is_building() const { return status_ == BUILDING; }
2775864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  bool is_done() const { return status_ == DONE; }
2776864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  bool is_aborted() const { return status_ == ABORTED; }
2777864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2778864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  void Abort(BailoutReason reason);
2779864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2780864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  // Methods for getting operands for Use / Define / Temp.
2781864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LUnallocated* ToUnallocated(Register reg);
2782864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LUnallocated* ToUnallocated(X87Register reg);
2783864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2784864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  // Methods for setting up define-use relationships.
2785864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  MUST_USE_RESULT LOperand* Use(HValue* value, LUnallocated* operand);
2786864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  MUST_USE_RESULT LOperand* UseFixed(HValue* value, Register fixed_register);
2787864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2788864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  // A value that is guaranteed to be allocated to a register.
2789864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  // Operand created by UseRegister is guaranteed to be live until the end of
2790864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  // instruction. This means that register allocator will not reuse it's
2791864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  // register for any other operand inside instruction.
2792864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  // Operand created by UseRegisterAtStart is guaranteed to be live only at
2793864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  // instruction start. Register allocator is free to assign the same register
2794864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  // to some other operand used inside instruction (i.e. temporary or
2795864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  // output).
2796864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  MUST_USE_RESULT LOperand* UseRegister(HValue* value);
2797864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  MUST_USE_RESULT LOperand* UseRegisterAtStart(HValue* value);
2798864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2799864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  // An input operand in a register that may be trashed.
2800864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  MUST_USE_RESULT LOperand* UseTempRegister(HValue* value);
2801864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2802864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  // An input operand in a register or stack slot.
2803864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  MUST_USE_RESULT LOperand* Use(HValue* value);
2804864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  MUST_USE_RESULT LOperand* UseAtStart(HValue* value);
2805864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2806864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  // An input operand in a register, stack slot or a constant operand.
2807864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  MUST_USE_RESULT LOperand* UseOrConstant(HValue* value);
2808864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  MUST_USE_RESULT LOperand* UseOrConstantAtStart(HValue* value);
2809864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2810864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  // An input operand in a fixed register or a constant operand.
2811864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  MUST_USE_RESULT LOperand* UseFixedOrConstant(HValue* value,
2812864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org                                               Register fixed_register);
2813864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2814864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  // An input operand in a register or a constant operand.
2815864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  MUST_USE_RESULT LOperand* UseRegisterOrConstant(HValue* value);
2816864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  MUST_USE_RESULT LOperand* UseRegisterOrConstantAtStart(HValue* value);
2817864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2818864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  // An input operand in a constant operand.
2819864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  MUST_USE_RESULT LOperand* UseConstant(HValue* value);
2820864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2821864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  // An input operand in register, stack slot or a constant operand.
2822864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  // Will not be moved to a register even if one is freely available.
2823864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  virtual MUST_USE_RESULT LOperand* UseAny(HValue* value) V8_OVERRIDE;
2824864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2825864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  // Temporary operand that must be in a register.
2826864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  MUST_USE_RESULT LUnallocated* TempRegister();
2827864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  MUST_USE_RESULT LOperand* FixedTemp(Register reg);
2828864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2829864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  // Methods for setting up define-use relationships.
2830864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  // Return the same instruction that they are passed.
2831864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LInstruction* Define(LTemplateResultInstruction<1>* instr,
2832864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org                       LUnallocated* result);
2833864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LInstruction* DefineAsRegister(LTemplateResultInstruction<1>* instr);
2834864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LInstruction* DefineAsSpilled(LTemplateResultInstruction<1>* instr,
2835864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org                                int index);
2836864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LInstruction* DefineSameAsFirst(LTemplateResultInstruction<1>* instr);
2837864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LInstruction* DefineFixed(LTemplateResultInstruction<1>* instr,
2838864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org                            Register reg);
2839864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LInstruction* DefineX87TOS(LTemplateResultInstruction<1>* instr);
2840864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  // Assigns an environment to an instruction.  An instruction which can
2841864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  // deoptimize must have an environment.
2842864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LInstruction* AssignEnvironment(LInstruction* instr);
2843864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  // Assigns a pointer map to an instruction.  An instruction which can
2844864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  // trigger a GC or a lazy deoptimization must have a pointer map.
2845864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LInstruction* AssignPointerMap(LInstruction* instr);
2846864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2847864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  enum CanDeoptimize { CAN_DEOPTIMIZE_EAGERLY, CANNOT_DEOPTIMIZE_EAGERLY };
2848864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2849864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* GetSeqStringSetCharOperand(HSeqStringSetChar* instr);
2850864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2851864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  // Marks a call for the register allocator.  Assigns a pointer map to
2852864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  // support GC and lazy deoptimization.  Assigns an environment to support
2853864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  // eager deoptimization if CAN_DEOPTIMIZE_EAGERLY.
2854864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LInstruction* MarkAsCall(
2855864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org      LInstruction* instr,
2856864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org      HInstruction* hinstr,
2857864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org      CanDeoptimize can_deoptimize = CANNOT_DEOPTIMIZE_EAGERLY);
2858864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2859864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  void VisitInstruction(HInstruction* current);
2860864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  void AddInstruction(LInstruction* instr, HInstruction* current);
2861864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2862864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  void DoBasicBlock(HBasicBlock* block, HBasicBlock* next_block);
2863864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LInstruction* DoShift(Token::Value op, HBitwiseBinaryOperation* instr);
2864864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LInstruction* DoArithmeticD(Token::Value op,
2865864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org                              HArithmeticBinaryOperation* instr);
2866864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LInstruction* DoArithmeticT(Token::Value op,
2867864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org                              HBinaryOperation* instr);
2868864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2869864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LOperand* GetStoreKeyedValueOperand(HStoreKeyed* instr);
2870864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2871864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LPlatformChunk* chunk_;
2872864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  CompilationInfo* info_;
2873864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  HGraph* const graph_;
2874864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  Status status_;
2875864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  HInstruction* current_instruction_;
2876864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  HBasicBlock* current_block_;
2877864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  HBasicBlock* next_block_;
2878864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  LAllocator* allocator_;
2879864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2880864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org  DISALLOW_COPY_AND_ASSIGN(LChunkBuilder);
2881864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org};
2882864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2883864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org#undef DECLARE_HYDROGEN_ACCESSOR
2884864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org#undef DECLARE_CONCRETE_INSTRUCTION
2885864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2886864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org} }  // namespace v8::internal
2887864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org
2888864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org#endif  // V8_X87_LITHIUM_X87_H_
2889