1f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com// Copyright 2012 the V8 project authors. All rights reserved.
23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// Use of this source code is governed by a BSD-style license that can be
33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// found in the LICENSE file.
47516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
57516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org#ifndef V8_MIPS_LITHIUM_MIPS_H_
67516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org#define V8_MIPS_LITHIUM_MIPS_H_
77516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
8196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/hydrogen.h"
9196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/lithium.h"
104b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org#include "src/lithium-allocator.h"
11196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/safepoint-table.h"
12196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/utils.h"
137516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
147516f05132429850aa326421ed3e25f23b4c071blrn@chromium.orgnamespace v8 {
157516f05132429850aa326421ed3e25f23b4c071blrn@chromium.orgnamespace internal {
167516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
17c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org// Forward declarations.
18c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgclass LCodeGen;
19c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
20dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org#define LITHIUM_CONCRETE_INSTRUCTION_LIST(V) \
21dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(AccessArgumentsAt)                       \
22dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(AddI)                                    \
23dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(Allocate)                                \
24dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(AllocateBlockContext)                    \
25dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(ApplyArguments)                          \
26dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(ArgumentsElements)                       \
27dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(ArgumentsLength)                         \
28dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(ArithmeticD)                             \
29dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(ArithmeticT)                             \
30dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(BitI)                                    \
31dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(BoundsCheck)                             \
32dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(Branch)                                  \
33dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(CallJSFunction)                          \
34dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(CallWithDescriptor)                      \
35dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(CallFunction)                            \
36dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(CallNew)                                 \
37dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(CallNewArray)                            \
38dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(CallRuntime)                             \
39dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(CallStub)                                \
40dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(CheckInstanceType)                       \
41dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(CheckMaps)                               \
42dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(CheckMapValue)                           \
43dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(CheckNonSmi)                             \
44dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(CheckSmi)                                \
45dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(CheckValue)                              \
46dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(ClampDToUint8)                           \
47dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(ClampIToUint8)                           \
48dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(ClampTToUint8)                           \
49dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(ClassOfTestAndBranch)                    \
50dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(CompareMinusZeroAndBranch)               \
51dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(CompareNumericAndBranch)                 \
52dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(CmpObjectEqAndBranch)                    \
53dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(CmpHoleAndBranch)                        \
54dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(CmpMapAndBranch)                         \
55dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(CmpT)                                    \
56dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(ConstantD)                               \
57dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(ConstantE)                               \
58dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(ConstantI)                               \
59dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(ConstantS)                               \
60dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(ConstantT)                               \
61dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(ConstructDouble)                         \
62dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(Context)                                 \
63dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(DateField)                               \
64dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(DebugBreak)                              \
65dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(DeclareGlobals)                          \
66dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(Deoptimize)                              \
67dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(DivByConstI)                             \
68dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(DivByPowerOf2I)                          \
69dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(DivI)                                    \
70dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(DoubleToI)                               \
71dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(DoubleBits)                              \
72dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(DoubleToSmi)                             \
73dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(Drop)                                    \
74dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(Dummy)                                   \
75dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(DummyUse)                                \
76dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(FlooringDivByConstI)                     \
77dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(FlooringDivByPowerOf2I)                  \
78dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(FlooringDivI)                            \
79dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(ForInCacheArray)                         \
80dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(ForInPrepareMap)                         \
81dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(FunctionLiteral)                         \
82dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(GetCachedArrayIndex)                     \
83dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(Goto)                                    \
84dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(HasCachedArrayIndexAndBranch)            \
85dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(HasInstanceTypeAndBranch)                \
86dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(InnerAllocatedObject)                    \
87dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(InstanceOf)                              \
88dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(InstanceOfKnownGlobal)                   \
89dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(InstructionGap)                          \
90dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(Integer32ToDouble)                       \
91dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(InvokeFunction)                          \
92dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(IsConstructCallAndBranch)                \
93dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(IsObjectAndBranch)                       \
94dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(IsStringAndBranch)                       \
95dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(IsSmiAndBranch)                          \
96dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(IsUndetectableAndBranch)                 \
97dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(Label)                                   \
98dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(LazyBailout)                             \
99dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(LoadContextSlot)                         \
100dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(LoadRoot)                                \
101dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(LoadFieldByIndex)                        \
102dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(LoadFunctionPrototype)                   \
103dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(LoadGlobalCell)                          \
104dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(LoadGlobalGeneric)                       \
105dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(LoadKeyed)                               \
106dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(LoadKeyedGeneric)                        \
107dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(LoadNamedField)                          \
108dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(LoadNamedGeneric)                        \
109dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(MapEnumLength)                           \
110dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(MathAbs)                                 \
111dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(MathExp)                                 \
112dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(MathClz32)                               \
113dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(MathFloor)                               \
114dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(MathFround)                              \
115dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(MathLog)                                 \
116dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(MathMinMax)                              \
117dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(MathPowHalf)                             \
118dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(MathRound)                               \
119dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(MathSqrt)                                \
120dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(ModByConstI)                             \
121dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(ModByPowerOf2I)                          \
122dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(ModI)                                    \
123dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(MulI)                                    \
124dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(MultiplyAddD)                            \
125dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(NumberTagD)                              \
126dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(NumberTagI)                              \
127dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(NumberTagU)                              \
128dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(NumberUntagD)                            \
129dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(OsrEntry)                                \
130dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(Parameter)                               \
131dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(Power)                                   \
132dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(PushArgument)                            \
133dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(RegExpLiteral)                           \
134dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(Return)                                  \
135dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(SeqStringGetChar)                        \
136dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(SeqStringSetChar)                        \
137dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(ShiftI)                                  \
138dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(SmiTag)                                  \
139dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(SmiUntag)                                \
140dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(StackCheck)                              \
141dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(StoreCodeEntry)                          \
142dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(StoreContextSlot)                        \
143dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(StoreFrameContext)                       \
144dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(StoreGlobalCell)                         \
145dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(StoreKeyed)                              \
146dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(StoreKeyedGeneric)                       \
147dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(StoreNamedField)                         \
148dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(StoreNamedGeneric)                       \
149dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(StringAdd)                               \
150dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(StringCharCodeAt)                        \
151dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(StringCharFromCode)                      \
152dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(StringCompareAndBranch)                  \
153dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(SubI)                                    \
154dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(TaggedToI)                               \
155e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org  V(TailCallThroughMegamorphicCache)         \
156dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(ThisFunction)                            \
157dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(ToFastProperties)                        \
158dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(TransitionElementsKind)                  \
159dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(TrapAllocationMemento)                   \
160dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(Typeof)                                  \
161dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(TypeofIsAndBranch)                       \
162dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(Uint32ToDouble)                          \
163dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  V(UnknownOSRValue)                         \
164c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org  V(WrapReceiver)
165c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
16632cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org#define DECLARE_CONCRETE_INSTRUCTION(type, mnemonic)                        \
167ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual Opcode opcode() const FINAL OVERRIDE {                      \
16832cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org    return LInstruction::k##type;                                           \
16932cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org  }                                                                         \
170ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void CompileToNative(LCodeGen* generator) FINAL OVERRIDE;   \
171ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual const char* Mnemonic() const FINAL OVERRIDE {               \
17232cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org    return mnemonic;                                                        \
17332cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org  }                                                                         \
17432cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org  static L##type* cast(LInstruction* instr) {                               \
175e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->Is##type());                                              \
17632cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org    return reinterpret_cast<L##type*>(instr);                               \
177c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
178c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
179c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
180c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org#define DECLARE_HYDROGEN_ACCESSOR(type)     \
181c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  H##type* hydrogen() const {               \
182c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    return H##type::cast(hydrogen_value()); \
183c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
184c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
185c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
18632cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.orgclass LInstruction : public ZoneObject {
187c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
188c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LInstruction()
189594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org      : environment_(NULL),
190594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org        hydrogen_value_(NULL),
191594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org        bit_field_(IsCallBits::encode(false)) {
192594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  }
193594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
19432cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org  virtual ~LInstruction() {}
195c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
196c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  virtual void CompileToNative(LCodeGen* generator) = 0;
197c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  virtual const char* Mnemonic() const = 0;
198c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  virtual void PrintTo(StringStream* stream);
19988d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.org  virtual void PrintDataTo(StringStream* stream);
20088d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.org  virtual void PrintOutputOperandTo(StringStream* stream);
201c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
202c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  enum Opcode {
203c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    // Declare a unique enum value for each instruction.
204c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org#define DECLARE_OPCODE(type) k##type,
205c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    LITHIUM_CONCRETE_INSTRUCTION_LIST(DECLARE_OPCODE)
206c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    kNumberOfInstructions
207c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org#undef DECLARE_OPCODE
208c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  };
209c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
210c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  virtual Opcode opcode() const = 0;
211c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
212c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  // Declare non-virtual type testers for all leaf IR classes.
213c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org#define DECLARE_PREDICATE(type) \
214c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  bool Is##type() const { return opcode() == k##type; }
215c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LITHIUM_CONCRETE_INSTRUCTION_LIST(DECLARE_PREDICATE)
216c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org#undef DECLARE_PREDICATE
217c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
218c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  // Declare virtual predicates for instructions that don't have
219c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  // an opcode.
220c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  virtual bool IsGap() const { return false; }
221c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
222c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  virtual bool IsControl() const { return false; }
223c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  // Try deleting this instruction if possible.
2257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  virtual bool TryDelete() { return false; }
2267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
227c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  void set_environment(LEnvironment* env) { environment_ = env; }
228c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LEnvironment* environment() const { return environment_; }
229c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  bool HasEnvironment() const { return environment_ != NULL; }
230c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
231c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  void set_pointer_map(LPointerMap* p) { pointer_map_.set(p); }
232c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LPointerMap* pointer_map() const { return pointer_map_.get(); }
233c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  bool HasPointerMap() const { return pointer_map_.is_set(); }
234c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
235c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  void set_hydrogen_value(HValue* value) { hydrogen_value_ = value; }
236c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  HValue* hydrogen_value() const { return hydrogen_value_; }
237c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2381044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org  virtual void SetDeferredLazyDeoptimizationEnvironment(LEnvironment* env) { }
239c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
240594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  void MarkAsCall() { bit_field_ = IsCallBits::update(bit_field_, true); }
241594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  bool IsCall() const { return IsCallBits::decode(bit_field_); }
242c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
243c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  // Interface to the register allocator and iterators.
244594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  bool ClobbersTemps() const { return IsCall(); }
245594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  bool ClobbersRegisters() const { return IsCall(); }
246a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  virtual bool ClobbersDoubleRegisters(Isolate* isolate) const {
247a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org    return IsCall();
248a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  }
24959297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org
25059297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org  // Interface to the register allocator and iterators.
251594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  bool IsMarkedAsCall() const { return IsCall(); }
252c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
253c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  virtual bool HasResult() const = 0;
254d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  virtual LOperand* result() const = 0;
255c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
256c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LOperand* FirstInput() { return InputAt(0); }
257c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LOperand* Output() { return HasResult() ? result() : NULL; }
258c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
25932d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  virtual bool HasInterestingComment(LCodeGen* gen) const { return true; }
26032d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org
261c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org#ifdef DEBUG
262c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  void VerifyCall();
263c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org#endif
264c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  virtual int InputCount() = 0;
2667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  virtual LOperand* InputAt(int i) = 0;
2677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
268c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org private:
26946839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  // Iterator interface.
27046839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  friend class InputIterator;
27146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org
272c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  friend class TempIterator;
273c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  virtual int TempCount() = 0;
274c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  virtual LOperand* TempAt(int i) = 0;
275c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
276594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  class IsCallBits: public BitField<bool, 0, 1> {};
277594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
278c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LEnvironment* environment_;
279c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  SetOncePointer<LPointerMap> pointer_map_;
280c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  HValue* hydrogen_value_;
281594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  int bit_field_;
282c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
283c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
284c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
285c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org// R = number of result operands (0 or 1).
28626ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.orgtemplate<int R>
28726ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.orgclass LTemplateResultInstruction : public LInstruction {
288c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
289c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  // Allow 0 or 1 output operands.
290c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  STATIC_ASSERT(R == 0 || R == 1);
291ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual bool HasResult() const FINAL OVERRIDE {
29232cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org    return R != 0 && result() != NULL;
29332cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org  }
294c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  void set_result(LOperand* operand) { results_[0] = operand; }
295d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  LOperand* result() const { return results_[0]; }
296c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
297c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org protected:
298c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  EmbeddedContainer<LOperand*, R> results_;
29926ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org};
30026ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org
30126ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org
30226ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org// R = number of result operands (0 or 1).
30326ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org// I = number of input operands.
30426ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org// T = number of temporary operands.
30526ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.orgtemplate<int R, int I, int T>
30626ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.orgclass LTemplateInstruction : public LTemplateResultInstruction<R> {
30726ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org protected:
308c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  EmbeddedContainer<LOperand*, I> inputs_;
309c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  EmbeddedContainer<LOperand*, T> temps_;
31046839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org
31146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org private:
31226ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  // Iterator support.
313ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual int InputCount() FINAL OVERRIDE { return I; }
314ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual LOperand* InputAt(int i) FINAL OVERRIDE { return inputs_[i]; }
315c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
316ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual int TempCount() FINAL OVERRIDE { return T; }
317ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual LOperand* TempAt(int i) FINAL OVERRIDE { return temps_[i]; }
318c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
319c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
320c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
32132cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.orgclass LGap : public LTemplateInstruction<0, 0, 0> {
322c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
323c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  explicit LGap(HBasicBlock* block)
324c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org      : block_(block) {
325c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    parallel_moves_[BEFORE] = NULL;
326c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    parallel_moves_[START] = NULL;
327c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    parallel_moves_[END] = NULL;
328c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    parallel_moves_[AFTER] = NULL;
329c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
330c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
331c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  // Can't use the DECLARE-macro here because of sub-classes.
332ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual bool IsGap() const FINAL OVERRIDE { return true; }
333ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) OVERRIDE;
334c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  static LGap* cast(LInstruction* instr) {
335e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(instr->IsGap());
336c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    return reinterpret_cast<LGap*>(instr);
337c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
338c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
339c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  bool IsRedundant() const;
340c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
341c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  HBasicBlock* block() const { return block_; }
342c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
343c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  enum InnerPosition {
344c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    BEFORE,
345c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    START,
346c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    END,
347c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    AFTER,
348c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    FIRST_INNER_POSITION = BEFORE,
349c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    LAST_INNER_POSITION = AFTER
350c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  };
351c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
3527028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  LParallelMove* GetOrCreateParallelMove(InnerPosition pos, Zone* zone)  {
3537028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org    if (parallel_moves_[pos] == NULL) {
3547028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org      parallel_moves_[pos] = new(zone) LParallelMove(zone);
3557028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org    }
356c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    return parallel_moves_[pos];
357c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
358c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
359c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LParallelMove* GetParallelMove(InnerPosition pos)  {
360c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    return parallel_moves_[pos];
361c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
362c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
363c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org private:
364c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LParallelMove* parallel_moves_[LAST_INNER_POSITION + 1];
365c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  HBasicBlock* block_;
366c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
367c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
368c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
369ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LInstructionGap FINAL : public LGap {
370c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
371c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  explicit LInstructionGap(HBasicBlock* block) : LGap(block) { }
372c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
373ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual bool HasInterestingComment(LCodeGen* gen) const OVERRIDE {
37432d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org    return !IsRedundant();
37532d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  }
37632d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org
377c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(InstructionGap, "gap")
378c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
379c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
380c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
381ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LGoto FINAL : public LTemplateInstruction<0, 0, 0> {
382c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
383d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org  explicit LGoto(HBasicBlock* block) : block_(block) { }
384c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
385ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual bool HasInterestingComment(LCodeGen* gen) const OVERRIDE;
386c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(Goto, "goto")
387ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) OVERRIDE;
388ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual bool IsControl() const OVERRIDE { return true; }
389c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
390d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org  int block_id() const { return block_->block_id(); }
391c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
392c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org private:
393d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org  HBasicBlock* block_;
394c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
395c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
396c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
397ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LLazyBailout FINAL : public LTemplateInstruction<0, 0, 0> {
398c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
399c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LLazyBailout() : gap_instructions_size_(0) { }
400c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
401c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(LazyBailout, "lazy-bailout")
402c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
403c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  void set_gap_instructions_size(int gap_instructions_size) {
404c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    gap_instructions_size_ = gap_instructions_size;
405c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
406c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  int gap_instructions_size() { return gap_instructions_size_; }
407c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
408c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org private:
409c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  int gap_instructions_size_;
410c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
411c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
412c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
413ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LDummy FINAL : public LTemplateInstruction<1, 0, 0> {
414935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org public:
4155e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  LDummy() {}
416935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(Dummy, "dummy")
417935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org};
418935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org
419935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org
420ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LDummyUse FINAL : public LTemplateInstruction<1, 1, 0> {
42146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org public:
42246a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  explicit LDummyUse(LOperand* value) {
42346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org    inputs_[0] = value;
42446a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  }
42546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org  DECLARE_CONCRETE_INSTRUCTION(DummyUse, "dummy-use")
42646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org};
42746a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org
42846a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org
429ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LDeoptimize FINAL : public LTemplateInstruction<0, 0, 0> {
430c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
431ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual bool IsControl() const OVERRIDE { return true; }
432c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(Deoptimize, "deoptimize")
433c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org  DECLARE_HYDROGEN_ACCESSOR(Deoptimize)
434c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
435c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
436c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
437ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LLabel FINAL : public LGap {
438c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
439c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  explicit LLabel(HBasicBlock* block)
440c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org      : LGap(block), replacement_(NULL) { }
441c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
442ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual bool HasInterestingComment(LCodeGen* gen) const OVERRIDE {
44332cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org    return false;
44432cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org  }
445c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(Label, "label")
446c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
447ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) OVERRIDE;
448c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
449c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  int block_id() const { return block()->block_id(); }
450c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  bool is_loop_header() const { return block()->IsLoopHeader(); }
45132d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  bool is_osr_entry() const { return block()->is_osr_entry(); }
452c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  Label* label() { return &label_; }
453c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LLabel* replacement() const { return replacement_; }
454c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  void set_replacement(LLabel* label) { replacement_ = label; }
455c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  bool HasReplacement() const { return replacement_ != NULL; }
456c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
457c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org private:
458c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  Label label_;
459c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LLabel* replacement_;
460c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
461c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
462c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
463ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LParameter FINAL : public LTemplateInstruction<1, 0, 0> {
464c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
465ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual bool HasInterestingComment(LCodeGen* gen) const OVERRIDE {
46632cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org    return false;
46732cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org  }
468c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(Parameter, "parameter")
469c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
470c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
471c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
472ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LCallStub FINAL : public LTemplateInstruction<1, 1, 0> {
473c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
474fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  explicit LCallStub(LOperand* context) {
475fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org    inputs_[0] = context;
476fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  }
477fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org
478fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* context() { return inputs_[0]; }
479fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org
480c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(CallStub, "call-stub")
481c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_HYDROGEN_ACCESSOR(CallStub)
482c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
483c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
484c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
485e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.orgclass LTailCallThroughMegamorphicCache FINAL
486e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org    : public LTemplateInstruction<0, 3, 0> {
487e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org public:
488e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org  explicit LTailCallThroughMegamorphicCache(LOperand* context,
489e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org                                            LOperand* receiver,
490e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org                                            LOperand* name) {
491e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org    inputs_[0] = context;
492e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org    inputs_[1] = receiver;
493e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org    inputs_[2] = name;
494e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org  }
495e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org
496e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org  LOperand* context() { return inputs_[0]; }
497e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org  LOperand* receiver() { return inputs_[1]; }
498e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org  LOperand* name() { return inputs_[2]; }
499e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org
500e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(TailCallThroughMegamorphicCache,
501e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org                               "tail-call-through-megamorphic-cache")
502e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(TailCallThroughMegamorphicCache)
503e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org};
504e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org
505e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org
506ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LUnknownOSRValue FINAL : public LTemplateInstruction<1, 0, 0> {
507c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
508ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual bool HasInterestingComment(LCodeGen* gen) const OVERRIDE {
50932cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org    return false;
51032cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org  }
511c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(UnknownOSRValue, "unknown-osr-value")
512c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
513c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
514c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
515c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgtemplate<int I, int T>
51632cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.orgclass LControlInstruction : public LTemplateInstruction<0, I, T> {
517c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
5181510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  LControlInstruction() : false_label_(NULL), true_label_(NULL) { }
5191510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
520ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual bool IsControl() const FINAL OVERRIDE { return true; }
521c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
522c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  int SuccessorCount() { return hydrogen()->SuccessorCount(); }
523c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  HBasicBlock* SuccessorAt(int i) { return hydrogen()->SuccessorAt(i); }
5241510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
5251510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  int TrueDestination(LChunk* chunk) {
5261510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    return chunk->LookupDestination(true_block_id());
5271510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  }
5281510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  int FalseDestination(LChunk* chunk) {
5291510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    return chunk->LookupDestination(false_block_id());
5301510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  }
5311510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
5321510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  Label* TrueLabel(LChunk* chunk) {
5331510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    if (true_label_ == NULL) {
5341510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      true_label_ = chunk->GetAssemblyLabel(TrueDestination(chunk));
5351510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    }
5361510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    return true_label_;
5371510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  }
5381510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  Label* FalseLabel(LChunk* chunk) {
5391510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    if (false_label_ == NULL) {
5401510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      false_label_ = chunk->GetAssemblyLabel(FalseDestination(chunk));
5411510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    }
5421510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    return false_label_;
5431510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  }
5441510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
5451510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org protected:
5461510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  int true_block_id() { return SuccessorAt(0)->block_id(); }
5471510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  int false_block_id() { return SuccessorAt(1)->block_id(); }
548c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
549c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org private:
550c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  HControlInstruction* hydrogen() {
551c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    return HControlInstruction::cast(this->hydrogen_value());
552c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
5531510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
5541510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  Label* false_label_;
5551510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  Label* true_label_;
556c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
557c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
558c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
559ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LWrapReceiver FINAL : public LTemplateInstruction<1, 2, 0> {
5602c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org public:
5612c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org  LWrapReceiver(LOperand* receiver, LOperand* function) {
5622c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org    inputs_[0] = receiver;
5632c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org    inputs_[1] = function;
5642c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org  }
5652c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org
5662c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org  DECLARE_CONCRETE_INSTRUCTION(WrapReceiver, "wrap-receiver")
56757a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(WrapReceiver)
5682c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org
5692c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org  LOperand* receiver() { return inputs_[0]; }
5702c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org  LOperand* function() { return inputs_[1]; }
5712c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org};
5722c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org
5732c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org
574ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LApplyArguments FINAL : public LTemplateInstruction<1, 4, 0> {
575c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
576c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LApplyArguments(LOperand* function,
577c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org                  LOperand* receiver,
578c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org                  LOperand* length,
579c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org                  LOperand* elements) {
580c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    inputs_[0] = function;
581c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    inputs_[1] = receiver;
582c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    inputs_[2] = length;
583c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    inputs_[3] = elements;
584c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
585c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
586c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(ApplyArguments, "apply-arguments")
587c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
588c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LOperand* function() { return inputs_[0]; }
589c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LOperand* receiver() { return inputs_[1]; }
590c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LOperand* length() { return inputs_[2]; }
591c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LOperand* elements() { return inputs_[3]; }
592c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
593c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
594c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
595ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LAccessArgumentsAt FINAL : public LTemplateInstruction<1, 3, 0> {
596c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
597c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LAccessArgumentsAt(LOperand* arguments, LOperand* length, LOperand* index) {
598c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    inputs_[0] = arguments;
599c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    inputs_[1] = length;
600c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    inputs_[2] = index;
601c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
602c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
603c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(AccessArgumentsAt, "access-arguments-at")
604c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
605c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LOperand* arguments() { return inputs_[0]; }
606c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LOperand* length() { return inputs_[1]; }
607c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LOperand* index() { return inputs_[2]; }
608c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
609ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) OVERRIDE;
610c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
611c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
612c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
613ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LArgumentsLength FINAL : public LTemplateInstruction<1, 1, 0> {
614c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
615c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  explicit LArgumentsLength(LOperand* elements) {
616c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    inputs_[0] = elements;
617c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
618c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
619c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* elements() { return inputs_[0]; }
620c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
621c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(ArgumentsLength, "arguments-length")
622c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
623c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
624c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
625ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LArgumentsElements FINAL : public LTemplateInstruction<1, 0, 0> {
626c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
627c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(ArgumentsElements, "arguments-elements")
62828faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org  DECLARE_HYDROGEN_ACCESSOR(ArgumentsElements)
629c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
630c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
631c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
632ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LModByPowerOf2I FINAL : public LTemplateInstruction<1, 1, 0> {
633c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
634ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  LModByPowerOf2I(LOperand* dividend, int32_t divisor) {
635ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org    inputs_[0] = dividend;
636ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org    divisor_ = divisor;
637c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
638c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
639ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  LOperand* dividend() { return inputs_[0]; }
640ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  int32_t divisor() const { return divisor_; }
641ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
642ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(ModByPowerOf2I, "mod-by-power-of-2-i")
643ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(Mod)
644ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
645ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org private:
646ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  int32_t divisor_;
647ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org};
648ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
649ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
650ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LModByConstI FINAL : public LTemplateInstruction<1, 1, 0> {
65100a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org public:
65200a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org  LModByConstI(LOperand* dividend, int32_t divisor) {
65300a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org    inputs_[0] = dividend;
65400a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org    divisor_ = divisor;
65500a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org  }
65600a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org
65700a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org  LOperand* dividend() { return inputs_[0]; }
65800a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org  int32_t divisor() const { return divisor_; }
65900a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org
66000a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(ModByConstI, "mod-by-const-i")
66100a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(Mod)
66200a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org
66300a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org private:
66400a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org  int32_t divisor_;
66500a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org};
66600a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org
66700a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org
668ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LModI FINAL : public LTemplateInstruction<1, 2, 3> {
669ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org public:
670c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LModI(LOperand* left,
671ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org        LOperand* right) {
672c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    inputs_[0] = left;
673c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    inputs_[1] = right;
674c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
675c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
676c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* left() { return inputs_[0]; }
677c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* right() { return inputs_[1]; }
678c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
679c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(ModI, "mod-i")
680c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_HYDROGEN_ACCESSOR(Mod)
681c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
682c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
683c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
684ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LDivByPowerOf2I FINAL : public LTemplateInstruction<1, 1, 0> {
68500a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org public:
68600a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org  LDivByPowerOf2I(LOperand* dividend, int32_t divisor) {
68700a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org    inputs_[0] = dividend;
68800a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org    divisor_ = divisor;
68900a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org  }
69000a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org
69100a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org  LOperand* dividend() { return inputs_[0]; }
69200a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org  int32_t divisor() const { return divisor_; }
69300a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org
69400a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(DivByPowerOf2I, "div-by-power-of-2-i")
69500a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(Div)
69600a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org
69700a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org private:
69800a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org  int32_t divisor_;
69900a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org};
70000a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org
70100a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org
702ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LDivByConstI FINAL : public LTemplateInstruction<1, 1, 0> {
70300a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org public:
70400a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org  LDivByConstI(LOperand* dividend, int32_t divisor) {
70500a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org    inputs_[0] = dividend;
70600a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org    divisor_ = divisor;
70700a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org  }
70800a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org
70900a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org  LOperand* dividend() { return inputs_[0]; }
71000a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org  int32_t divisor() const { return divisor_; }
71100a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org
71200a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(DivByConstI, "div-by-const-i")
71300a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(Div)
71400a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org
71500a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org private:
71600a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org  int32_t divisor_;
71700a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org};
71800a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org
71900a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org
720ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LDivI FINAL : public LTemplateInstruction<1, 2, 1> {
721c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
7225e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  LDivI(LOperand* dividend, LOperand* divisor, LOperand* temp) {
7234edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org    inputs_[0] = dividend;
7244edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org    inputs_[1] = divisor;
7255e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    temps_[0] = temp;
726c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
727c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
7284edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org  LOperand* dividend() { return inputs_[0]; }
7294edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org  LOperand* divisor() { return inputs_[1]; }
7305e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  LOperand* temp() { return temps_[0]; }
731c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
732c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(DivI, "div-i")
733ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(BinaryOperation)
734ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org};
735ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
736ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
737ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LFlooringDivByPowerOf2I FINAL : public LTemplateInstruction<1, 1, 0> {
738ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org public:
739bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  LFlooringDivByPowerOf2I(LOperand* dividend, int32_t divisor) {
740ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org    inputs_[0] = dividend;
741bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    divisor_ = divisor;
742ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  }
743ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
744ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  LOperand* dividend() { return inputs_[0]; }
745bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  int32_t divisor() { return divisor_; }
746bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org
747bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(FlooringDivByPowerOf2I,
748bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org                               "flooring-div-by-power-of-2-i")
749bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(MathFloorOfDiv)
750bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org
751bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org private:
752bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  int32_t divisor_;
753bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org};
754bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org
755bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org
756ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LFlooringDivByConstI FINAL : public LTemplateInstruction<1, 1, 2> {
757bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org public:
758fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org  LFlooringDivByConstI(LOperand* dividend, int32_t divisor, LOperand* temp) {
759bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    inputs_[0] = dividend;
760bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    divisor_ = divisor;
761fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org    temps_[0] = temp;
762bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  }
763bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org
764bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  LOperand* dividend() { return inputs_[0]; }
765bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  int32_t divisor() const { return divisor_; }
766fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org  LOperand* temp() { return temps_[0]; }
767ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
768ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(FlooringDivByConstI, "flooring-div-by-const-i")
769ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(MathFloorOfDiv)
770bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org
771bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org private:
772bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  int32_t divisor_;
773c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
774c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
775c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
776ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LFlooringDivI FINAL : public LTemplateInstruction<1, 2, 0> {
7774edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org public:
7784edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org  LFlooringDivI(LOperand* dividend, LOperand* divisor) {
7794edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org    inputs_[0] = dividend;
7804edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org    inputs_[1] = divisor;
7814edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org  }
7824edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org
7834edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org  LOperand* dividend() { return inputs_[0]; }
7844edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org  LOperand* divisor() { return inputs_[1]; }
7854edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org
7864edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(FlooringDivI, "flooring-div-i")
7874edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(MathFloorOfDiv)
7884edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org};
7894edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org
7904edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org
791ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LMulI FINAL : public LTemplateInstruction<1, 2, 0> {
792c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
793c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  LMulI(LOperand* left, LOperand* right) {
794c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    inputs_[0] = left;
795c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    inputs_[1] = right;
796c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
797c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
798c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* left() { return inputs_[0]; }
799c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* right() { return inputs_[1]; }
800c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
801c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(MulI, "mul-i")
802c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_HYDROGEN_ACCESSOR(Mul)
803c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
804c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
805c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
80659297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org// Instruction for computing multiplier * multiplicand + addend.
807ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LMultiplyAddD FINAL : public LTemplateInstruction<1, 3, 0> {
80859297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org public:
80959297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org  LMultiplyAddD(LOperand* addend, LOperand* multiplier,
81059297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org                LOperand* multiplicand) {
81159297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org    inputs_[0] = addend;
81259297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org    inputs_[1] = multiplier;
81359297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org    inputs_[2] = multiplicand;
81459297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org  }
81559297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org
81659297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org  LOperand* addend() { return inputs_[0]; }
81759297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org  LOperand* multiplier() { return inputs_[1]; }
81859297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org  LOperand* multiplicand() { return inputs_[2]; }
81959297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org
82059297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(MultiplyAddD, "multiply-add-d")
82159297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org};
82259297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org
82359297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org
824ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LDebugBreak FINAL : public LTemplateInstruction<0, 0, 0> {
8254e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org public:
8264e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(DebugBreak, "break")
8274e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org};
8284e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org
8294e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org
830ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LCompareNumericAndBranch FINAL : public LControlInstruction<2, 0> {
831c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
832e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  LCompareNumericAndBranch(LOperand* left, LOperand* right) {
833c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    inputs_[0] = left;
834c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    inputs_[1] = right;
835c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
836c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
837c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* left() { return inputs_[0]; }
838c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* right() { return inputs_[1]; }
839c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
840e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  DECLARE_CONCRETE_INSTRUCTION(CompareNumericAndBranch,
841e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org                               "compare-numeric-and-branch")
842e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  DECLARE_HYDROGEN_ACCESSOR(CompareNumericAndBranch)
843c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
844c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  Token::Value op() const { return hydrogen()->token(); }
845c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  bool is_double() const {
8468e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org    return hydrogen()->representation().IsDouble();
847c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
848c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
849ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) OVERRIDE;
850c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
851c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
852c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
853ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LMathFloor FINAL : public LTemplateInstruction<1, 1, 1> {
854c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
855e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  LMathFloor(LOperand* value, LOperand* temp) {
856c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    inputs_[0] = value;
857c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    temps_[0] = temp;
858c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
859c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
860c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* value() { return inputs_[0]; }
861c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* temp() { return temps_[0]; }
862c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
863e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  DECLARE_CONCRETE_INSTRUCTION(MathFloor, "math-floor")
864c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_HYDROGEN_ACCESSOR(UnaryMathOperation)
865e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org};
866c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
867e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
868ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LMathRound FINAL : public LTemplateInstruction<1, 1, 1> {
869e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org public:
870e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  LMathRound(LOperand* value, LOperand* temp) {
871e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    inputs_[0] = value;
872e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    temps_[0] = temp;
873e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  }
874e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
875e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  LOperand* value() { return inputs_[0]; }
876e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  LOperand* temp() { return temps_[0]; }
877e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
878e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  DECLARE_CONCRETE_INSTRUCTION(MathRound, "math-round")
879e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  DECLARE_HYDROGEN_ACCESSOR(UnaryMathOperation)
880e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org};
881e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
882e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
883ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LMathFround FINAL : public LTemplateInstruction<1, 1, 0> {
884dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org public:
885dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  explicit LMathFround(LOperand* value) { inputs_[0] = value; }
886dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org
887dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  LOperand* value() { return inputs_[0]; }
888dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org
8897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(MathFround, "math-fround")
890dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org};
891dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org
892dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org
893ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LMathAbs FINAL : public LTemplateInstruction<1, 2, 0> {
894e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org public:
895fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LMathAbs(LOperand* context, LOperand* value) {
896fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org    inputs_[1] = context;
897e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    inputs_[0] = value;
898e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  }
899e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
900fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* context() { return inputs_[1]; }
901e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  LOperand* value() { return inputs_[0]; }
902e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
903e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  DECLARE_CONCRETE_INSTRUCTION(MathAbs, "math-abs")
904e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  DECLARE_HYDROGEN_ACCESSOR(UnaryMathOperation)
905e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org};
906e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
907e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
908ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LMathLog FINAL : public LTemplateInstruction<1, 1, 0> {
909e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org public:
910e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  explicit LMathLog(LOperand* value) {
911e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    inputs_[0] = value;
912e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  }
913e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
914e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  LOperand* value() { return inputs_[0]; }
915e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
916e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  DECLARE_CONCRETE_INSTRUCTION(MathLog, "math-log")
917e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org};
918e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
919e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
920ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LMathClz32 FINAL : public LTemplateInstruction<1, 1, 0> {
921f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org public:
922f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  explicit LMathClz32(LOperand* value) {
923f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    inputs_[0] = value;
924f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
925f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
926f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LOperand* value() { return inputs_[0]; }
927f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
928f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  DECLARE_CONCRETE_INSTRUCTION(MathClz32, "math-clz32")
929f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org};
930f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
931f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
932ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LMathExp FINAL : public LTemplateInstruction<1, 1, 3> {
93383130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org public:
93483130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org  LMathExp(LOperand* value,
93583130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org           LOperand* double_temp,
93683130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org           LOperand* temp1,
93783130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org           LOperand* temp2) {
93883130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org    inputs_[0] = value;
93983130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org    temps_[0] = temp1;
94083130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org    temps_[1] = temp2;
94183130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org    temps_[2] = double_temp;
94283130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org    ExternalReference::InitializeMathExpData();
94383130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org  }
94483130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org
94583130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org  LOperand* value() { return inputs_[0]; }
94683130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org  LOperand* temp1() { return temps_[0]; }
94783130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org  LOperand* temp2() { return temps_[1]; }
94883130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org  LOperand* double_temp() { return temps_[2]; }
94983130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org
95083130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org  DECLARE_CONCRETE_INSTRUCTION(MathExp, "math-exp")
951e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org};
95283130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org
953e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
954ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LMathSqrt FINAL : public LTemplateInstruction<1, 1, 0> {
955e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org public:
956e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  explicit LMathSqrt(LOperand* value) {
957e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    inputs_[0] = value;
958e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  }
959e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
960e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  LOperand* value() { return inputs_[0]; }
961e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
962e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  DECLARE_CONCRETE_INSTRUCTION(MathSqrt, "math-sqrt")
963e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org};
964e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
965e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
966ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LMathPowHalf FINAL : public LTemplateInstruction<1, 1, 1> {
967e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org public:
968e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  LMathPowHalf(LOperand* value, LOperand* temp) {
969e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    inputs_[0] = value;
970e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    temps_[0] = temp;
971e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  }
972e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
973e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  LOperand* value() { return inputs_[0]; }
974e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  LOperand* temp() { return temps_[0]; }
975e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
976e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  DECLARE_CONCRETE_INSTRUCTION(MathPowHalf, "math-pow-half")
97783130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org};
97883130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org
97983130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org
980ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LCmpObjectEqAndBranch FINAL : public LControlInstruction<2, 0> {
981c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
982c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LCmpObjectEqAndBranch(LOperand* left, LOperand* right) {
983c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    inputs_[0] = left;
984c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    inputs_[1] = right;
985c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
986c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
987c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* left() { return inputs_[0]; }
988c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* right() { return inputs_[1]; }
989c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
990c4c71ea2d66514cf02679bc673c5ba8c9406bad8palfia@homejinni.com  DECLARE_CONCRETE_INSTRUCTION(CmpObjectEqAndBranch, "cmp-object-eq-and-branch")
991c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_HYDROGEN_ACCESSOR(CompareObjectEqAndBranch)
992c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
993c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
994c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
995ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LCmpHoleAndBranch FINAL : public LControlInstruction<1, 0> {
996c4c71ea2d66514cf02679bc673c5ba8c9406bad8palfia@homejinni.com public:
997c4c71ea2d66514cf02679bc673c5ba8c9406bad8palfia@homejinni.com  explicit LCmpHoleAndBranch(LOperand* object) {
998c4c71ea2d66514cf02679bc673c5ba8c9406bad8palfia@homejinni.com    inputs_[0] = object;
999c4c71ea2d66514cf02679bc673c5ba8c9406bad8palfia@homejinni.com  }
1000c4c71ea2d66514cf02679bc673c5ba8c9406bad8palfia@homejinni.com
1001c4c71ea2d66514cf02679bc673c5ba8c9406bad8palfia@homejinni.com  LOperand* object() { return inputs_[0]; }
1002c4c71ea2d66514cf02679bc673c5ba8c9406bad8palfia@homejinni.com
1003c4c71ea2d66514cf02679bc673c5ba8c9406bad8palfia@homejinni.com  DECLARE_CONCRETE_INSTRUCTION(CmpHoleAndBranch, "cmp-hole-and-branch")
1004c4c71ea2d66514cf02679bc673c5ba8c9406bad8palfia@homejinni.com  DECLARE_HYDROGEN_ACCESSOR(CompareHoleAndBranch)
1005c4c71ea2d66514cf02679bc673c5ba8c9406bad8palfia@homejinni.com};
1006c4c71ea2d66514cf02679bc673c5ba8c9406bad8palfia@homejinni.com
1007c4c71ea2d66514cf02679bc673c5ba8c9406bad8palfia@homejinni.com
1008ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LCompareMinusZeroAndBranch FINAL : public LControlInstruction<1, 1> {
10090cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org public:
10100cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  LCompareMinusZeroAndBranch(LOperand* value, LOperand* temp) {
10110cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org    inputs_[0] = value;
10120cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org    temps_[0] = temp;
10130cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  }
10140cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org
10150cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  LOperand* value() { return inputs_[0]; }
10160cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  LOperand* temp() { return temps_[0]; }
10170cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org
10180cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(CompareMinusZeroAndBranch,
10190cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org                               "cmp-minus-zero-and-branch")
10200cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(CompareMinusZeroAndBranch)
10210cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org};
10220cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org
10230cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org
1024ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LIsObjectAndBranch FINAL : public LControlInstruction<1, 1> {
1025c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
1026c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LIsObjectAndBranch(LOperand* value, LOperand* temp) {
1027c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    inputs_[0] = value;
1028c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    temps_[0] = temp;
1029c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
1030c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1031c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* value() { return inputs_[0]; }
1032c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* temp() { return temps_[0]; }
1033c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
1034c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(IsObjectAndBranch, "is-object-and-branch")
1035c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_HYDROGEN_ACCESSOR(IsObjectAndBranch)
1036c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1037c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  virtual void PrintDataTo(StringStream* stream);
1038c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
1039c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1040c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1041ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LIsStringAndBranch FINAL : public LControlInstruction<1, 1> {
1042f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.org public:
1043f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.org  LIsStringAndBranch(LOperand* value, LOperand* temp) {
1044f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.org    inputs_[0] = value;
1045f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.org    temps_[0] = temp;
1046f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.org  }
1047f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.org
1048c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* value() { return inputs_[0]; }
1049c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* temp() { return temps_[0]; }
1050c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
1051f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.org  DECLARE_CONCRETE_INSTRUCTION(IsStringAndBranch, "is-string-and-branch")
1052f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.org  DECLARE_HYDROGEN_ACCESSOR(IsStringAndBranch)
1053f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.org
1054ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) OVERRIDE;
1055f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.org};
1056f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.org
1057f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.org
1058ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LIsSmiAndBranch FINAL : public LControlInstruction<1, 0> {
1059c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
1060c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  explicit LIsSmiAndBranch(LOperand* value) {
1061c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    inputs_[0] = value;
1062c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
1063c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1064c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* value() { return inputs_[0]; }
1065c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
1066c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(IsSmiAndBranch, "is-smi-and-branch")
1067c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_HYDROGEN_ACCESSOR(IsSmiAndBranch)
1068c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1069ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) OVERRIDE;
1070c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
1071c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1072c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1073ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LIsUndetectableAndBranch FINAL : public LControlInstruction<1, 1> {
1074c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
1075c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  explicit LIsUndetectableAndBranch(LOperand* value, LOperand* temp) {
1076c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    inputs_[0] = value;
1077c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    temps_[0] = temp;
1078c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
1079c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1080c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* value() { return inputs_[0]; }
1081c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* temp() { return temps_[0]; }
1082c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
1083c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(IsUndetectableAndBranch,
1084c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org                               "is-undetectable-and-branch")
1085c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_HYDROGEN_ACCESSOR(IsUndetectableAndBranch)
1086c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1087ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) OVERRIDE;
1088c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
1089c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1090c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1091ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LStringCompareAndBranch FINAL : public LControlInstruction<3, 0> {
1092f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.org public:
1093fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LStringCompareAndBranch(LOperand* context, LOperand* left, LOperand* right) {
1094fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org    inputs_[0] = context;
1095fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org    inputs_[1] = left;
1096fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org    inputs_[2] = right;
1097f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.org  }
1098f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.org
1099fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* context() { return inputs_[0]; }
1100fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* left() { return inputs_[1]; }
1101fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* right() { return inputs_[2]; }
1102c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
1103f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.org  DECLARE_CONCRETE_INSTRUCTION(StringCompareAndBranch,
1104f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.org                               "string-compare-and-branch")
1105f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.org  DECLARE_HYDROGEN_ACCESSOR(StringCompareAndBranch)
1106f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.org
1107f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.org  Token::Value op() const { return hydrogen()->token(); }
1108f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.org
1109ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) OVERRIDE;
1110f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.org};
1111f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.org
1112f8c6bd531c2a8ba717cb8d316206347b05acebedmstarzinger@chromium.org
1113ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LHasInstanceTypeAndBranch FINAL : public LControlInstruction<1, 0> {
1114c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
1115c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  explicit LHasInstanceTypeAndBranch(LOperand* value) {
1116c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    inputs_[0] = value;
1117c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
1118c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1119c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* value() { return inputs_[0]; }
1120c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
1121c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(HasInstanceTypeAndBranch,
1122c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org                               "has-instance-type-and-branch")
1123c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_HYDROGEN_ACCESSOR(HasInstanceTypeAndBranch)
1124c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1125ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) OVERRIDE;
1126c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
1127c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1128c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1129ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LGetCachedArrayIndex FINAL : public LTemplateInstruction<1, 1, 0> {
1130c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
1131c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  explicit LGetCachedArrayIndex(LOperand* value) {
1132c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    inputs_[0] = value;
1133c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
1134c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1135c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* value() { return inputs_[0]; }
1136c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
1137c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(GetCachedArrayIndex, "get-cached-array-index")
1138c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_HYDROGEN_ACCESSOR(GetCachedArrayIndex)
1139c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
1140c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1141c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1142ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LHasCachedArrayIndexAndBranch FINAL
114332cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org    : public LControlInstruction<1, 0> {
1144c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
1145c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  explicit LHasCachedArrayIndexAndBranch(LOperand* value) {
1146c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    inputs_[0] = value;
1147c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
1148c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1149c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* value() { return inputs_[0]; }
1150c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
1151c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(HasCachedArrayIndexAndBranch,
1152c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org                               "has-cached-array-index-and-branch")
1153c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_HYDROGEN_ACCESSOR(HasCachedArrayIndexAndBranch)
1154c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1155ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) OVERRIDE;
1156c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
1157c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1158c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1159ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LClassOfTestAndBranch FINAL : public LControlInstruction<1, 1> {
1160c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
1161c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LClassOfTestAndBranch(LOperand* value, LOperand* temp) {
1162c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    inputs_[0] = value;
1163c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    temps_[0] = temp;
1164c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
1165c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1166c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* value() { return inputs_[0]; }
1167c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* temp() { return temps_[0]; }
1168c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
1169c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(ClassOfTestAndBranch,
1170c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org                               "class-of-test-and-branch")
1171c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_HYDROGEN_ACCESSOR(ClassOfTestAndBranch)
1172c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1173ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) OVERRIDE;
1174c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
1175c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1176c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1177ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LCmpT FINAL : public LTemplateInstruction<1, 3, 0> {
1178c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
1179fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LCmpT(LOperand* context, LOperand* left, LOperand* right) {
1180fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org    inputs_[0] = context;
1181fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org    inputs_[1] = left;
1182fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org    inputs_[2] = right;
1183c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
1184c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1185fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* context() { return inputs_[0]; }
1186fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* left() { return inputs_[1]; }
1187fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* right() { return inputs_[2]; }
1188c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
1189c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(CmpT, "cmp-t")
1190c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_HYDROGEN_ACCESSOR(CompareGeneric)
1191c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1192c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  Token::Value op() const { return hydrogen()->token(); }
1193c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
1194c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1195c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1196ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LInstanceOf FINAL : public LTemplateInstruction<1, 3, 0> {
1197c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
1198fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LInstanceOf(LOperand* context, LOperand* left, LOperand* right) {
1199fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org    inputs_[0] = context;
1200fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org    inputs_[1] = left;
1201fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org    inputs_[2] = right;
1202c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
1203c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1204fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* context() { return inputs_[0]; }
1205fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* left() { return inputs_[1]; }
1206fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* right() { return inputs_[2]; }
1207c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
1208c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(InstanceOf, "instance-of")
1209c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
1210c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1211c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1212ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LInstanceOfKnownGlobal FINAL : public LTemplateInstruction<1, 2, 1> {
1213c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
1214fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LInstanceOfKnownGlobal(LOperand* context, LOperand* value, LOperand* temp) {
1215fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org    inputs_[0] = context;
1216fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org    inputs_[1] = value;
1217c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    temps_[0] = temp;
1218c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
1219c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1220fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* context() { return inputs_[0]; }
1221fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* value() { return inputs_[1]; }
1222c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* temp() { return temps_[0]; }
1223c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
1224c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(InstanceOfKnownGlobal,
1225c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org                               "instance-of-known-global")
1226c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_HYDROGEN_ACCESSOR(InstanceOfKnownGlobal)
1227c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1228c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  Handle<JSFunction> function() const { return hydrogen()->function(); }
12291044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org  LEnvironment* GetDeferredLazyDeoptimizationEnvironment() {
12301044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org    return lazy_deopt_env_;
12311044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org  }
123232cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org  virtual void SetDeferredLazyDeoptimizationEnvironment(
1233ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org      LEnvironment* env) OVERRIDE {
12341044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org    lazy_deopt_env_ = env;
12351044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org  }
12361044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org
12371044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org private:
12381044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org  LEnvironment* lazy_deopt_env_;
1239c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
1240c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1241c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1242ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LBoundsCheck FINAL : public LTemplateInstruction<0, 2, 0> {
1243c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
1244c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LBoundsCheck(LOperand* index, LOperand* length) {
1245c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    inputs_[0] = index;
1246c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    inputs_[1] = length;
1247c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
1248c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1249c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LOperand* index() { return inputs_[0]; }
1250c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LOperand* length() { return inputs_[1]; }
1251c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1252c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(BoundsCheck, "bounds-check")
1253129d398d682e6ca3910808c913212ce532f1e155danno@chromium.org  DECLARE_HYDROGEN_ACCESSOR(BoundsCheck)
1254c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
1255c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1256c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1257ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LBitI FINAL : public LTemplateInstruction<1, 2, 0> {
1258c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
1259c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LBitI(LOperand* left, LOperand* right) {
1260c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    inputs_[0] = left;
1261c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    inputs_[1] = right;
1262c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
1263c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1264c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* left() { return inputs_[0]; }
1265c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* right() { return inputs_[1]; }
1266c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
1267c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  Token::Value op() const { return hydrogen()->op(); }
1268c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1269c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(BitI, "bit-i")
1270c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_HYDROGEN_ACCESSOR(Bitwise)
1271c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
1272c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1273c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1274ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LShiftI FINAL : public LTemplateInstruction<1, 2, 0> {
1275c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
1276c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LShiftI(Token::Value op, LOperand* left, LOperand* right, bool can_deopt)
1277c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org      : op_(op), can_deopt_(can_deopt) {
1278c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    inputs_[0] = left;
1279c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    inputs_[1] = right;
1280c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
1281c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1282c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  Token::Value op() const { return op_; }
1283c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* left() { return inputs_[0]; }
1284c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* right() { return inputs_[1]; }
1285c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  bool can_deopt() const { return can_deopt_; }
1286c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1287c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(ShiftI, "shift-i")
1288c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1289c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org private:
1290c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  Token::Value op_;
1291c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  bool can_deopt_;
1292c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
1293c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1294c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1295ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LSubI FINAL : public LTemplateInstruction<1, 2, 0> {
1296c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
1297c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LSubI(LOperand* left, LOperand* right) {
1298c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    inputs_[0] = left;
1299c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    inputs_[1] = right;
1300c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
1301c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1302c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* left() { return inputs_[0]; }
1303c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* right() { return inputs_[1]; }
1304c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
1305c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(SubI, "sub-i")
1306c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_HYDROGEN_ACCESSOR(Sub)
1307c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
1308c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1309c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1310ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LConstantI FINAL : public LTemplateInstruction<1, 0, 0> {
1311c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
1312c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(ConstantI, "constant-i")
1313c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_HYDROGEN_ACCESSOR(Constant)
1314c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1315c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  int32_t value() const { return hydrogen()->Integer32Value(); }
1316c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
1317c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1318c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1319ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LConstantS FINAL : public LTemplateInstruction<1, 0, 0> {
1320b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org public:
1321b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  DECLARE_CONCRETE_INSTRUCTION(ConstantS, "constant-s")
1322b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  DECLARE_HYDROGEN_ACCESSOR(Constant)
1323b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org
1324b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  Smi* value() const { return Smi::FromInt(hydrogen()->Integer32Value()); }
1325b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org};
1326b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org
1327b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org
1328ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LConstantD FINAL : public LTemplateInstruction<1, 0, 0> {
1329c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
1330c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(ConstantD, "constant-d")
1331c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_HYDROGEN_ACCESSOR(Constant)
1332c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1333c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  double value() const { return hydrogen()->DoubleValue(); }
1334c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
1335c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1336c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1337ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LConstantE FINAL : public LTemplateInstruction<1, 0, 0> {
1338d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org public:
1339d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  DECLARE_CONCRETE_INSTRUCTION(ConstantE, "constant-e")
1340d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  DECLARE_HYDROGEN_ACCESSOR(Constant)
1341d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
1342d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  ExternalReference value() const {
1343d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    return hydrogen()->ExternalReferenceValue();
1344d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  }
1345d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org};
1346d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
1347d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
1348ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LConstantT FINAL : public LTemplateInstruction<1, 0, 0> {
1349c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
1350c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(ConstantT, "constant-t")
1351c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_HYDROGEN_ACCESSOR(Constant)
1352c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
13538b6c7864f30105542f70ddbef4cf00467f941602palfia@homejinni.com  Handle<Object> value(Isolate* isolate) const {
13548b6c7864f30105542f70ddbef4cf00467f941602palfia@homejinni.com    return hydrogen()->handle(isolate);
13558b6c7864f30105542f70ddbef4cf00467f941602palfia@homejinni.com  }
1356c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
1357c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1358c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1359ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LBranch FINAL : public LControlInstruction<1, 0> {
1360c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
1361c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  explicit LBranch(LOperand* value) {
1362c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    inputs_[0] = value;
1363c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
1364c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1365c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* value() { return inputs_[0]; }
1366c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
1367c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(Branch, "branch")
1368c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_HYDROGEN_ACCESSOR(Branch)
1369c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1370ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) OVERRIDE;
1371c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
1372c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1373c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1374ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LCmpMapAndBranch FINAL : public LControlInstruction<1, 1> {
1375c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
1376c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LCmpMapAndBranch(LOperand* value, LOperand* temp) {
1377c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    inputs_[0] = value;
1378c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    temps_[0] = temp;
1379c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
1380c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1381c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* value() { return inputs_[0]; }
1382c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* temp() { return temps_[0]; }
1383c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
1384c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(CmpMapAndBranch, "cmp-map-and-branch")
1385c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_HYDROGEN_ACCESSOR(CompareMap)
1386c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1387528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Handle<Map> map() const { return hydrogen()->map().handle(); }
1388c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
1389c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1390c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1391ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LMapEnumLength FINAL : public LTemplateInstruction<1, 1, 0> {
139278502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org public:
139378502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org  explicit LMapEnumLength(LOperand* value) {
139478502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org    inputs_[0] = value;
139578502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org  }
139678502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org
1397c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* value() { return inputs_[0]; }
1398c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
139978502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(MapEnumLength, "map-enum-length")
140078502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org};
140178502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org
140278502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org
1403ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LDateField FINAL : public LTemplateInstruction<1, 1, 1> {
1404154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org public:
1405154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org  LDateField(LOperand* date, LOperand* temp, Smi* index) : index_(index) {
1406154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org    inputs_[0] = date;
1407154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org    temps_[0] = temp;
1408154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org  }
1409154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org
1410c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* date() { return inputs_[0]; }
1411c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* temp() { return temps_[0]; }
1412c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  Smi* index() const { return index_; }
1413c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
14143d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(DateField, "date-field")
14153d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(DateField)
1416154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org
1417154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org private:
1418154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org  Smi* index_;
1419154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org};
1420154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org
1421154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org
1422ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LSeqStringGetChar FINAL : public LTemplateInstruction<1, 2, 0> {
1423e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org public:
1424e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  LSeqStringGetChar(LOperand* string, LOperand* index) {
1425e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org    inputs_[0] = string;
1426e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org    inputs_[1] = index;
1427e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  }
1428e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org
1429e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  LOperand* string() const { return inputs_[0]; }
1430e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  LOperand* index() const { return inputs_[1]; }
1431e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org
1432e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(SeqStringGetChar, "seq-string-get-char")
1433e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(SeqStringGetChar)
1434e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org};
1435e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org
1436e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org
1437ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LSeqStringSetChar FINAL : public LTemplateInstruction<1, 4, 0> {
1438a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org public:
14399af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org  LSeqStringSetChar(LOperand* context,
14409af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org                    LOperand* string,
1441a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org                    LOperand* index,
1442e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org                    LOperand* value) {
14439af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org    inputs_[0] = context;
14449af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org    inputs_[1] = string;
14459af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org    inputs_[2] = index;
14469af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org    inputs_[3] = value;
1447a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  }
1448a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org
14499af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org  LOperand* string() { return inputs_[1]; }
14509af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org  LOperand* index() { return inputs_[2]; }
14519af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org  LOperand* value() { return inputs_[3]; }
1452a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org
1453a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  DECLARE_CONCRETE_INSTRUCTION(SeqStringSetChar, "seq-string-set-char")
1454a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  DECLARE_HYDROGEN_ACCESSOR(SeqStringSetChar)
1455a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org};
1456a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org
1457a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org
1458ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LAddI FINAL : public LTemplateInstruction<1, 2, 0> {
1459c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
1460c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LAddI(LOperand* left, LOperand* right) {
1461c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    inputs_[0] = left;
1462c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    inputs_[1] = right;
1463c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
1464c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1465c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* left() { return inputs_[0]; }
1466c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* right() { return inputs_[1]; }
1467c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
1468c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(AddI, "add-i")
1469c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_HYDROGEN_ACCESSOR(Add)
1470c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
1471c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1472c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1473ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LMathMinMax FINAL : public LTemplateInstruction<1, 2, 0> {
1474471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org public:
1475471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  LMathMinMax(LOperand* left, LOperand* right) {
1476471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    inputs_[0] = left;
1477471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    inputs_[1] = right;
1478471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  }
1479471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
1480c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* left() { return inputs_[0]; }
1481c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* right() { return inputs_[1]; }
1482c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
1483e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  DECLARE_CONCRETE_INSTRUCTION(MathMinMax, "math-min-max")
1484471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  DECLARE_HYDROGEN_ACCESSOR(MathMinMax)
1485471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org};
1486471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
1487471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
1488ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LPower FINAL : public LTemplateInstruction<1, 2, 0> {
1489c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
1490c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LPower(LOperand* left, LOperand* right) {
1491c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    inputs_[0] = left;
1492c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    inputs_[1] = right;
1493c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
1494c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1495c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* left() { return inputs_[0]; }
1496c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* right() { return inputs_[1]; }
1497c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
1498c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(Power, "power")
1499c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_HYDROGEN_ACCESSOR(Power)
1500c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
1501c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1502c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1503ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LArithmeticD FINAL : public LTemplateInstruction<1, 2, 0> {
1504c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
1505c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LArithmeticD(Token::Value op, LOperand* left, LOperand* right)
1506c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org      : op_(op) {
1507c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    inputs_[0] = left;
1508c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    inputs_[1] = right;
1509c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
1510c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1511c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  Token::Value op() const { return op_; }
1512c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* left() { return inputs_[0]; }
1513c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* right() { return inputs_[1]; }
1514c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1515ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual Opcode opcode() const OVERRIDE {
151632cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org    return LInstruction::kArithmeticD;
151732cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org  }
1518ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void CompileToNative(LCodeGen* generator) OVERRIDE;
1519ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual const char* Mnemonic() const OVERRIDE;
1520c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1521c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org private:
1522c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  Token::Value op_;
1523c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
1524c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1525c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1526ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LArithmeticT FINAL : public LTemplateInstruction<1, 3, 0> {
1527c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
1528fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LArithmeticT(Token::Value op,
1529fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org               LOperand* context,
1530fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org               LOperand* left,
1531fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org               LOperand* right)
1532c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org      : op_(op) {
1533fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org    inputs_[0] = context;
1534fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org    inputs_[1] = left;
1535fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org    inputs_[2] = right;
1536c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
1537c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1538fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* context() { return inputs_[0]; }
1539fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* left() { return inputs_[1]; }
1540fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* right() { return inputs_[2]; }
1541c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  Token::Value op() const { return op_; }
1542c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
1543ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual Opcode opcode() const FINAL  { return LInstruction::kArithmeticT; }
1544ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void CompileToNative(LCodeGen* generator) OVERRIDE;
1545ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual const char* Mnemonic() const OVERRIDE;
1546c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1547c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org private:
1548c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  Token::Value op_;
1549c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
1550c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1551c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1552ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LReturn FINAL : public LTemplateInstruction<0, 3, 0> {
1553c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
1554fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LReturn(LOperand* value, LOperand* context, LOperand* parameter_count) {
1555c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    inputs_[0] = value;
1556fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org    inputs_[1] = context;
1557fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org    inputs_[2] = parameter_count;
1558c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
1559c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1560c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* value() { return inputs_[0]; }
1561c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
15626e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org  bool has_constant_parameter_count() {
15636e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org    return parameter_count()->IsConstantOperand();
15646e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org  }
15656e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org  LConstantOperand* constant_parameter_count() {
1566e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(has_constant_parameter_count());
15676e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org    return LConstantOperand::cast(parameter_count());
15686e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org  }
1569fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* parameter_count() { return inputs_[2]; }
15706e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org
1571c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(Return, "return")
1572c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
1573c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1574c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1575ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LLoadNamedField FINAL : public LTemplateInstruction<1, 1, 0> {
1576c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
1577c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  explicit LLoadNamedField(LOperand* object) {
1578c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    inputs_[0] = object;
1579c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
1580c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1581c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* object() { return inputs_[0]; }
1582c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
1583c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(LoadNamedField, "load-named-field")
1584c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_HYDROGEN_ACCESSOR(LoadNamedField)
1585c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
1586c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1587c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1588ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LLoadNamedGeneric FINAL : public LTemplateInstruction<1, 2, 1> {
1589c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
15909d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  LLoadNamedGeneric(LOperand* context, LOperand* object, LOperand* vector) {
1591fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org    inputs_[0] = context;
1592fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org    inputs_[1] = object;
15939d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org    temps_[0] = vector;
1594c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
1595c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1596fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* context() { return inputs_[0]; }
1597fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* object() { return inputs_[1]; }
15989d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  LOperand* temp_vector() { return temps_[0]; }
1599c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
1600c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(LoadNamedGeneric, "load-named-generic")
1601c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_HYDROGEN_ACCESSOR(LoadNamedGeneric)
1602c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1603c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  Handle<Object> name() const { return hydrogen()->name(); }
1604c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
1605c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1606c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1607ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LLoadFunctionPrototype FINAL : public LTemplateInstruction<1, 1, 0> {
1608c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
1609c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  explicit LLoadFunctionPrototype(LOperand* function) {
1610c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    inputs_[0] = function;
1611c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
1612c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1613c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* function() { return inputs_[0]; }
1614c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
1615c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(LoadFunctionPrototype, "load-function-prototype")
1616c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_HYDROGEN_ACCESSOR(LoadFunctionPrototype)
1617c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
1618c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1619c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1620ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LLoadRoot FINAL : public LTemplateInstruction<1, 0, 0> {
1621528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org public:
1622528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(LoadRoot, "load-root")
1623528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(LoadRoot)
1624528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org
1625528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Heap::RootListIndex index() const { return hydrogen()->index(); }
1626528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org};
1627528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org
1628528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org
1629ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LLoadKeyed FINAL : public LTemplateInstruction<1, 2, 0> {
1630c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
1631e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  LLoadKeyed(LOperand* elements, LOperand* key) {
1632c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    inputs_[0] = elements;
1633c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    inputs_[1] = key;
1634c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
1635c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1636c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* elements() { return inputs_[0]; }
1637c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* key() { return inputs_[1]; }
1638e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  ElementsKind elements_kind() const {
1639e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org    return hydrogen()->elements_kind();
1640c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
1641e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  bool is_external() const {
1642e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org    return hydrogen()->is_external();
1643c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
16445c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org  bool is_fixed_typed_array() const {
16455c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org    return hydrogen()->is_fixed_typed_array();
16465c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org  }
16475c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org  bool is_typed_elements() const {
16485c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org    return is_external() || is_fixed_typed_array();
16495c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org  }
1650c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1651e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  DECLARE_CONCRETE_INSTRUCTION(LoadKeyed, "load-keyed")
1652e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  DECLARE_HYDROGEN_ACCESSOR(LoadKeyed)
1653c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
16548e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  virtual void PrintDataTo(StringStream* stream);
1655fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org  uint32_t base_offset() const { return hydrogen()->base_offset(); }
1656c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
1657c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1658c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1659ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LLoadKeyedGeneric FINAL : public LTemplateInstruction<1, 3, 1> {
1660c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
16619d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  LLoadKeyedGeneric(LOperand* context, LOperand* object, LOperand* key,
16629d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org                    LOperand* vector) {
1663fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org    inputs_[0] = context;
1664fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org    inputs_[1] = object;
1665fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org    inputs_[2] = key;
16669d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org    temps_[0] = vector;
1667c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
1668c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1669fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* context() { return inputs_[0]; }
1670fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* object() { return inputs_[1]; }
1671fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* key() { return inputs_[2]; }
16729d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  LOperand* temp_vector() { return temps_[0]; }
1673c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
1674c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  DECLARE_CONCRETE_INSTRUCTION(LoadKeyedGeneric, "load-keyed-generic")
16759d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(LoadKeyedGeneric)
1676c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
1677c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1678c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1679ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LLoadGlobalCell FINAL : public LTemplateInstruction<1, 0, 0> {
1680c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
1681c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(LoadGlobalCell, "load-global-cell")
1682c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_HYDROGEN_ACCESSOR(LoadGlobalCell)
1683c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
1684c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1685c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1686ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LLoadGlobalGeneric FINAL : public LTemplateInstruction<1, 2, 1> {
1687c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
16889d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  LLoadGlobalGeneric(LOperand* context, LOperand* global_object,
16899d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org                     LOperand* vector) {
1690fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org    inputs_[0] = context;
1691fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org    inputs_[1] = global_object;
16929d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org    temps_[0] = vector;
1693c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
1694c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1695fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* context() { return inputs_[0]; }
1696fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* global_object() { return inputs_[1]; }
16979d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  LOperand* temp_vector() { return temps_[0]; }
1698c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
1699c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(LoadGlobalGeneric, "load-global-generic")
1700c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_HYDROGEN_ACCESSOR(LoadGlobalGeneric)
1701c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1702c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  Handle<Object> name() const { return hydrogen()->name(); }
1703c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  bool for_typeof() const { return hydrogen()->for_typeof(); }
1704c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
1705c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1706c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1707ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LStoreGlobalCell FINAL : public LTemplateInstruction<0, 1, 1> {
1708c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
1709c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LStoreGlobalCell(LOperand* value, LOperand* temp) {
1710c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    inputs_[0] = value;
1711c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    temps_[0] = temp;
1712c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
1713c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1714c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* value() { return inputs_[0]; }
1715c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* temp() { return temps_[0]; }
1716c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
1717c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(StoreGlobalCell, "store-global-cell")
1718c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_HYDROGEN_ACCESSOR(StoreGlobalCell)
1719c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
1720c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1721c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1722ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LLoadContextSlot FINAL : public LTemplateInstruction<1, 1, 0> {
1723c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
1724c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  explicit LLoadContextSlot(LOperand* context) {
1725c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    inputs_[0] = context;
1726c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
1727c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1728c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* context() { return inputs_[0]; }
1729c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
1730c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(LoadContextSlot, "load-context-slot")
1731c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_HYDROGEN_ACCESSOR(LoadContextSlot)
1732c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1733c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  int slot_index() { return hydrogen()->slot_index(); }
1734c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1735c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  virtual void PrintDataTo(StringStream* stream);
1736c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
1737c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1738c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1739ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LStoreContextSlot FINAL : public LTemplateInstruction<0, 2, 0> {
1740c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
1741c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LStoreContextSlot(LOperand* context, LOperand* value) {
1742c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    inputs_[0] = context;
1743c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    inputs_[1] = value;
1744c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
1745c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1746c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* context() { return inputs_[0]; }
1747c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* value() { return inputs_[1]; }
1748c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
1749c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(StoreContextSlot, "store-context-slot")
1750c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_HYDROGEN_ACCESSOR(StoreContextSlot)
1751c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1752c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  int slot_index() { return hydrogen()->slot_index(); }
1753c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1754ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) OVERRIDE;
1755c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
1756c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1757c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1758ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LPushArgument FINAL : public LTemplateInstruction<0, 1, 0> {
1759c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
1760c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  explicit LPushArgument(LOperand* value) {
1761c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    inputs_[0] = value;
1762c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
1763c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1764c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* value() { return inputs_[0]; }
1765c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
1766c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(PushArgument, "push-argument")
1767c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
1768c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1769c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1770ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LDrop FINAL : public LTemplateInstruction<0, 0, 0> {
177128faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org public:
177228faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org  explicit LDrop(int count) : count_(count) { }
177328faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org
177428faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org  int count() const { return count_; }
177528faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org
177628faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(Drop, "drop")
177728faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org
177828faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org private:
177928faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org  int count_;
178028faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org};
178128faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org
178228faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org
1783ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LStoreCodeEntry FINAL: public LTemplateInstruction<0, 2, 0> {
1784662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org public:
1785662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  LStoreCodeEntry(LOperand* function, LOperand* code_object) {
1786662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org    inputs_[0] = function;
17873ee7a7ed19002e4a0efbf6cdb2a201f21763a80adanno@chromium.org    inputs_[1] = code_object;
1788662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  }
1789662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org
1790662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  LOperand* function() { return inputs_[0]; }
17913ee7a7ed19002e4a0efbf6cdb2a201f21763a80adanno@chromium.org  LOperand* code_object() { return inputs_[1]; }
1792662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org
1793662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  virtual void PrintDataTo(StringStream* stream);
1794662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org
1795662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  DECLARE_CONCRETE_INSTRUCTION(StoreCodeEntry, "store-code-entry")
1796662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  DECLARE_HYDROGEN_ACCESSOR(StoreCodeEntry)
1797662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org};
1798662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org
1799662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org
1800ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LInnerAllocatedObject FINAL: public LTemplateInstruction<1, 2, 0> {
18014c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.org public:
1802ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org  LInnerAllocatedObject(LOperand* base_object, LOperand* offset) {
18034c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.org    inputs_[0] = base_object;
1804ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org    inputs_[1] = offset;
18054c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.org  }
18064c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.org
1807ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org  LOperand* base_object() const { return inputs_[0]; }
1808ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org  LOperand* offset() const { return inputs_[1]; }
18094c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.org
1810ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) OVERRIDE;
18114c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.org
1812ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(InnerAllocatedObject, "inner-allocated-object")
18134c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.org};
18144c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.org
18154c54a2aa3c7806f38af0c7dfde22395232ebdff7jkummerow@chromium.org
1816ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LThisFunction FINAL : public LTemplateInstruction<1, 0, 0> {
1817c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
1818c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(ThisFunction, "this-function")
1819c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_HYDROGEN_ACCESSOR(ThisFunction)
1820c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
1821c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1822c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1823ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LContext FINAL : public LTemplateInstruction<1, 0, 0> {
1824c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
1825c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(Context, "context")
18267c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  DECLARE_HYDROGEN_ACCESSOR(Context)
1827c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
1828c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1829c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1830ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LDeclareGlobals FINAL : public LTemplateInstruction<0, 1, 0> {
1831f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org public:
1832fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  explicit LDeclareGlobals(LOperand* context) {
1833fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org    inputs_[0] = context;
1834fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  }
1835fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org
1836fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* context() { return inputs_[0]; }
1837fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org
1838f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(DeclareGlobals, "declare-globals")
1839f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org  DECLARE_HYDROGEN_ACCESSOR(DeclareGlobals)
1840f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org};
1841f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org
1842f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org
1843ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LCallJSFunction FINAL : public LTemplateInstruction<1, 1, 0> {
1844c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
184526ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  explicit LCallJSFunction(LOperand* function) {
184626ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org    inputs_[0] = function;
1847c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
1848c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
184926ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  LOperand* function() { return inputs_[0]; }
1850c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
185126ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(CallJSFunction, "call-js-function")
185226ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(CallJSFunction)
1853c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1854ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) OVERRIDE;
1855c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1856c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  int arity() const { return hydrogen()->argument_count() - 1; }
1857c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
1858c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1859c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1860ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LCallWithDescriptor FINAL : public LTemplateResultInstruction<1> {
1861c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
18629aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org  LCallWithDescriptor(CallInterfaceDescriptor descriptor,
1863ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org                      const ZoneList<LOperand*>& operands, Zone* zone)
1864ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org      : descriptor_(descriptor),
18659aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org        inputs_(descriptor.GetRegisterParameterCount() + 1, zone) {
18669aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org    DCHECK(descriptor.GetRegisterParameterCount() + 1 == operands.length());
186726ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org    inputs_.AddAll(operands, zone);
1868c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
1869c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
187026ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  LOperand* target() const { return inputs_[0]; }
1871c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
18729aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org  const CallInterfaceDescriptor descriptor() { return descriptor_; }
187326ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org
187426ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org private:
187526ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(CallWithDescriptor, "call-with-descriptor")
187626ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(CallWithDescriptor)
1877c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1878ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) OVERRIDE;
1879c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1880c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  int arity() const { return hydrogen()->argument_count() - 1; }
1881c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
18829aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org  CallInterfaceDescriptor descriptor_;
188326ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  ZoneList<LOperand*> inputs_;
188426ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org
188526ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  // Iterator support.
1886ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual int InputCount() FINAL OVERRIDE { return inputs_.length(); }
1887ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual LOperand* InputAt(int i) FINAL OVERRIDE { return inputs_[i]; }
188826ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org
1889ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual int TempCount() FINAL OVERRIDE { return 0; }
1890ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual LOperand* TempAt(int i) FINAL OVERRIDE { return NULL; }
189126ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org};
1892c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1893c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1894ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LInvokeFunction FINAL : public LTemplateInstruction<1, 2, 0> {
1895c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
189626ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  LInvokeFunction(LOperand* context, LOperand* function) {
1897fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org    inputs_[0] = context;
189826ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org    inputs_[1] = function;
1899fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  }
1900fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org
1901fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* context() { return inputs_[0]; }
190226ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  LOperand* function() { return inputs_[1]; }
1903fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org
190426ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(InvokeFunction, "invoke-function")
190526ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(InvokeFunction)
1906c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1907ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) OVERRIDE;
1908c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1909c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  int arity() const { return hydrogen()->argument_count() - 1; }
1910c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
1911c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1912c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1913ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LCallFunction FINAL : public LTemplateInstruction<1, 2, 0> {
1914c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
1915fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LCallFunction(LOperand* context, LOperand* function) {
1916fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org    inputs_[0] = context;
1917fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org    inputs_[1] = function;
1918c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  }
1919c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org
1920fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* context() { return inputs_[0]; }
1921fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* function() { return inputs_[1]; }
1922c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
1923c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(CallFunction, "call-function")
1924c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_HYDROGEN_ACCESSOR(CallFunction)
1925c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1926c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  int arity() const { return hydrogen()->argument_count() - 1; }
1927c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
1928c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1929c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1930ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LCallNew FINAL : public LTemplateInstruction<1, 2, 0> {
1931c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
1932fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LCallNew(LOperand* context, LOperand* constructor) {
1933fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org    inputs_[0] = context;
1934fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org    inputs_[1] = constructor;
19357516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  }
1936c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1937fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* context() { return inputs_[0]; }
1938fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* constructor() { return inputs_[1]; }
1939c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
1940c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(CallNew, "call-new")
1941c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_HYDROGEN_ACCESSOR(CallNew)
1942c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1943ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) OVERRIDE;
1944c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1945c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  int arity() const { return hydrogen()->argument_count() - 1; }
1946c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
1947c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1948c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1949ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LCallNewArray FINAL : public LTemplateInstruction<1, 2, 0> {
1950750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org public:
1951fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LCallNewArray(LOperand* context, LOperand* constructor) {
1952fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org    inputs_[0] = context;
1953fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org    inputs_[1] = constructor;
1954750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  }
1955750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
1956fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* context() { return inputs_[0]; }
1957fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* constructor() { return inputs_[1]; }
1958750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
1959750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  DECLARE_CONCRETE_INSTRUCTION(CallNewArray, "call-new-array")
1960750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  DECLARE_HYDROGEN_ACCESSOR(CallNewArray)
1961750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
1962ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) OVERRIDE;
1963750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
1964750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  int arity() const { return hydrogen()->argument_count() - 1; }
1965750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org};
1966750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
1967750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
1968ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LCallRuntime FINAL : public LTemplateInstruction<1, 1, 0> {
1969c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
1970fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  explicit LCallRuntime(LOperand* context) {
1971fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org    inputs_[0] = context;
1972fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  }
1973fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org
1974fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* context() { return inputs_[0]; }
1975fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org
1976c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(CallRuntime, "call-runtime")
1977c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_HYDROGEN_ACCESSOR(CallRuntime)
1978c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1979ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual bool ClobbersDoubleRegisters(Isolate* isolate) const OVERRIDE {
1980fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org    return save_doubles() == kDontSaveFPRegs;
1981fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  }
1982fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org
1983c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  const Runtime::Function* function() const { return hydrogen()->function(); }
1984c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  int arity() const { return hydrogen()->argument_count(); }
1985fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  SaveFPRegsMode save_doubles() const { return hydrogen()->save_doubles(); }
1986c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
1987c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1988c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
1989ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LInteger32ToDouble FINAL : public LTemplateInstruction<1, 1, 0> {
1990c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
1991c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  explicit LInteger32ToDouble(LOperand* value) {
1992c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    inputs_[0] = value;
19937516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  }
19947516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
1995c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* value() { return inputs_[0]; }
1996c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
1997c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(Integer32ToDouble, "int32-to-double")
1998c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
1999c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2000c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2001ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LUint32ToDouble FINAL : public LTemplateInstruction<1, 1, 0> {
200278502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org public:
200378502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org  explicit LUint32ToDouble(LOperand* value) {
200478502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org    inputs_[0] = value;
200578502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org  }
200678502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org
2007c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* value() { return inputs_[0]; }
2008c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
200978502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(Uint32ToDouble, "uint32-to-double")
201078502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org};
201178502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org
201278502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org
2013ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LNumberTagI FINAL : public LTemplateInstruction<1, 1, 2> {
2014c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
2015bc176057ae476990672de915df235c9aeadc8521titzer@chromium.org  LNumberTagI(LOperand* value, LOperand* temp1, LOperand* temp2) {
2016c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    inputs_[0] = value;
2017bc176057ae476990672de915df235c9aeadc8521titzer@chromium.org    temps_[0] = temp1;
2018bc176057ae476990672de915df235c9aeadc8521titzer@chromium.org    temps_[1] = temp2;
20197516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  }
20207516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
2021c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* value() { return inputs_[0]; }
2022bc176057ae476990672de915df235c9aeadc8521titzer@chromium.org  LOperand* temp1() { return temps_[0]; }
2023bc176057ae476990672de915df235c9aeadc8521titzer@chromium.org  LOperand* temp2() { return temps_[1]; }
2024c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
2025c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(NumberTagI, "number-tag-i")
2026c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
2027c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2028c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2029ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LNumberTagU FINAL : public LTemplateInstruction<1, 1, 2> {
203078502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org public:
2031bc176057ae476990672de915df235c9aeadc8521titzer@chromium.org  LNumberTagU(LOperand* value, LOperand* temp1, LOperand* temp2) {
203278502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org    inputs_[0] = value;
2033bc176057ae476990672de915df235c9aeadc8521titzer@chromium.org    temps_[0] = temp1;
2034bc176057ae476990672de915df235c9aeadc8521titzer@chromium.org    temps_[1] = temp2;
203578502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org  }
203678502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org
2037c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* value() { return inputs_[0]; }
2038bc176057ae476990672de915df235c9aeadc8521titzer@chromium.org  LOperand* temp1() { return temps_[0]; }
2039bc176057ae476990672de915df235c9aeadc8521titzer@chromium.org  LOperand* temp2() { return temps_[1]; }
2040c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
204178502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(NumberTagU, "number-tag-u")
204278502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org};
204378502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org
204478502a9310f9ff7ecb5377453c4e16d091c93676jkummerow@chromium.org
2045ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LNumberTagD FINAL : public LTemplateInstruction<1, 1, 2> {
2046c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
2047c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LNumberTagD(LOperand* value, LOperand* temp, LOperand* temp2) {
2048c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    inputs_[0] = value;
2049c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org    temps_[0] = temp;
2050c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    temps_[1] = temp2;
20517516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  }
20527516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
2053c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* value() { return inputs_[0]; }
2054c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* temp() { return temps_[0]; }
2055c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* temp2() { return temps_[1]; }
2056c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
2057c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(NumberTagD, "number-tag-d")
20587c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  DECLARE_HYDROGEN_ACCESSOR(Change)
2059c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
2060c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
20617516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
2062ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LDoubleToSmi FINAL : public LTemplateInstruction<1, 1, 0> {
2063a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org public:
20648fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org  explicit LDoubleToSmi(LOperand* value) {
2065a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org    inputs_[0] = value;
2066a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  }
2067a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org
2068a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  LOperand* value() { return inputs_[0]; }
2069a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org
2070a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  DECLARE_CONCRETE_INSTRUCTION(DoubleToSmi, "double-to-smi")
2071a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  DECLARE_HYDROGEN_ACCESSOR(UnaryOperation)
2072a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org
2073a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  bool truncating() { return hydrogen()->CanTruncateToInt32(); }
2074a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org};
2075a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org
2076a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org
2077c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org// Sometimes truncating conversion from a tagged value to an int32.
2078ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LDoubleToI FINAL : public LTemplateInstruction<1, 1, 0> {
2079c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
20808fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org  explicit LDoubleToI(LOperand* value) {
2081c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    inputs_[0] = value;
20827516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  }
20837516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
2084c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* value() { return inputs_[0]; }
2085c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
2086c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(DoubleToI, "double-to-i")
2087c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_HYDROGEN_ACCESSOR(UnaryOperation)
2088c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2089c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  bool truncating() { return hydrogen()->CanTruncateToInt32(); }
2090c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
2091c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2092c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2093c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org// Truncating conversion from a tagged value to an int32.
2094ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LTaggedToI FINAL : public LTemplateInstruction<1, 1, 2> {
2095c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
2096c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LTaggedToI(LOperand* value,
2097c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org             LOperand* temp,
20988fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org             LOperand* temp2) {
2099c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    inputs_[0] = value;
2100c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org    temps_[0] = temp;
2101c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    temps_[1] = temp2;
21027516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  }
21037516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
2104c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* value() { return inputs_[0]; }
2105c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* temp() { return temps_[0]; }
2106c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* temp2() { return temps_[1]; }
2107c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
2108c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(TaggedToI, "tagged-to-i")
2109528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(Change)
2110c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2111c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  bool truncating() { return hydrogen()->CanTruncateToInt32(); }
2112c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
2113c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
21147516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
2115ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LSmiTag FINAL : public LTemplateInstruction<1, 1, 0> {
2116c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
2117c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  explicit LSmiTag(LOperand* value) {
2118c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    inputs_[0] = value;
21197516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  }
21207516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
2121c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* value() { return inputs_[0]; }
2122c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
2123c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(SmiTag, "smi-tag")
2124381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(Change)
2125c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
21267516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
2127c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2128ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LNumberUntagD FINAL : public LTemplateInstruction<1, 1, 0> {
2129c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
2130c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  explicit LNumberUntagD(LOperand* value) {
2131c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    inputs_[0] = value;
21327516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  }
21337516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
2134c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* value() { return inputs_[0]; }
2135c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
2136c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(NumberUntagD, "double-untag")
2137c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_HYDROGEN_ACCESSOR(Change)
2138c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
2139c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2140c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2141ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LSmiUntag FINAL : public LTemplateInstruction<1, 1, 0> {
2142c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
2143c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LSmiUntag(LOperand* value, bool needs_check)
2144c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org      : needs_check_(needs_check) {
2145c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    inputs_[0] = value;
21467516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  }
21477516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
2148c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* value() { return inputs_[0]; }
2149c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  bool needs_check() const { return needs_check_; }
2150c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2151c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  DECLARE_CONCRETE_INSTRUCTION(SmiUntag, "smi-untag")
2152c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
2153c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org private:
2154c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  bool needs_check_;
2155c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
2156c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2157c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2158ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LStoreNamedField FINAL : public LTemplateInstruction<0, 2, 1> {
2159c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
2160c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LStoreNamedField(LOperand* object, LOperand* value, LOperand* temp) {
2161c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org    inputs_[0] = object;
2162c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org    inputs_[1] = value;
216337141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org    temps_[0] = temp;
21647516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  }
21657516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
2166c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* object() { return inputs_[0]; }
2167c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* value() { return inputs_[1]; }
2168c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* temp() { return temps_[0]; }
2169c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
2170c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(StoreNamedField, "store-named-field")
2171c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_HYDROGEN_ACCESSOR(StoreNamedField)
2172c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2173ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) OVERRIDE;
2174c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2175f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  Representation representation() const {
2176f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org    return hydrogen()->field_representation();
2177f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  }
2178c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
2179c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2180c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2181ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LStoreNamedGeneric FINAL : public LTemplateInstruction<0, 3, 0> {
2182c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
2183fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LStoreNamedGeneric(LOperand* context, LOperand* object, LOperand* value) {
2184fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org    inputs_[0] = context;
2185fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org    inputs_[1] = object;
2186fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org    inputs_[2] = value;
21877516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  }
21887516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
2189fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* context() { return inputs_[0]; }
2190fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* object() { return inputs_[1]; }
2191fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* value() { return inputs_[2]; }
2192c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
2193c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(StoreNamedGeneric, "store-named-generic")
2194c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_HYDROGEN_ACCESSOR(StoreNamedGeneric)
2195c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2196ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) OVERRIDE;
2197c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2198c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  Handle<Object> name() const { return hydrogen()->name(); }
2199486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  StrictMode strict_mode() { return hydrogen()->strict_mode(); }
2200c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
2201c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2202c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2203ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LStoreKeyed FINAL : public LTemplateInstruction<0, 3, 0> {
2204c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
2205e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  LStoreKeyed(LOperand* object, LOperand* key, LOperand* value) {
2206c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org    inputs_[0] = object;
2207c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    inputs_[1] = key;
2208c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org    inputs_[2] = value;
22097516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  }
22107516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
2211e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  bool is_external() const { return hydrogen()->is_external(); }
22125c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org  bool is_fixed_typed_array() const {
22135c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org    return hydrogen()->is_fixed_typed_array();
22145c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org  }
22155c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org  bool is_typed_elements() const {
22165c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org    return is_external() || is_fixed_typed_array();
22175c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org  }
2218c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* elements() { return inputs_[0]; }
2219c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* key() { return inputs_[1]; }
2220c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* value() { return inputs_[2]; }
2221e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  ElementsKind elements_kind() const {
2222e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org    return hydrogen()->elements_kind();
2223e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  }
2224c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
2225e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  DECLARE_CONCRETE_INSTRUCTION(StoreKeyed, "store-keyed")
2226e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  DECLARE_HYDROGEN_ACCESSOR(StoreKeyed)
2227c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2228ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) OVERRIDE;
2229fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org  bool NeedsCanonicalization() { return hydrogen()->NeedsCanonicalization(); }
2230fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org  uint32_t base_offset() const { return hydrogen()->base_offset(); }
2231c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
2232c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2233c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2234ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LStoreKeyedGeneric FINAL : public LTemplateInstruction<0, 4, 0> {
2235c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
2236fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LStoreKeyedGeneric(LOperand* context,
2237fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org                     LOperand* obj,
2238fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org                     LOperand* key,
2239fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org                     LOperand* value) {
2240fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org    inputs_[0] = context;
2241fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org    inputs_[1] = obj;
2242fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org    inputs_[2] = key;
2243fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org    inputs_[3] = value;
22447516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  }
22457516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
2246fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* context() { return inputs_[0]; }
2247fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* object() { return inputs_[1]; }
2248fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* key() { return inputs_[2]; }
2249fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* value() { return inputs_[3]; }
2250c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
2251c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(StoreKeyedGeneric, "store-keyed-generic")
2252c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_HYDROGEN_ACCESSOR(StoreKeyedGeneric)
2253c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2254ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) OVERRIDE;
2255c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2256486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  StrictMode strict_mode() { return hydrogen()->strict_mode(); }
2257c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
2258c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2259c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2260ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LTransitionElementsKind FINAL : public LTemplateInstruction<0, 2, 1> {
2261c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
2262c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LTransitionElementsKind(LOperand* object,
2263fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org                          LOperand* context,
2264d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org                          LOperand* new_map_temp) {
2265c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    inputs_[0] = object;
2266fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org    inputs_[1] = context;
2267c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    temps_[0] = new_map_temp;
22687516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  }
22697516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
2270fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* context() { return inputs_[1]; }
2271c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* object() { return inputs_[0]; }
2272c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* new_map_temp() { return temps_[0]; }
2273c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
2274c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(TransitionElementsKind,
2275c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org                               "transition-elements-kind")
2276c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_HYDROGEN_ACCESSOR(TransitionElementsKind)
2277c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2278ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) OVERRIDE;
2279c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2280528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Handle<Map> original_map() { return hydrogen()->original_map().handle(); }
2281528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Handle<Map> transitioned_map() {
2282528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    return hydrogen()->transitioned_map().handle();
2283528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  }
2284003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org  ElementsKind from_kind() { return hydrogen()->from_kind(); }
2285003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org  ElementsKind to_kind() { return hydrogen()->to_kind(); }
22867516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org};
22877516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
22887516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
2289ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LTrapAllocationMemento FINAL : public LTemplateInstruction<0, 1, 1> {
22907c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org public:
22917c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  LTrapAllocationMemento(LOperand* object,
22927c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org                         LOperand* temp) {
22937c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org    inputs_[0] = object;
22947c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org    temps_[0] = temp;
22957c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  }
22967c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org
22977c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  LOperand* object() { return inputs_[0]; }
22987c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  LOperand* temp() { return temps_[0]; }
22997c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org
23007c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  DECLARE_CONCRETE_INSTRUCTION(TrapAllocationMemento,
23017c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org                               "trap-allocation-memento")
23027c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org};
23037c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org
23047c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org
2305ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LStringAdd FINAL : public LTemplateInstruction<1, 3, 0> {
23067516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org public:
2307fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LStringAdd(LOperand* context, LOperand* left, LOperand* right) {
2308fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org    inputs_[0] = context;
2309fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org    inputs_[1] = left;
2310fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org    inputs_[2] = right;
23117516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  }
23127516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
2313fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* context() { return inputs_[0]; }
2314fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* left() { return inputs_[1]; }
2315fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* right() { return inputs_[2]; }
2316c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
2317c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  DECLARE_CONCRETE_INSTRUCTION(StringAdd, "string-add")
2318c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  DECLARE_HYDROGEN_ACCESSOR(StringAdd)
2319c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
2320c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
23217516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
2322c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2323ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LStringCharCodeAt FINAL : public LTemplateInstruction<1, 3, 0> {
2324c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
2325fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LStringCharCodeAt(LOperand* context, LOperand* string, LOperand* index) {
2326fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org    inputs_[0] = context;
2327fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org    inputs_[1] = string;
2328fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org    inputs_[2] = index;
23297516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  }
23307516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
2331fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* context() { return inputs_[0]; }
2332fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* string() { return inputs_[1]; }
2333fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* index() { return inputs_[2]; }
2334c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
2335c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  DECLARE_CONCRETE_INSTRUCTION(StringCharCodeAt, "string-char-code-at")
2336c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  DECLARE_HYDROGEN_ACCESSOR(StringCharCodeAt)
2337c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
2338c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2339c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2340ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LStringCharFromCode FINAL : public LTemplateInstruction<1, 2, 0> {
2341c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
2342fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  explicit LStringCharFromCode(LOperand* context, LOperand* char_code) {
2343fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org    inputs_[0] = context;
2344fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org    inputs_[1] = char_code;
23457516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  }
2346c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2347fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* context() { return inputs_[0]; }
2348fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* char_code() { return inputs_[1]; }
2349c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
2350c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(StringCharFromCode, "string-char-from-code")
2351c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_HYDROGEN_ACCESSOR(StringCharFromCode)
23527516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org};
23537516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
23547516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
2355ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LCheckValue FINAL : public LTemplateInstruction<0, 1, 0> {
23567516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org public:
23571f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org  explicit LCheckValue(LOperand* value) {
2358c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    inputs_[0] = value;
23597516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  }
23607516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
2361c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* value() { return inputs_[0]; }
236264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org
23631f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org  DECLARE_CONCRETE_INSTRUCTION(CheckValue, "check-value")
23641f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org  DECLARE_HYDROGEN_ACCESSOR(CheckValue)
2365c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
2366c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2367c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2368ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LCheckInstanceType FINAL : public LTemplateInstruction<0, 1, 0> {
2369c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
2370c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  explicit LCheckInstanceType(LOperand* value) {
2371c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    inputs_[0] = value;
23727516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  }
2373c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2374c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* value() { return inputs_[0]; }
2375c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
2376c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(CheckInstanceType, "check-instance-type")
2377c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_HYDROGEN_ACCESSOR(CheckInstanceType)
2378c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
2379c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2380c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2381ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LCheckMaps FINAL : public LTemplateInstruction<0, 1, 0> {
2382c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
2383af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org  explicit LCheckMaps(LOperand* value = NULL) {
2384c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    inputs_[0] = value;
23857516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  }
23867516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
2387c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* value() { return inputs_[0]; }
2388c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
23891456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(CheckMaps, "check-maps")
23901456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org  DECLARE_HYDROGEN_ACCESSOR(CheckMaps)
2391c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
2392c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2393c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2394ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LCheckSmi FINAL : public LTemplateInstruction<1, 1, 0> {
2395c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
2396c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  explicit LCheckSmi(LOperand* value) {
2397c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    inputs_[0] = value;
23987516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  }
2399c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2400c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* value() { return inputs_[0]; }
2401c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
2402c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(CheckSmi, "check-smi")
24037516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org};
24047516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
24057516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
2406ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LCheckNonSmi FINAL : public LTemplateInstruction<0, 1, 0> {
24077516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org public:
2408c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  explicit LCheckNonSmi(LOperand* value) {
2409c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    inputs_[0] = value;
2410c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  }
2411c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2412c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* value() { return inputs_[0]; }
2413c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
2414c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(CheckNonSmi, "check-non-smi")
24151510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  DECLARE_HYDROGEN_ACCESSOR(CheckHeapObject)
2416c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
2417c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
24187516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
2419ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LClampDToUint8 FINAL : public LTemplateInstruction<1, 1, 1> {
2420c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
2421c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LClampDToUint8(LOperand* unclamped, LOperand* temp) {
2422c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org    inputs_[0] = unclamped;
2423c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    temps_[0] = temp;
24247516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  }
24257516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
2426c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LOperand* unclamped() { return inputs_[0]; }
2427c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* temp() { return temps_[0]; }
2428c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2429c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(ClampDToUint8, "clamp-d-to-uint8")
2430c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
2431c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2432c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2433ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LClampIToUint8 FINAL : public LTemplateInstruction<1, 1, 0> {
2434c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
2435c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  explicit LClampIToUint8(LOperand* unclamped) {
2436c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org    inputs_[0] = unclamped;
24377516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  }
24387516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
2439c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LOperand* unclamped() { return inputs_[0]; }
2440c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2441c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(ClampIToUint8, "clamp-i-to-uint8")
2442c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
2443c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2444c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2445ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LClampTToUint8 FINAL : public LTemplateInstruction<1, 1, 1> {
2446c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
2447c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LClampTToUint8(LOperand* unclamped, LOperand* temp) {
2448c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org    inputs_[0] = unclamped;
2449c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    temps_[0] = temp;
24507516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  }
24517516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
2452c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LOperand* unclamped() { return inputs_[0]; }
2453c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* temp() { return temps_[0]; }
2454c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2455c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(ClampTToUint8, "clamp-t-to-uint8")
2456c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
2457c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2458c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2459ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LDoubleBits FINAL : public LTemplateInstruction<1, 1, 0> {
2460ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org public:
2461ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  explicit LDoubleBits(LOperand* value) {
2462ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org    inputs_[0] = value;
2463ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  }
2464ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
2465ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  LOperand* value() { return inputs_[0]; }
2466ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
2467ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(DoubleBits, "double-bits")
2468ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(DoubleBits)
2469ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org};
2470ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
2471ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
2472ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LConstructDouble FINAL : public LTemplateInstruction<1, 2, 0> {
2473ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org public:
2474ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  LConstructDouble(LOperand* hi, LOperand* lo) {
2475ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org    inputs_[0] = hi;
2476ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org    inputs_[1] = lo;
2477ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  }
2478ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
2479ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  LOperand* hi() { return inputs_[0]; }
2480ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  LOperand* lo() { return inputs_[1]; }
2481ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
2482ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(ConstructDouble, "construct-double")
2483ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org};
2484ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
2485ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
2486ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LAllocate FINAL : public LTemplateInstruction<1, 2, 2> {
24877c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org public:
2488fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LAllocate(LOperand* context,
2489fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org            LOperand* size,
2490fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org            LOperand* temp1,
2491fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org            LOperand* temp2) {
2492fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org    inputs_[0] = context;
24937c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org    inputs_[1] = size;
24947c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org    temps_[0] = temp1;
24957c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org    temps_[1] = temp2;
24967c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  }
24977c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org
2498fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* context() { return inputs_[0]; }
24997c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  LOperand* size() { return inputs_[1]; }
25007c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  LOperand* temp1() { return temps_[0]; }
25017c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  LOperand* temp2() { return temps_[1]; }
25027c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org
25037c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  DECLARE_CONCRETE_INSTRUCTION(Allocate, "allocate")
25047c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  DECLARE_HYDROGEN_ACCESSOR(Allocate)
25057c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org};
25067c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org
25077c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org
2508ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LRegExpLiteral FINAL : public LTemplateInstruction<1, 1, 0> {
2509c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
2510fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  explicit LRegExpLiteral(LOperand* context) {
2511fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org    inputs_[0] = context;
2512fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  }
2513fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org
2514fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* context() { return inputs_[0]; }
2515fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org
2516c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(RegExpLiteral, "regexp-literal")
2517c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_HYDROGEN_ACCESSOR(RegExpLiteral)
2518c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
2519c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2520c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2521ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LFunctionLiteral FINAL : public LTemplateInstruction<1, 1, 0> {
2522c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
2523fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  explicit LFunctionLiteral(LOperand* context) {
2524fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org    inputs_[0] = context;
2525fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  }
2526fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org
2527fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* context() { return inputs_[0]; }
2528fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org
2529c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(FunctionLiteral, "function-literal")
2530c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_HYDROGEN_ACCESSOR(FunctionLiteral)
2531c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
2532c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2533c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2534ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LToFastProperties FINAL : public LTemplateInstruction<1, 1, 0> {
2535c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
2536c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  explicit LToFastProperties(LOperand* value) {
2537c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    inputs_[0] = value;
25387516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  }
25397516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
2540c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* value() { return inputs_[0]; }
2541c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
2542c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(ToFastProperties, "to-fast-properties")
2543c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_HYDROGEN_ACCESSOR(ToFastProperties)
2544c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
2545c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2546c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2547ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LTypeof FINAL : public LTemplateInstruction<1, 2, 0> {
2548c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
2549fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LTypeof(LOperand* context, LOperand* value) {
2550fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org    inputs_[0] = context;
2551fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org    inputs_[1] = value;
25527516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  }
25537516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
2554fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* context() { return inputs_[0]; }
2555fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* value() { return inputs_[1]; }
2556c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
2557c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(Typeof, "typeof")
2558c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
2559c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2560c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2561ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LTypeofIsAndBranch FINAL : public LControlInstruction<1, 0> {
2562c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
2563c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  explicit LTypeofIsAndBranch(LOperand* value) {
2564c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    inputs_[0] = value;
25657516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  }
25667516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
2567c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* value() { return inputs_[0]; }
2568c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
2569c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(TypeofIsAndBranch, "typeof-is-and-branch")
2570c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_HYDROGEN_ACCESSOR(TypeofIsAndBranch)
2571c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2572c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  Handle<String> type_literal() { return hydrogen()->type_literal(); }
2573c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2574ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual void PrintDataTo(StringStream* stream) OVERRIDE;
2575c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
2576c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2577c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2578ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LIsConstructCallAndBranch FINAL : public LControlInstruction<0, 1> {
2579c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
2580c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  explicit LIsConstructCallAndBranch(LOperand* temp) {
2581c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org    temps_[0] = temp;
25827516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  }
25837516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
2584c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  LOperand* temp() { return temps_[0]; }
2585c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org
2586c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(IsConstructCallAndBranch,
2587c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org                               "is-construct-call-and-branch")
2588c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
2589c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
25907516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
2591ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LOsrEntry FINAL : public LTemplateInstruction<0, 0, 0> {
2592c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
25931510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  LOsrEntry() {}
2594c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2595ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual bool HasInterestingComment(LCodeGen* gen) const OVERRIDE {
259632cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org    return false;
259732cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org  }
2598c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(OsrEntry, "osr-entry")
2599c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
2600c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2601c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2602ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LStackCheck FINAL : public LTemplateInstruction<0, 1, 0> {
2603c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
2604fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  explicit LStackCheck(LOperand* context) {
2605fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org    inputs_[0] = context;
2606fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  }
2607fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org
2608fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* context() { return inputs_[0]; }
2609fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org
2610c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_CONCRETE_INSTRUCTION(StackCheck, "stack-check")
2611c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  DECLARE_HYDROGEN_ACCESSOR(StackCheck)
2612c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2613c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  Label* done_label() { return &done_label_; }
2614c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2615c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org private:
2616c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  Label done_label_;
2617c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org};
2618c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2619c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2620ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LForInPrepareMap FINAL : public LTemplateInstruction<1, 2, 0> {
2621812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org public:
2622fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LForInPrepareMap(LOperand* context, LOperand* object) {
2623fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org    inputs_[0] = context;
2624fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org    inputs_[1] = object;
2625812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  }
2626812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org
2627fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* context() { return inputs_[0]; }
2628fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  LOperand* object() { return inputs_[1]; }
2629812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org
2630812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  DECLARE_CONCRETE_INSTRUCTION(ForInPrepareMap, "for-in-prepare-map")
2631812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org};
2632812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org
2633812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org
2634ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LForInCacheArray FINAL : public LTemplateInstruction<1, 1, 0> {
2635812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org public:
263689e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org  explicit LForInCacheArray(LOperand* map) {
2637812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org    inputs_[0] = map;
2638812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  }
2639812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org
2640812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  LOperand* map() { return inputs_[0]; }
2641812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org
2642812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  DECLARE_CONCRETE_INSTRUCTION(ForInCacheArray, "for-in-cache-array")
2643812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org
2644812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  int idx() {
2645812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org    return HForInCacheArray::cast(this->hydrogen_value())->idx();
2646812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  }
2647812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org};
2648812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org
2649812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org
2650ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LCheckMapValue FINAL : public LTemplateInstruction<0, 2, 0> {
2651812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org public:
2652812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  LCheckMapValue(LOperand* value, LOperand* map) {
2653812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org    inputs_[0] = value;
2654812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org    inputs_[1] = map;
2655812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  }
2656812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org
2657812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  LOperand* value() { return inputs_[0]; }
2658812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  LOperand* map() { return inputs_[1]; }
2659812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org
2660812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  DECLARE_CONCRETE_INSTRUCTION(CheckMapValue, "check-map-value")
2661812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org};
2662812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org
2663812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org
2664ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LLoadFieldByIndex FINAL : public LTemplateInstruction<1, 2, 0> {
2665812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org public:
2666812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  LLoadFieldByIndex(LOperand* object, LOperand* index) {
2667812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org    inputs_[0] = object;
2668812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org    inputs_[1] = index;
2669812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  }
2670812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org
2671812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  LOperand* object() { return inputs_[0]; }
2672812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  LOperand* index() { return inputs_[1]; }
2673812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org
2674812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  DECLARE_CONCRETE_INSTRUCTION(LoadFieldByIndex, "load-field-by-index")
2675812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org};
2676812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org
2677812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org
26781e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.orgclass LStoreFrameContext: public LTemplateInstruction<0, 1, 0> {
26791e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org public:
26801e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  explicit LStoreFrameContext(LOperand* context) {
26811e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org    inputs_[0] = context;
26821e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  }
26831e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org
26841e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  LOperand* context() { return inputs_[0]; }
26851e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org
26861e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(StoreFrameContext, "store-frame-context")
26871e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org};
26881e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org
26891e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org
26901e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.orgclass LAllocateBlockContext: public LTemplateInstruction<1, 2, 0> {
26911e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org public:
26921e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  LAllocateBlockContext(LOperand* context, LOperand* function) {
26931e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org    inputs_[0] = context;
26941e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org    inputs_[1] = function;
26951e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  }
26961e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org
26971e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  LOperand* context() { return inputs_[0]; }
26981e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  LOperand* function() { return inputs_[1]; }
26991e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org
27001e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  Handle<ScopeInfo> scope_info() { return hydrogen()->scope_info(); }
27011e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org
27021e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  DECLARE_CONCRETE_INSTRUCTION(AllocateBlockContext, "allocate-block-context")
27031e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  DECLARE_HYDROGEN_ACCESSOR(AllocateBlockContext)
27041e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org};
27051e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org
27061e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org
2707c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgclass LChunkBuilder;
2708ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LPlatformChunk FINAL : public LChunk {
2709c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org public:
271028583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org  LPlatformChunk(CompilationInfo* info, HGraph* graph)
271128583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org      : LChunk(info, graph) { }
2712c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2713c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  int GetNextSpillIndex(RegisterKind kind);
2714c3669763e2617aefdac84a072327b201b3dff129jkummerow@chromium.org  LOperand* GetNextSpillSlot(RegisterKind kind);
27157516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org};
27167516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
27177516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
2718ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LChunkBuilder FINAL : public LChunkBuilderBase {
27197516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org public:
2720c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LChunkBuilder(CompilationInfo* info, HGraph* graph, LAllocator* allocator)
2721b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org      : LChunkBuilderBase(info, graph),
2722c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org        current_instruction_(NULL),
2723c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org        current_block_(NULL),
2724c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org        next_block_(NULL),
2725b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        allocator_(allocator) {}
2726a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org
27277516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // Build the sequence for the graph.
272828583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org  LPlatformChunk* Build();
27297516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
27307516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // Declare methods that deal with the individual node types.
2731c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org#define DECLARE_DO(type) LInstruction* Do##type(H##type* node);
27327516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  HYDROGEN_CONCRETE_INSTRUCTION_LIST(DECLARE_DO)
27337516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org#undef DECLARE_DO
27347516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
273559297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org  LInstruction* DoMultiplyAdd(HMul* mul, HValue* addend);
273659297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org
2737b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org  static bool HasMagicNumberForDivisor(int32_t divisor);
2738b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org
2739e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  LInstruction* DoMathFloor(HUnaryMathOperation* instr);
2740e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  LInstruction* DoMathRound(HUnaryMathOperation* instr);
2741dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  LInstruction* DoMathFround(HUnaryMathOperation* instr);
2742e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  LInstruction* DoMathAbs(HUnaryMathOperation* instr);
2743e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  LInstruction* DoMathLog(HUnaryMathOperation* instr);
2744e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  LInstruction* DoMathExp(HUnaryMathOperation* instr);
2745e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  LInstruction* DoMathSqrt(HUnaryMathOperation* instr);
2746e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  LInstruction* DoMathPowHalf(HUnaryMathOperation* instr);
2747f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  LInstruction* DoMathClz32(HUnaryMathOperation* instr);
274800a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org  LInstruction* DoDivByPowerOf2I(HDiv* instr);
274900a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org  LInstruction* DoDivByConstI(HDiv* instr);
27504edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org  LInstruction* DoDivI(HDiv* instr);
2751ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  LInstruction* DoModByPowerOf2I(HMod* instr);
275200a4ad70bb8883074ba7630edd7140762bcb86a0machenbach@chromium.org  LInstruction* DoModByConstI(HMod* instr);
2753ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  LInstruction* DoModI(HMod* instr);
2754bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  LInstruction* DoFlooringDivByPowerOf2I(HMathFloorOfDiv* instr);
2755ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  LInstruction* DoFlooringDivByConstI(HMathFloorOfDiv* instr);
27564edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org  LInstruction* DoFlooringDivI(HMathFloorOfDiv* instr);
2757e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
2758c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org private:
2759c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  // Methods for getting operands for Use / Define / Temp.
2760c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LUnallocated* ToUnallocated(Register reg);
2761c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LUnallocated* ToUnallocated(DoubleRegister reg);
2762c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2763c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  // Methods for setting up define-use relationships.
2764c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  MUST_USE_RESULT LOperand* Use(HValue* value, LUnallocated* operand);
2765c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  MUST_USE_RESULT LOperand* UseFixed(HValue* value, Register fixed_register);
2766c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  MUST_USE_RESULT LOperand* UseFixedDouble(HValue* value,
2767c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org                                           DoubleRegister fixed_register);
2768c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2769c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  // A value that is guaranteed to be allocated to a register.
2770c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  // Operand created by UseRegister is guaranteed to be live until the end of
2771c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  // instruction. This means that register allocator will not reuse it's
2772c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  // register for any other operand inside instruction.
2773c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  // Operand created by UseRegisterAtStart is guaranteed to be live only at
2774c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  // instruction start. Register allocator is free to assign the same register
2775c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  // to some other operand used inside instruction (i.e. temporary or
2776c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  // output).
2777c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  MUST_USE_RESULT LOperand* UseRegister(HValue* value);
2778c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  MUST_USE_RESULT LOperand* UseRegisterAtStart(HValue* value);
2779c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2780c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  // An input operand in a register that may be trashed.
2781c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  MUST_USE_RESULT LOperand* UseTempRegister(HValue* value);
2782c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2783c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  // An input operand in a register or stack slot.
2784c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  MUST_USE_RESULT LOperand* Use(HValue* value);
2785c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  MUST_USE_RESULT LOperand* UseAtStart(HValue* value);
2786c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2787c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  // An input operand in a register, stack slot or a constant operand.
2788c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  MUST_USE_RESULT LOperand* UseOrConstant(HValue* value);
2789c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  MUST_USE_RESULT LOperand* UseOrConstantAtStart(HValue* value);
2790c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2791c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  // An input operand in a register or a constant operand.
2792c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  MUST_USE_RESULT LOperand* UseRegisterOrConstant(HValue* value);
2793c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  MUST_USE_RESULT LOperand* UseRegisterOrConstantAtStart(HValue* value);
2794c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2795f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  // An input operand in a constant operand.
2796f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  MUST_USE_RESULT LOperand* UseConstant(HValue* value);
2797f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
2798c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  // An input operand in register, stack slot or a constant operand.
2799c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  // Will not be moved to a register even if one is freely available.
2800ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  virtual MUST_USE_RESULT LOperand* UseAny(HValue* value) OVERRIDE;
2801c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2802c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  // Temporary operand that must be in a register.
2803c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  MUST_USE_RESULT LUnallocated* TempRegister();
2804d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  MUST_USE_RESULT LUnallocated* TempDoubleRegister();
2805c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  MUST_USE_RESULT LOperand* FixedTemp(Register reg);
2806c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  MUST_USE_RESULT LOperand* FixedTemp(DoubleRegister reg);
2807c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2808c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  // Methods for setting up define-use relationships.
2809c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  // Return the same instruction that they are passed.
281026ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  LInstruction* Define(LTemplateResultInstruction<1>* instr,
281126ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org                       LUnallocated* result);
281226ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  LInstruction* DefineAsRegister(LTemplateResultInstruction<1>* instr);
281326ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  LInstruction* DefineAsSpilled(LTemplateResultInstruction<1>* instr,
281426ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org                                int index);
281526ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  LInstruction* DefineSameAsFirst(LTemplateResultInstruction<1>* instr);
281626ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  LInstruction* DefineFixed(LTemplateResultInstruction<1>* instr,
281726ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org                            Register reg);
281826ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  LInstruction* DefineFixedDouble(LTemplateResultInstruction<1>* instr,
281926ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org                                  DoubleRegister reg);
2820c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LInstruction* AssignEnvironment(LInstruction* instr);
2821c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LInstruction* AssignPointerMap(LInstruction* instr);
2822c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2823c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  enum CanDeoptimize { CAN_DEOPTIMIZE_EAGERLY, CANNOT_DEOPTIMIZE_EAGERLY };
2824c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2825c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  // By default we assume that instruction sequences generated for calls
2826c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  // cannot deoptimize eagerly and we do not attach environment to this
2827c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  // instruction.
2828c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LInstruction* MarkAsCall(
2829c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org      LInstruction* instr,
2830c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org      HInstruction* hinstr,
2831c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org      CanDeoptimize can_deoptimize = CANNOT_DEOPTIMIZE_EAGERLY);
2832c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2833c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  void VisitInstruction(HInstruction* current);
2834011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  void AddInstruction(LInstruction* instr, HInstruction* current);
2835c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2836c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  void DoBasicBlock(HBasicBlock* block, HBasicBlock* next_block);
2837c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LInstruction* DoBit(Token::Value op, HBitwiseBinaryOperation* instr);
2838c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LInstruction* DoShift(Token::Value op, HBitwiseBinaryOperation* instr);
2839c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LInstruction* DoArithmeticD(Token::Value op,
2840c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org                              HArithmeticBinaryOperation* instr);
2841c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LInstruction* DoArithmeticT(Token::Value op,
2842528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org                              HBinaryOperation* instr);
2843c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
2844c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  HInstruction* current_instruction_;
2845c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  HBasicBlock* current_block_;
2846c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  HBasicBlock* next_block_;
2847c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  LAllocator* allocator_;
2848c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
28497516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  DISALLOW_COPY_AND_ASSIGN(LChunkBuilder);
28507516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org};
28517516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
2852c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org#undef DECLARE_HYDROGEN_ACCESSOR
2853c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org#undef DECLARE_CONCRETE_INSTRUCTION
28547516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
28557516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org} }  // namespace v8::internal
28567516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
28577516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org#endif  // V8_MIPS_LITHIUM_MIPS_H_
2858