13ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Copyright 2012 the V8 project authors. All rights reserved.
2b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// Redistribution and use in source and binary forms, with or without
3b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// modification, are permitted provided that the following conditions are
4b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// met:
5b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch//
6b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch//     * Redistributions of source code must retain the above copyright
7b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch//       notice, this list of conditions and the following disclaimer.
8b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch//     * Redistributions in binary form must reproduce the above
9b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch//       copyright notice, this list of conditions and the following
10b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch//       disclaimer in the documentation and/or other materials provided
11b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch//       with the distribution.
12b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch//     * Neither the name of Google Inc. nor the names of its
13b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch//       contributors may be used to endorse or promote products derived
14b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch//       from this software without specific prior written permission.
15b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch//
16b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
28b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifndef V8_X64_LITHIUM_X64_H_
29b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#define V8_X64_LITHIUM_X64_H_
30b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
31b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#include "hydrogen.h"
32b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#include "lithium-allocator.h"
33086aeeaae12517475c22695a200be45495516549Ben Murdoch#include "lithium.h"
34b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#include "safepoint-table.h"
353fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch#include "utils.h"
36b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
37b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochnamespace v8 {
38b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochnamespace internal {
39b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
40b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// Forward declarations.
41b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass LCodeGen;
42b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
43b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch#define LITHIUM_ALL_INSTRUCTION_LIST(V)         \
44b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(ControlInstruction)                         \
45b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(Call)                                       \
46b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LITHIUM_CONCRETE_INSTRUCTION_LIST(V)
47b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
48b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
49b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch#define LITHIUM_CONCRETE_INSTRUCTION_LIST(V)    \
50b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(AccessArgumentsAt)                          \
51b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(AddI)                                       \
523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  V(AllocateObject)                             \
53b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(ApplyArguments)                             \
54b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(ArgumentsElements)                          \
55b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(ArgumentsLength)                            \
56b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(ArithmeticD)                                \
57b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(ArithmeticT)                                \
58b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(ArrayLiteral)                               \
59b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(BitI)                                       \
60b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(BitNotI)                                    \
61b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(BoundsCheck)                                \
62b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(Branch)                                     \
63b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(CallConstantFunction)                       \
64b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(CallFunction)                               \
65b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(CallGlobal)                                 \
66b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(CallKeyed)                                  \
67b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(CallKnownGlobal)                            \
68b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(CallNamed)                                  \
69b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(CallNew)                                    \
70b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(CallRuntime)                                \
71b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(CallStub)                                   \
72b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(CheckFunction)                              \
73b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(CheckInstanceType)                          \
74b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(CheckMap)                                   \
7544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(CheckNonSmi)                                \
76b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(CheckPrototypeMaps)                         \
77b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(CheckSmi)                                   \
78257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(ClampDToUint8)                              \
79257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(ClampIToUint8)                              \
80257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(ClampTToUint8)                              \
8144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(ClassOfTestAndBranch)                       \
823fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  V(CmpConstantEqAndBranch)                     \
83b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(CmpIDAndBranch)                             \
843fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  V(CmpObjectEqAndBranch)                       \
85b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(CmpMapAndBranch)                            \
86b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(CmpT)                                       \
87b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(ConstantD)                                  \
88b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(ConstantI)                                  \
89b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(ConstantT)                                  \
901e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  V(Context)                                    \
913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  V(DeclareGlobals)                             \
92b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(DeleteProperty)                             \
93b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(Deoptimize)                                 \
94b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(DivI)                                       \
95b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(DoubleToI)                                  \
963fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  V(ElementsKind)                               \
973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  V(FastLiteral)                                \
9869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  V(FixedArrayBaseLength)                       \
99b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(FunctionLiteral)                            \
100e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  V(GetCachedArrayIndex)                        \
101b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(GlobalObject)                               \
102b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(GlobalReceiver)                             \
103b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(Goto)                                       \
104053d10c438f14580aaf4ab1b2aad93a5a4fe8b82Steve Block  V(HasCachedArrayIndexAndBranch)               \
105257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(HasInstanceTypeAndBranch)                   \
106257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(In)                                         \
107b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(InstanceOf)                                 \
108b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(InstanceOfKnownGlobal)                      \
109257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(InstructionGap)                             \
110b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(Integer32ToDouble)                          \
111257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(InvokeFunction)                             \
112257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(IsConstructCallAndBranch)                   \
1133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  V(IsNilAndBranch)                             \
114b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(IsObjectAndBranch)                          \
1153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  V(IsStringAndBranch)                          \
116b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(IsSmiAndBranch)                             \
117257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(IsUndetectableAndBranch)                    \
1183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  V(StringCompareAndBranch)                     \
119b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(JSArrayLength)                              \
120b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(Label)                                      \
121b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(LazyBailout)                                \
122b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(LoadContextSlot)                            \
123b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(LoadElements)                               \
12444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(LoadExternalArrayPointer)                   \
125257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(LoadFunctionPrototype)                      \
1268b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  V(LoadGlobalCell)                             \
1278b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  V(LoadGlobalGeneric)                          \
1283fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  V(LoadKeyedFastDoubleElement)                 \
129b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(LoadKeyedFastElement)                       \
130b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(LoadKeyedGeneric)                           \
13144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(LoadKeyedSpecializedArrayElement)           \
132b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(LoadNamedField)                             \
13344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(LoadNamedFieldPolymorphic)                  \
134b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(LoadNamedGeneric)                           \
135b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(ModI)                                       \
136b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(MulI)                                       \
137b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(NumberTagD)                                 \
138b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(NumberTagI)                                 \
139b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(NumberUntagD)                               \
1405d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch  V(ObjectLiteral)                              \
141b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(OsrEntry)                                   \
142e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  V(OuterContext)                               \
143b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(Parameter)                                  \
144b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(Power)                                      \
145b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(PushArgument)                               \
1463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  V(Random)                                     \
147b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(RegExpLiteral)                              \
148b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(Return)                                     \
149b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(ShiftI)                                     \
150b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(SmiTag)                                     \
151b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(SmiUntag)                                   \
152b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(StackCheck)                                 \
153e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  V(StoreContextSlot)                           \
1548b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  V(StoreGlobalCell)                            \
1558b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  V(StoreGlobalGeneric)                         \
1563fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  V(StoreKeyedFastDoubleElement)                \
157b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(StoreKeyedFastElement)                      \
158b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(StoreKeyedGeneric)                          \
15944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(StoreKeyedSpecializedArrayElement)          \
160b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(StoreNamedField)                            \
161b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(StoreNamedGeneric)                          \
162257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(StringAdd)                                  \
163e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  V(StringCharCodeAt)                           \
16444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(StringCharFromCode)                         \
165e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  V(StringLength)                               \
166b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(SubI)                                       \
167b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(TaggedToI)                                  \
1683fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  V(ThisFunction)                               \
169b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(Throw)                                      \
170257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(ToFastProperties)                           \
1713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  V(TransitionElementsKind)                     \
172b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(Typeof)                                     \
173b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(TypeofIsAndBranch)                          \
174b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(UnaryMathOperation)                         \
175b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(UnknownOSRValue)                            \
1763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  V(ValueOf)                                    \
1773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  V(ForInPrepareMap)                            \
1783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  V(ForInCacheArray)                            \
1793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  V(CheckMapValue)                              \
1803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  V(LoadFieldByIndex)                           \
1813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  V(DateField)                                  \
1823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  V(WrapReceiver)
183b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
184b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
185257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#define DECLARE_CONCRETE_INSTRUCTION(type, mnemonic)              \
186257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  virtual Opcode opcode() const { return LInstruction::k##type; } \
187257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  virtual void CompileToNative(LCodeGen* generator);              \
188257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  virtual const char* Mnemonic() const { return mnemonic; }       \
189257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  static L##type* cast(LInstruction* instr) {                     \
190257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    ASSERT(instr->Is##type());                                    \
191257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return reinterpret_cast<L##type*>(instr);                     \
192b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
193b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
194b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
195b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch#define DECLARE_HYDROGEN_ACCESSOR(type)     \
196b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  H##type* hydrogen() const {               \
197b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    return H##type::cast(hydrogen_value()); \
198b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
199b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
200b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
201b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass LInstruction: public ZoneObject {
202b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
203b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LInstruction()
2041e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      :  environment_(NULL),
2051e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block         hydrogen_value_(NULL),
2061e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block         is_call_(false),
2071e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block         is_save_doubles_(false) { }
2081e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
209b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  virtual ~LInstruction() { }
210b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
211b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  virtual void CompileToNative(LCodeGen* generator) = 0;
212b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  virtual const char* Mnemonic() const = 0;
213b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  virtual void PrintTo(StringStream* stream);
214b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  virtual void PrintDataTo(StringStream* stream) = 0;
215b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  virtual void PrintOutputOperandTo(StringStream* stream) = 0;
216b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
217257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  enum Opcode {
218257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    // Declare a unique enum value for each instruction.
219257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#define DECLARE_OPCODE(type) k##type,
220257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    LITHIUM_CONCRETE_INSTRUCTION_LIST(DECLARE_OPCODE)
221257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    kNumberOfInstructions
222257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#undef DECLARE_OPCODE
223257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  };
224257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
225257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  virtual Opcode opcode() const = 0;
226257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
227257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // Declare non-virtual type testers for all leaf IR classes.
228257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#define DECLARE_PREDICATE(type) \
229257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  bool Is##type() const { return opcode() == k##type; }
230257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  LITHIUM_CONCRETE_INSTRUCTION_LIST(DECLARE_PREDICATE)
231257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#undef DECLARE_PREDICATE
232257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
233257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // Declare virtual predicates for instructions that don't have
234257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // an opcode.
235257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  virtual bool IsGap() const { return false; }
236b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
237b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  virtual bool IsControl() const { return false; }
238b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2391e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  void set_environment(LEnvironment* env) { environment_ = env; }
2401e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  LEnvironment* environment() const { return environment_; }
2411e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  bool HasEnvironment() const { return environment_ != NULL; }
242b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
243b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  void set_pointer_map(LPointerMap* p) { pointer_map_.set(p); }
244b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LPointerMap* pointer_map() const { return pointer_map_.get(); }
245b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  bool HasPointerMap() const { return pointer_map_.is_set(); }
246b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
247b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  void set_hydrogen_value(HValue* value) { hydrogen_value_ = value; }
248b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  HValue* hydrogen_value() const { return hydrogen_value_; }
249b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
250b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  void set_deoptimization_environment(LEnvironment* env) {
251b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    deoptimization_environment_.set(env);
252b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
253b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LEnvironment* deoptimization_environment() const {
254b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    return deoptimization_environment_.get();
255b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
256b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  bool HasDeoptimizationEnvironment() const {
257b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    return deoptimization_environment_.is_set();
258b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
259b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2601e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  void MarkAsCall() { is_call_ = true; }
2611e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  void MarkAsSaveDoubles() { is_save_doubles_ = true; }
2621e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
2631e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  // Interface to the register allocator and iterators.
2641e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  bool IsMarkedAsCall() const { return is_call_; }
2651e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  bool IsMarkedAsSaveDoubles() const { return is_save_doubles_; }
2661e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
2671e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  virtual bool HasResult() const = 0;
2681e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  virtual LOperand* result() = 0;
2691e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
2701e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  virtual int InputCount() = 0;
2711e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  virtual LOperand* InputAt(int i) = 0;
2721e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  virtual int TempCount() = 0;
2731e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  virtual LOperand* TempAt(int i) = 0;
2741e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
2751e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  LOperand* FirstInput() { return InputAt(0); }
2761e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  LOperand* Output() { return HasResult() ? result() : NULL; }
2771e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
2781e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block#ifdef DEBUG
2791e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  void VerifyCall();
2801e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block#endif
2811e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
282b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch private:
2831e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  LEnvironment* environment_;
284b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  SetOncePointer<LPointerMap> pointer_map_;
285b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  HValue* hydrogen_value_;
286b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  SetOncePointer<LEnvironment> deoptimization_environment_;
2871e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  bool is_call_;
2881e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  bool is_save_doubles_;
289b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
290b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
291b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2921e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// R = number of result operands (0 or 1).
2931e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// I = number of input operands.
2941e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// T = number of temporary operands.
2951e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blocktemplate<int R, int I, int T>
296b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochclass LTemplateInstruction: public LInstruction {
297b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
298b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  // Allow 0 or 1 output operands.
299b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  STATIC_ASSERT(R == 0 || R == 1);
300b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  virtual bool HasResult() const { return R != 0; }
301b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  void set_result(LOperand* operand) { results_[0] = operand; }
302b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LOperand* result() { return results_[0]; }
303b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
304b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  int InputCount() { return I; }
305b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LOperand* InputAt(int i) { return inputs_[i]; }
306b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
307b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  int TempCount() { return T; }
308b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LOperand* TempAt(int i) { return temps_[i]; }
309b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
310b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  virtual void PrintDataTo(StringStream* stream);
311b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  virtual void PrintOutputOperandTo(StringStream* stream);
312b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
313b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch protected:
3143fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  EmbeddedContainer<LOperand*, R> results_;
3153fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  EmbeddedContainer<LOperand*, I> inputs_;
3163fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  EmbeddedContainer<LOperand*, T> temps_;
317b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
318b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
319b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
320b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochclass LGap: public LTemplateInstruction<0, 0, 0> {
321b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
322b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  explicit LGap(HBasicBlock* block)
323b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      : block_(block) {
324b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    parallel_moves_[BEFORE] = NULL;
325b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    parallel_moves_[START] = NULL;
326b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    parallel_moves_[END] = NULL;
327b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    parallel_moves_[AFTER] = NULL;
328b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
329b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
330257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // Can't use the DECLARE-macro here because of sub-classes.
331257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  virtual bool IsGap() const { return true; }
332b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  virtual void PrintDataTo(StringStream* stream);
333257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  static LGap* cast(LInstruction* instr) {
334257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    ASSERT(instr->IsGap());
335257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return reinterpret_cast<LGap*>(instr);
336257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
337b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
338b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  bool IsRedundant() const;
339b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
340b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  HBasicBlock* block() const { return block_; }
341b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
342b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  enum InnerPosition {
343b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    BEFORE,
344b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    START,
345b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    END,
346b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    AFTER,
347b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    FIRST_INNER_POSITION = BEFORE,
348b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    LAST_INNER_POSITION = AFTER
349b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  };
350b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
351b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LParallelMove* GetOrCreateParallelMove(InnerPosition pos)  {
352b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    if (parallel_moves_[pos] == NULL) parallel_moves_[pos] = new LParallelMove;
353b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    return parallel_moves_[pos];
354b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
355b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
356b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LParallelMove* GetParallelMove(InnerPosition pos)  {
357b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    return parallel_moves_[pos];
358b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
359b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
360b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch private:
361b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LParallelMove* parallel_moves_[LAST_INNER_POSITION + 1];
362b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  HBasicBlock* block_;
363b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
364b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
365b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
366257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochclass LInstructionGap: public LGap {
367257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public:
368257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  explicit LInstructionGap(HBasicBlock* block) : LGap(block) { }
369257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
370257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(InstructionGap, "gap")
371257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
372257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
373257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
374b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochclass LGoto: public LTemplateInstruction<0, 0, 0> {
375b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
3763fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  explicit LGoto(int block_id) : block_id_(block_id) { }
377b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
378b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Goto, "goto")
379b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  virtual void PrintDataTo(StringStream* stream);
380b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  virtual bool IsControl() const { return true; }
381b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
382b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  int block_id() const { return block_id_; }
383b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
384b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch private:
385b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  int block_id_;
386b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
387b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
388b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
389b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochclass LLazyBailout: public LTemplateInstruction<0, 0, 0> {
390b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
391b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LLazyBailout() : gap_instructions_size_(0) { }
392b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
393b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(LazyBailout, "lazy-bailout")
394b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
395b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  void set_gap_instructions_size(int gap_instructions_size) {
396b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    gap_instructions_size_ = gap_instructions_size;
397b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
398b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  int gap_instructions_size() { return gap_instructions_size_; }
399b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
400b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch private:
401b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  int gap_instructions_size_;
402b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
403b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
404b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
405b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochclass LDeoptimize: public LTemplateInstruction<0, 0, 0> {
406b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
407b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Deoptimize, "deoptimize")
408b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
409b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
410b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
411b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochclass LLabel: public LGap {
412b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
413b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  explicit LLabel(HBasicBlock* block)
414b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      : LGap(block), replacement_(NULL) { }
415b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
416b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Label, "label")
417b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
418b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  virtual void PrintDataTo(StringStream* stream);
419b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
420b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  int block_id() const { return block()->block_id(); }
421b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  bool is_loop_header() const { return block()->IsLoopHeader(); }
422b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  Label* label() { return &label_; }
423b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LLabel* replacement() const { return replacement_; }
424b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  void set_replacement(LLabel* label) { replacement_ = label; }
425b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  bool HasReplacement() const { return replacement_ != NULL; }
426b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
427b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch private:
428b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  Label label_;
429b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LLabel* replacement_;
430b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
431b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
432b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
433b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochclass LParameter: public LTemplateInstruction<1, 0, 0> {
434b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
435b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Parameter, "parameter")
436b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
437b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
438b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
439b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochclass LCallStub: public LTemplateInstruction<1, 0, 0> {
440b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
441b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CallStub, "call-stub")
442b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_HYDROGEN_ACCESSOR(CallStub)
443b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
444b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  TranscendentalCache::Type transcendental_type() {
445b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    return hydrogen()->transcendental_type();
446b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
447b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
448b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
449b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
450b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochclass LUnknownOSRValue: public LTemplateInstruction<1, 0, 0> {
451b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
452b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(UnknownOSRValue, "unknown-osr-value")
453b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
454b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
455b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
4561e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blocktemplate<int I, int T>
457b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochclass LControlInstruction: public LTemplateInstruction<0, I, T> {
458b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
459b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  virtual bool IsControl() const { return true; }
460b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
4613fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  int SuccessorCount() { return hydrogen()->SuccessorCount(); }
4623fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HBasicBlock* SuccessorAt(int i) { return hydrogen()->SuccessorAt(i); }
4633fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  int true_block_id() { return hydrogen()->SuccessorAt(0)->block_id(); }
4643fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  int false_block_id() { return hydrogen()->SuccessorAt(1)->block_id(); }
465b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
466b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch private:
4673fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HControlInstruction* hydrogen() {
4683fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return HControlInstruction::cast(this->hydrogen_value());
4693fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
470b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
471b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
472b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
4733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass LWrapReceiver: public LTemplateInstruction<1, 2, 0> {
4743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
4753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LWrapReceiver(LOperand* receiver, LOperand* function) {
4763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[0] = receiver;
4773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[1] = function;
4783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
4793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(WrapReceiver, "wrap-receiver")
4813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* receiver() { return inputs_[0]; }
4833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* function() { return inputs_[1]; }
4843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
4853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
487b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochclass LApplyArguments: public LTemplateInstruction<1, 4, 0> {
488b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
489b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LApplyArguments(LOperand* function,
490b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch                  LOperand* receiver,
491b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch                  LOperand* length,
492b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch                  LOperand* elements) {
493b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[0] = function;
494b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[1] = receiver;
495b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[2] = length;
496b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[3] = elements;
497b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
498b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
499b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(ApplyArguments, "apply-arguments")
500b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
501b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LOperand* function() { return inputs_[0]; }
502b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LOperand* receiver() { return inputs_[1]; }
503b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LOperand* length() { return inputs_[2]; }
504b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LOperand* elements() { return inputs_[3]; }
505b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
506b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
507b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
508b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochclass LAccessArgumentsAt: public LTemplateInstruction<1, 3, 0> {
509b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
510b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LAccessArgumentsAt(LOperand* arguments, LOperand* length, LOperand* index) {
511b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[0] = arguments;
512b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[1] = length;
513b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[2] = index;
514b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
515b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
516b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(AccessArgumentsAt, "access-arguments-at")
517b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
518b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LOperand* arguments() { return inputs_[0]; }
519b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LOperand* length() { return inputs_[1]; }
520b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LOperand* index() { return inputs_[2]; }
521b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
522b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  virtual void PrintDataTo(StringStream* stream);
523b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
524b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
525b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
5261e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass LArgumentsLength: public LTemplateInstruction<1, 1, 0> {
527b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
528b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  explicit LArgumentsLength(LOperand* elements) {
529b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[0] = elements;
530b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
531b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
532b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(ArgumentsLength, "arguments-length")
533b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
534b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
535b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
536b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochclass LArgumentsElements: public LTemplateInstruction<1, 0, 0> {
537b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
538b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LArgumentsElements() { }
539b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
540b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(ArgumentsElements, "arguments-elements")
541b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
542b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
543b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
544b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochclass LModI: public LTemplateInstruction<1, 2, 1> {
545b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
546b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LModI(LOperand* left, LOperand* right, LOperand* temp) {
547b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[0] = left;
548b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[1] = right;
549b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    temps_[0] = temp;
550b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
551b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
552b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(ModI, "mod-i")
553b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_HYDROGEN_ACCESSOR(Mod)
554b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
555b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
556b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
557b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochclass LDivI: public LTemplateInstruction<1, 2, 1> {
558b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
559b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LDivI(LOperand* left, LOperand* right, LOperand* temp) {
560b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[0] = left;
561b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[1] = right;
562b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    temps_[0] = temp;
563b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
564b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
565b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(DivI, "div-i")
566b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_HYDROGEN_ACCESSOR(Div)
567b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
568b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
569b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
5701e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass LMulI: public LTemplateInstruction<1, 2, 0> {
571b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
5721e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  LMulI(LOperand* left, LOperand* right) {
573b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[0] = left;
574b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[1] = right;
575b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
576b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
577b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(MulI, "mul-i")
578b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_HYDROGEN_ACCESSOR(Mul)
579b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
580b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
581b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
5821e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass LCmpIDAndBranch: public LControlInstruction<2, 0> {
583b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
584b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LCmpIDAndBranch(LOperand* left, LOperand* right) {
585b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[0] = left;
586b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[1] = right;
587b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
588b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
589b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CmpIDAndBranch, "cmp-id-and-branch")
5903fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_HYDROGEN_ACCESSOR(CompareIDAndBranch)
591b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
592b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  Token::Value op() const { return hydrogen()->token(); }
593b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  bool is_double() const {
594b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    return hydrogen()->GetInputRepresentation().IsDouble();
595b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
596b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
597b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  virtual void PrintDataTo(StringStream* stream);
598b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
599b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
600b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
6011e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass LUnaryMathOperation: public LTemplateInstruction<1, 1, 0> {
602b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
603b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  explicit LUnaryMathOperation(LOperand* value) {
604b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[0] = value;
605b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
606b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
607b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(UnaryMathOperation, "unary-math-operation")
608b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_HYDROGEN_ACCESSOR(UnaryMathOperation)
609b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
610b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  virtual void PrintDataTo(StringStream* stream);
611b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  BuiltinFunctionId op() const { return hydrogen()->op(); }
612b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
613b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
614b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
6153fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass LCmpObjectEqAndBranch: public LControlInstruction<2, 0> {
616b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
6173fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  LCmpObjectEqAndBranch(LOperand* left, LOperand* right) {
618b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[0] = left;
619b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[1] = right;
620b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
621b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
6223fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CmpObjectEqAndBranch,
6233fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch                               "cmp-object-eq-and-branch")
624b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
625b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
626b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
6273fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass LCmpConstantEqAndBranch: public LControlInstruction<1, 0> {
628b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
6293fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  explicit LCmpConstantEqAndBranch(LOperand* left) {
630b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[0] = left;
631b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
632b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
6333fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CmpConstantEqAndBranch,
6343fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch                               "cmp-constant-eq-and-branch")
6353fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_HYDROGEN_ACCESSOR(CompareConstantEqAndBranch)
636b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
637b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
638b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
6393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass LIsNilAndBranch: public LControlInstruction<1, 1> {
640b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
6413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LIsNilAndBranch(LOperand* value, LOperand* temp) {
642b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[0] = value;
643b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    temps_[0] = temp;
644b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
645b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
6463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(IsNilAndBranch, "is-nil-and-branch")
6473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(IsNilAndBranch)
648b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
6493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EqualityKind kind() const { return hydrogen()->kind(); }
6503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  NilValue nil() const { return hydrogen()->nil(); }
651b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
652b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  virtual void PrintDataTo(StringStream* stream);
653b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
654b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
655b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
6561e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass LIsObjectAndBranch: public LControlInstruction<1, 0> {
657b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
6581e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  explicit LIsObjectAndBranch(LOperand* value) {
659b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[0] = value;
660b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
661b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
662b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(IsObjectAndBranch, "is-object-and-branch")
6633fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_HYDROGEN_ACCESSOR(IsObjectAndBranch)
664b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
665b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  virtual void PrintDataTo(StringStream* stream);
666b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
667b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
668b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
6693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass LIsStringAndBranch: public LControlInstruction<1, 1> {
6703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
6713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  explicit LIsStringAndBranch(LOperand* value, LOperand* temp) {
6723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[0] = value;
6733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    temps_[0] = temp;
6743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
6753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
6763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(IsStringAndBranch, "is-string-and-branch")
6773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(IsStringAndBranch)
6783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
6793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual void PrintDataTo(StringStream* stream);
6803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
6813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
6823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
6831e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass LIsSmiAndBranch: public LControlInstruction<1, 0> {
684b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
685b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  explicit LIsSmiAndBranch(LOperand* value) {
686b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[0] = value;
687b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
688b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
689b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(IsSmiAndBranch, "is-smi-and-branch")
6903fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_HYDROGEN_ACCESSOR(IsSmiAndBranch)
691b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
692b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  virtual void PrintDataTo(StringStream* stream);
693b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
694b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
695b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
696257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochclass LIsUndetectableAndBranch: public LControlInstruction<1, 1> {
697257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public:
698257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  explicit LIsUndetectableAndBranch(LOperand* value, LOperand* temp) {
699257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    inputs_[0] = value;
700257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    temps_[0] = temp;
701257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
702257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
703257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(IsUndetectableAndBranch,
704257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch                               "is-undetectable-and-branch")
7053fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_HYDROGEN_ACCESSOR(IsUndetectableAndBranch)
706257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
707257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  virtual void PrintDataTo(StringStream* stream);
708257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
709257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
710257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
7113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass LStringCompareAndBranch: public LControlInstruction<2, 0> {
7123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
7133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  explicit LStringCompareAndBranch(LOperand* left, LOperand* right) {
7143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[0] = left;
7153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[1] = right;
7163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
7173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(StringCompareAndBranch,
7193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                               "string-compare-and-branch")
7203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(StringCompareAndBranch)
7213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual void PrintDataTo(StringStream* stream);
7233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Token::Value op() const { return hydrogen()->token(); }
7253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
7263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7281e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass LHasInstanceTypeAndBranch: public LControlInstruction<1, 0> {
729b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
7301e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  explicit LHasInstanceTypeAndBranch(LOperand* value) {
731b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[0] = value;
732b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
733b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
734b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(HasInstanceTypeAndBranch,
735b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch                               "has-instance-type-and-branch")
7363fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_HYDROGEN_ACCESSOR(HasInstanceTypeAndBranch)
737b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
738b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  virtual void PrintDataTo(StringStream* stream);
739b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
740b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
741b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
742e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass LGetCachedArrayIndex: public LTemplateInstruction<1, 1, 0> {
743e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch public:
744e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  explicit LGetCachedArrayIndex(LOperand* value) {
745e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    inputs_[0] = value;
746e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
747e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
748e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(GetCachedArrayIndex, "get-cached-array-index")
749e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(GetCachedArrayIndex)
750e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch};
751e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
752e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
7531e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass LHasCachedArrayIndexAndBranch: public LControlInstruction<1, 0> {
754b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
755b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  explicit LHasCachedArrayIndexAndBranch(LOperand* value) {
756b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[0] = value;
757b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
758b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
759b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(HasCachedArrayIndexAndBranch,
760b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch                               "has-cached-array-index-and-branch")
7613fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_HYDROGEN_ACCESSOR(HasCachedArrayIndexAndBranch)
762b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
763b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  virtual void PrintDataTo(StringStream* stream);
764b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
765b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
766b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
7673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass LClassOfTestAndBranch: public LControlInstruction<1, 2> {
768b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
7693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LClassOfTestAndBranch(LOperand* value, LOperand* temp, LOperand* temp2) {
770b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[0] = value;
771b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    temps_[0] = temp;
7723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    temps_[1] = temp2;
773b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
774b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
775b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(ClassOfTestAndBranch,
776b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch                               "class-of-test-and-branch")
7773fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_HYDROGEN_ACCESSOR(ClassOfTestAndBranch)
778b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
779b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  virtual void PrintDataTo(StringStream* stream);
780b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
781b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
782b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
7831e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass LCmpT: public LTemplateInstruction<1, 2, 0> {
784b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
785b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LCmpT(LOperand* left, LOperand* right) {
786b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[0] = left;
787b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[1] = right;
788b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
789b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
790b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CmpT, "cmp-t")
7913fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_HYDROGEN_ACCESSOR(CompareGeneric)
792b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
793b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  Token::Value op() const { return hydrogen()->token(); }
794b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
795b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
796b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
797257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochclass LIn: public LTemplateInstruction<1, 2, 0> {
798257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public:
799257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  LIn(LOperand* key, LOperand* object) {
800257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    inputs_[0] = key;
801257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    inputs_[1] = object;
802257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
803257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
804257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  LOperand* key() { return inputs_[0]; }
805257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  LOperand* object() { return inputs_[1]; }
806257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
807257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(In, "in")
808257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
809257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
810257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
8111e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass LInstanceOf: public LTemplateInstruction<1, 2, 0> {
812b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
813b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LInstanceOf(LOperand* left, LOperand* right) {
814b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[0] = left;
815b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[1] = right;
816b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
817b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
818b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(InstanceOf, "instance-of")
819b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
820b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
821b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
82244f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass LInstanceOfKnownGlobal: public LTemplateInstruction<1, 1, 1> {
823b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
82444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  LInstanceOfKnownGlobal(LOperand* value, LOperand* temp) {
825b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[0] = value;
82644f0eee88ff00398ff7f715fab053374d808c90dSteve Block    temps_[0] = temp;
827b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
828b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
829b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(InstanceOfKnownGlobal,
830b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch                               "instance-of-known-global")
831b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_HYDROGEN_ACCESSOR(InstanceOfKnownGlobal)
832b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
833b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  Handle<JSFunction> function() const { return hydrogen()->function(); }
834b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
835b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
836b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
837b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochclass LBoundsCheck: public LTemplateInstruction<0, 2, 0> {
838b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
839b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LBoundsCheck(LOperand* index, LOperand* length) {
840b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[0] = index;
841b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[1] = length;
842b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
843b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
844b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LOperand* index() { return inputs_[0]; }
845b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LOperand* length() { return inputs_[1]; }
846b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
847b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(BoundsCheck, "bounds-check")
848b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
849b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
850b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
8511e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass LBitI: public LTemplateInstruction<1, 2, 0> {
852b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
8533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LBitI(LOperand* left, LOperand* right) {
854b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[0] = left;
855b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[1] = right;
856b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
857b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
8583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Token::Value op() const { return hydrogen()->op(); }
859b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
860b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(BitI, "bit-i")
8613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(Bitwise)
862b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
863b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
864b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
8651e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass LShiftI: public LTemplateInstruction<1, 2, 0> {
866b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
867b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LShiftI(Token::Value op, LOperand* left, LOperand* right, bool can_deopt)
868b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      : op_(op), can_deopt_(can_deopt) {
869b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[0] = left;
870b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[1] = right;
871b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
872b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
873b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  Token::Value op() const { return op_; }
874b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
875b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  bool can_deopt() const { return can_deopt_; }
876b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
877b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(ShiftI, "shift-i")
878b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
879b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch private:
880b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  Token::Value op_;
881b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  bool can_deopt_;
882b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
883b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
884b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
8851e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass LSubI: public LTemplateInstruction<1, 2, 0> {
886b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
887b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LSubI(LOperand* left, LOperand* right) {
888b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[0] = left;
889b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[1] = right;
890b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
891b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
892b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(SubI, "sub-i")
893b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_HYDROGEN_ACCESSOR(Sub)
894b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
895b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
896b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
8971e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass LConstantI: public LTemplateInstruction<1, 0, 0> {
898b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
899b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(ConstantI, "constant-i")
9001e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  DECLARE_HYDROGEN_ACCESSOR(Constant)
901b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
9021e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  int32_t value() const { return hydrogen()->Integer32Value(); }
903b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
904b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
905b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
9061e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass LConstantD: public LTemplateInstruction<1, 0, 1> {
907b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
9081e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  explicit LConstantD(LOperand* temp) {
909b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    temps_[0] = temp;
910b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
911b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(ConstantD, "constant-d")
9121e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  DECLARE_HYDROGEN_ACCESSOR(Constant)
913b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
9141e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  double value() const { return hydrogen()->DoubleValue(); }
915b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
916b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
917b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
9181e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass LConstantT: public LTemplateInstruction<1, 0, 0> {
919b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
920b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(ConstantT, "constant-t")
9211e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  DECLARE_HYDROGEN_ACCESSOR(Constant)
922b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
9231e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  Handle<Object> value() const { return hydrogen()->handle(); }
924b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
925b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
926b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
9271e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass LBranch: public LControlInstruction<1, 0> {
928b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
929b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  explicit LBranch(LOperand* value) {
930b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[0] = value;
931b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
932b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
933b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Branch, "branch")
9343fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_HYDROGEN_ACCESSOR(Branch)
935b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
936b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  virtual void PrintDataTo(StringStream* stream);
937b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
938b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
939b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
9401e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass LCmpMapAndBranch: public LTemplateInstruction<0, 1, 0> {
941b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
942b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  explicit LCmpMapAndBranch(LOperand* value) {
943b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[0] = value;
944b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
945b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
946b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CmpMapAndBranch, "cmp-map-and-branch")
9471e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  DECLARE_HYDROGEN_ACCESSOR(CompareMap)
948b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
949b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  virtual bool IsControl() const { return true; }
950b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
951b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  Handle<Map> map() const { return hydrogen()->map(); }
952b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  int true_block_id() const {
9531e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return hydrogen()->FirstSuccessor()->block_id();
954b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
955b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  int false_block_id() const {
9561e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return hydrogen()->SecondSuccessor()->block_id();
957b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
958b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
959b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
960b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
9611e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass LJSArrayLength: public LTemplateInstruction<1, 1, 0> {
962b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
963b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  explicit LJSArrayLength(LOperand* value) {
964b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[0] = value;
965b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
966b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
967b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(JSArrayLength, "js-array-length")
968b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_HYDROGEN_ACCESSOR(JSArrayLength)
969b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
970b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
971b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
97269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochclass LFixedArrayBaseLength: public LTemplateInstruction<1, 1, 0> {
9731e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public:
97469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  explicit LFixedArrayBaseLength(LOperand* value) {
9751e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    inputs_[0] = value;
9761e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
9771e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
97869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(FixedArrayBaseLength,
97969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch                               "fixed-array-base-length")
98069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(FixedArrayBaseLength)
981b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
982b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
983b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
9843fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass LElementsKind: public LTemplateInstruction<1, 1, 0> {
9853fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch public:
9863fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  explicit LElementsKind(LOperand* value) {
9873fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    inputs_[0] = value;
9883fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
9893fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
9903fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(ElementsKind, "elements-kind")
9913fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_HYDROGEN_ACCESSOR(ElementsKind)
9923fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch};
9933fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
9943fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
995e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass LValueOf: public LTemplateInstruction<1, 1, 0> {
996b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
997e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  explicit LValueOf(LOperand* value) {
998b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[0] = value;
999b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
1000b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1001b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(ValueOf, "value-of")
1002b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_HYDROGEN_ACCESSOR(ValueOf)
1003b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
1004b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1005b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
10063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass LDateField: public LTemplateInstruction<1, 1, 0> {
10073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
10083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LDateField(LOperand* date, Smi* index) : index_(index) {
10093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[0] = date;
10103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
10113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
10123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(ValueOf, "date-field")
10133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(ValueOf)
10143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
10153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Smi* index() const { return index_; }
10163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
10173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private:
10183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Smi* index_;
10193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
10203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
10213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
10221e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass LThrow: public LTemplateInstruction<0, 1, 0> {
1023b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
1024b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  explicit LThrow(LOperand* value) {
1025b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[0] = value;
1026b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
1027b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1028b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Throw, "throw")
1029b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
1030b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1031b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
10321e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass LBitNotI: public LTemplateInstruction<1, 1, 0> {
1033b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
1034b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  explicit LBitNotI(LOperand* value) {
1035b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[0] = value;
1036b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
1037b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1038b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(BitNotI, "bit-not-i")
1039b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
1040b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1041b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
10421e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass LAddI: public LTemplateInstruction<1, 2, 0> {
1043b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
1044b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LAddI(LOperand* left, LOperand* right) {
1045b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[0] = left;
1046b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[1] = right;
1047b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
1048b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1049b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(AddI, "add-i")
1050b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_HYDROGEN_ACCESSOR(Add)
1051b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
1052b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1053b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
10541e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass LPower: public LTemplateInstruction<1, 2, 0> {
1055b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
1056b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LPower(LOperand* left, LOperand* right) {
1057b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[0] = left;
1058b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[1] = right;
1059b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
1060b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1061b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Power, "power")
1062b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_HYDROGEN_ACCESSOR(Power)
1063b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
1064b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1065b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
10663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass LRandom: public LTemplateInstruction<1, 1, 0> {
10673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
10683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  explicit LRandom(LOperand* global_object) {
10693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[0] = global_object;
10703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
10713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
10723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(Random, "random")
10733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(Random)
10743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
10753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
10763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
10771e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass LArithmeticD: public LTemplateInstruction<1, 2, 0> {
1078b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
1079b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LArithmeticD(Token::Value op, LOperand* left, LOperand* right)
1080b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      : op_(op) {
1081b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[0] = left;
1082b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[1] = right;
1083b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
1084b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1085b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  Token::Value op() const { return op_; }
1086b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1087257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  virtual Opcode opcode() const { return LInstruction::kArithmeticD; }
1088b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  virtual void CompileToNative(LCodeGen* generator);
1089b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  virtual const char* Mnemonic() const;
1090b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1091b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch private:
1092b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  Token::Value op_;
1093b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
1094b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1095b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
10961e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass LArithmeticT: public LTemplateInstruction<1, 2, 0> {
1097b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
1098b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LArithmeticT(Token::Value op, LOperand* left, LOperand* right)
1099b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      : op_(op) {
1100b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[0] = left;
1101b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[1] = right;
1102b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
1103b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1104257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  virtual Opcode opcode() const { return LInstruction::kArithmeticT; }
1105b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  virtual void CompileToNative(LCodeGen* generator);
1106b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  virtual const char* Mnemonic() const;
1107b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1108b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  Token::Value op() const { return op_; }
1109b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1110b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch private:
1111b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  Token::Value op_;
1112b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
1113b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1114b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
11151e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass LReturn: public LTemplateInstruction<0, 1, 0> {
1116b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
1117b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  explicit LReturn(LOperand* value) {
1118b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[0] = value;
1119b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
1120b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1121b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Return, "return")
1122b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
1123b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1124b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
11251e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass LLoadNamedField: public LTemplateInstruction<1, 1, 0> {
1126b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
1127b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  explicit LLoadNamedField(LOperand* object) {
1128b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[0] = object;
1129b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
1130b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1131b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(LoadNamedField, "load-named-field")
1132b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_HYDROGEN_ACCESSOR(LoadNamedField)
1133b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
1134b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1135b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
113644f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass LLoadNamedFieldPolymorphic: public LTemplateInstruction<1, 1, 0> {
113744f0eee88ff00398ff7f715fab053374d808c90dSteve Block public:
113844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  explicit LLoadNamedFieldPolymorphic(LOperand* object) {
113944f0eee88ff00398ff7f715fab053374d808c90dSteve Block    inputs_[0] = object;
114044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
114144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
114244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  DECLARE_CONCRETE_INSTRUCTION(LoadNamedField, "load-named-field-polymorphic")
114344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  DECLARE_HYDROGEN_ACCESSOR(LoadNamedFieldPolymorphic)
114444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
114544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  LOperand* object() { return inputs_[0]; }
114644f0eee88ff00398ff7f715fab053374d808c90dSteve Block};
114744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
114844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
11491e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass LLoadNamedGeneric: public LTemplateInstruction<1, 1, 0> {
1150b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
1151b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  explicit LLoadNamedGeneric(LOperand* object) {
1152b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[0] = object;
1153b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
1154b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1155b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(LoadNamedGeneric, "load-named-generic")
1156b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_HYDROGEN_ACCESSOR(LoadNamedGeneric)
1157b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1158b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LOperand* object() { return inputs_[0]; }
1159b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  Handle<Object> name() const { return hydrogen()->name(); }
1160b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
1161b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1162b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
11631e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass LLoadFunctionPrototype: public LTemplateInstruction<1, 1, 0> {
1164b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
11651e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  explicit LLoadFunctionPrototype(LOperand* function) {
1166b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[0] = function;
1167b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
1168b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1169b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(LoadFunctionPrototype, "load-function-prototype")
1170b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_HYDROGEN_ACCESSOR(LoadFunctionPrototype)
1171b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1172b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LOperand* function() { return inputs_[0]; }
1173b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
1174b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1175b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
11761e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass LLoadElements: public LTemplateInstruction<1, 1, 0> {
1177b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
1178b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  explicit LLoadElements(LOperand* object) {
1179b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[0] = object;
1180b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
1181b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1182b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(LoadElements, "load-elements")
1183b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
1184b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1185b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
118644f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass LLoadExternalArrayPointer: public LTemplateInstruction<1, 1, 0> {
11871e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public:
118844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  explicit LLoadExternalArrayPointer(LOperand* object) {
11891e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    inputs_[0] = object;
11901e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
11911e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
119244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  DECLARE_CONCRETE_INSTRUCTION(LoadExternalArrayPointer,
119344f0eee88ff00398ff7f715fab053374d808c90dSteve Block                               "load-external-array-pointer")
11941e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block};
11951e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
11961e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
11971e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass LLoadKeyedFastElement: public LTemplateInstruction<1, 2, 0> {
1198b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
1199b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LLoadKeyedFastElement(LOperand* elements, LOperand* key) {
1200b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[0] = elements;
1201b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[1] = key;
1202b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
1203b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1204b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(LoadKeyedFastElement, "load-keyed-fast-element")
1205b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_HYDROGEN_ACCESSOR(LoadKeyedFastElement)
1206b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1207b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LOperand* elements() { return inputs_[0]; }
1208b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LOperand* key() { return inputs_[1]; }
1209b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
1210b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1211b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
12123fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass LLoadKeyedFastDoubleElement: public LTemplateInstruction<1, 2, 0> {
12133fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch public:
12143fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  LLoadKeyedFastDoubleElement(LOperand* elements, LOperand* key) {
12153fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    inputs_[0] = elements;
12163fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    inputs_[1] = key;
12173fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
12183fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
12193fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(LoadKeyedFastDoubleElement,
12203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch                               "load-keyed-fast-double-element")
12213fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_HYDROGEN_ACCESSOR(LoadKeyedFastDoubleElement)
12223fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
12233fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  LOperand* elements() { return inputs_[0]; }
12243fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  LOperand* key() { return inputs_[1]; }
12253fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch};
12263fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
12273fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
122844f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass LLoadKeyedSpecializedArrayElement: public LTemplateInstruction<1, 2, 0> {
12291e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public:
123044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  LLoadKeyedSpecializedArrayElement(LOperand* external_pointer,
123144f0eee88ff00398ff7f715fab053374d808c90dSteve Block                                    LOperand* key) {
12321e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    inputs_[0] = external_pointer;
12331e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    inputs_[1] = key;
12341e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
12351e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
123644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  DECLARE_CONCRETE_INSTRUCTION(LoadKeyedSpecializedArrayElement,
123744f0eee88ff00398ff7f715fab053374d808c90dSteve Block                               "load-keyed-specialized-array-element")
123844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  DECLARE_HYDROGEN_ACCESSOR(LoadKeyedSpecializedArrayElement)
12391e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
12401e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  LOperand* external_pointer() { return inputs_[0]; }
12411e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  LOperand* key() { return inputs_[1]; }
1242589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  ElementsKind elements_kind() const {
12433fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return hydrogen()->elements_kind();
124444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
12451e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block};
12461e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
12471e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
12481e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass LLoadKeyedGeneric: public LTemplateInstruction<1, 2, 0> {
1249b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
1250b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LLoadKeyedGeneric(LOperand* obj, LOperand* key) {
1251b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[0] = obj;
1252b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[1] = key;
1253b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
1254b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1255b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(LoadKeyedGeneric, "load-keyed-generic")
1256b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1257b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LOperand* object() { return inputs_[0]; }
1258b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LOperand* key() { return inputs_[1]; }
1259b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
1260b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1261b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
12628b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochclass LLoadGlobalCell: public LTemplateInstruction<1, 0, 0> {
1263b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
12648b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(LoadGlobalCell, "load-global-cell")
12658b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  DECLARE_HYDROGEN_ACCESSOR(LoadGlobalCell)
1266b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
1267b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1268b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
12698b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochclass LLoadGlobalGeneric: public LTemplateInstruction<1, 1, 0> {
1270b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
12718b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  explicit LLoadGlobalGeneric(LOperand* global_object) {
12728b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    inputs_[0] = global_object;
12738b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  }
12748b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
12758b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(LoadGlobalGeneric, "load-global-generic")
12768b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  DECLARE_HYDROGEN_ACCESSOR(LoadGlobalGeneric)
12778b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
12788b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  LOperand* global_object() { return inputs_[0]; }
12798b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  Handle<Object> name() const { return hydrogen()->name(); }
12808b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  bool for_typeof() const { return hydrogen()->for_typeof(); }
12818b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch};
12828b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
12838b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
1284c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdochclass LStoreGlobalCell: public LTemplateInstruction<0, 1, 1> {
12858b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch public:
1286c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch  explicit LStoreGlobalCell(LOperand* value, LOperand* temp) {
1287b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[0] = value;
1288c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch    temps_[0] = temp;
1289b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
1290b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
12918b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(StoreGlobalCell, "store-global-cell")
12928b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  DECLARE_HYDROGEN_ACCESSOR(StoreGlobalCell)
12933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
12943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* value() { return inputs_[0]; }
12958b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch};
12968b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
12978b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
12988b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochclass LStoreGlobalGeneric: public LTemplateInstruction<0, 2, 0> {
12998b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch public:
13008b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  explicit LStoreGlobalGeneric(LOperand* global_object,
13018b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch                               LOperand* value) {
13028b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    inputs_[0] = global_object;
13038b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    inputs_[1] = value;
13048b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  }
13058b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
13068b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(StoreGlobalGeneric, "store-global-generic")
13078b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  DECLARE_HYDROGEN_ACCESSOR(StoreGlobalGeneric)
13088b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
13098b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  LOperand* global_object() { return InputAt(0); }
13108b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  Handle<Object> name() const { return hydrogen()->name(); }
13118b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  LOperand* value() { return InputAt(1); }
13123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  StrictModeFlag strict_mode_flag() { return hydrogen()->strict_mode_flag(); }
1313b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
1314b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1315b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
13161e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass LLoadContextSlot: public LTemplateInstruction<1, 1, 0> {
1317b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
13181e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  explicit LLoadContextSlot(LOperand* context) {
13191e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    inputs_[0] = context;
13201e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
13211e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1322b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(LoadContextSlot, "load-context-slot")
1323b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_HYDROGEN_ACCESSOR(LoadContextSlot)
1324b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
13251e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  LOperand* context() { return InputAt(0); }
1326b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  int slot_index() { return hydrogen()->slot_index(); }
1327b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1328b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  virtual void PrintDataTo(StringStream* stream);
1329b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
1330b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1331b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1332e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass LStoreContextSlot: public LTemplateInstruction<0, 2, 1> {
1333e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch public:
1334e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  LStoreContextSlot(LOperand* context, LOperand* value, LOperand* temp) {
1335e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    inputs_[0] = context;
1336e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    inputs_[1] = value;
1337e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    temps_[0] = temp;
1338e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1339e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1340e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(StoreContextSlot, "store-context-slot")
1341e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(StoreContextSlot)
1342e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1343e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  LOperand* context() { return InputAt(0); }
1344e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  LOperand* value() { return InputAt(1); }
1345e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  int slot_index() { return hydrogen()->slot_index(); }
1346e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1347e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
1348e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch};
1349e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1350e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
13511e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass LPushArgument: public LTemplateInstruction<0, 1, 0> {
1352b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
1353b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  explicit LPushArgument(LOperand* value) {
1354b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[0] = value;
1355b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
1356b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1357b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(PushArgument, "push-argument")
1358b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
1359b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1360b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
13613fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass LThisFunction: public LTemplateInstruction<1, 0, 0> {
13623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
13633fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(ThisFunction, "this-function")
13643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(ThisFunction)
13653fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch};
13663fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
13673fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
13681e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass LContext: public LTemplateInstruction<1, 0, 0> {
13691e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public:
13701e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  DECLARE_CONCRETE_INSTRUCTION(Context, "context")
13711e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block};
13721e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
13731e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1374e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass LOuterContext: public LTemplateInstruction<1, 1, 0> {
1375e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch public:
1376e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  explicit LOuterContext(LOperand* context) {
1377e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    inputs_[0] = context;
1378e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1379e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1380e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(OuterContext, "outer-context")
1381e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1382e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  LOperand* context() { return InputAt(0); }
1383e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch};
1384e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1385e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
13863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass LDeclareGlobals: public LTemplateInstruction<0, 0, 0> {
13873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
13883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(DeclareGlobals, "declare-globals")
13893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(DeclareGlobals)
13903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
13913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
13923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1393b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochclass LGlobalObject: public LTemplateInstruction<1, 0, 0> {
1394b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
1395b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(GlobalObject, "global-object")
1396b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
1397b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1398b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
139944f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass LGlobalReceiver: public LTemplateInstruction<1, 1, 0> {
1400b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
140144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  explicit LGlobalReceiver(LOperand* global_object) {
140244f0eee88ff00398ff7f715fab053374d808c90dSteve Block    inputs_[0] = global_object;
140344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
140444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1405b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(GlobalReceiver, "global-receiver")
140644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
140744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  LOperand* global() { return InputAt(0); }
1408b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
1409b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1410b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1411b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochclass LCallConstantFunction: public LTemplateInstruction<1, 0, 0> {
1412b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
1413b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CallConstantFunction, "call-constant-function")
1414b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_HYDROGEN_ACCESSOR(CallConstantFunction)
1415b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1416b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  virtual void PrintDataTo(StringStream* stream);
1417b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1418b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  Handle<JSFunction> function() { return hydrogen()->function(); }
1419b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  int arity() const { return hydrogen()->argument_count() - 1; }
1420b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
1421086aeeaae12517475c22695a200be45495516549Ben Murdoch
1422b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1423257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochclass LInvokeFunction: public LTemplateInstruction<1, 1, 0> {
1424257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public:
1425257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  explicit LInvokeFunction(LOperand* function) {
1426257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    inputs_[0] = function;
1427257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
1428257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1429257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(InvokeFunction, "invoke-function")
1430257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_HYDROGEN_ACCESSOR(InvokeFunction)
1431257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1432257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  LOperand* function() { return inputs_[0]; }
1433257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1434257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  virtual void PrintDataTo(StringStream* stream);
1435257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1436257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  int arity() const { return hydrogen()->argument_count() - 1; }
1437257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
1438257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1439257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
14401e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass LCallKeyed: public LTemplateInstruction<1, 1, 0> {
1441b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
14421e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  explicit LCallKeyed(LOperand* key) {
14431e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    inputs_[0] = key;
1444b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1445b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1446b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CallKeyed, "call-keyed")
1447b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_HYDROGEN_ACCESSOR(CallKeyed)
1448b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1449e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  LOperand* key() { return inputs_[0]; }
1450e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1451b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  virtual void PrintDataTo(StringStream* stream);
1452b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1453b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  int arity() const { return hydrogen()->argument_count() - 1; }
1454b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
1455b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1456b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1457b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochclass LCallNamed: public LTemplateInstruction<1, 0, 0> {
1458b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
1459b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CallNamed, "call-named")
1460b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_HYDROGEN_ACCESSOR(CallNamed)
1461b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1462b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  virtual void PrintDataTo(StringStream* stream);
1463b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1464b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  Handle<String> name() const { return hydrogen()->name(); }
1465b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  int arity() const { return hydrogen()->argument_count() - 1; }
1466b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
1467b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1468b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
14693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass LCallFunction: public LTemplateInstruction<1, 1, 0> {
1470b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
14713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  explicit LCallFunction(LOperand* function) {
14723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[0] = function;
14733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
1474e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1475b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CallFunction, "call-function")
1476b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_HYDROGEN_ACCESSOR(CallFunction)
1477b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
14783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* function() { return inputs_[0]; }
14793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  int arity() const { return hydrogen()->argument_count() - 1; }
1480b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
1481b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1482b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1483b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochclass LCallGlobal: public LTemplateInstruction<1, 0, 0> {
1484b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
1485b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CallGlobal, "call-global")
1486b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_HYDROGEN_ACCESSOR(CallGlobal)
1487b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1488b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  virtual void PrintDataTo(StringStream* stream);
1489b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1490b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  Handle<String> name() const {return hydrogen()->name(); }
1491b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  int arity() const { return hydrogen()->argument_count() - 1; }
1492b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
1493b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1494b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1495b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochclass LCallKnownGlobal: public LTemplateInstruction<1, 0, 0> {
1496b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
1497b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CallKnownGlobal, "call-known-global")
1498b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_HYDROGEN_ACCESSOR(CallKnownGlobal)
1499b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1500b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  virtual void PrintDataTo(StringStream* stream);
1501b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1502b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  Handle<JSFunction> target() const { return hydrogen()->target();  }
1503b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  int arity() const { return hydrogen()->argument_count() - 1;  }
1504b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
1505b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1506b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
15071e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass LCallNew: public LTemplateInstruction<1, 1, 0> {
1508b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
1509b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  explicit LCallNew(LOperand* constructor) {
1510b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[0] = constructor;
1511b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1512b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1513b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CallNew, "call-new")
1514b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_HYDROGEN_ACCESSOR(CallNew)
1515b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1516b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  virtual void PrintDataTo(StringStream* stream);
1517086aeeaae12517475c22695a200be45495516549Ben Murdoch
1518b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  int arity() const { return hydrogen()->argument_count() - 1; }
1519b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
1520086aeeaae12517475c22695a200be45495516549Ben Murdoch
1521086aeeaae12517475c22695a200be45495516549Ben Murdoch
1522b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochclass LCallRuntime: public LTemplateInstruction<1, 0, 0> {
1523b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
1524b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CallRuntime, "call-runtime")
1525b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_HYDROGEN_ACCESSOR(CallRuntime)
1526b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
152744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  const Runtime::Function* function() const { return hydrogen()->function(); }
1528b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  int arity() const { return hydrogen()->argument_count(); }
1529b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
1530b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1531b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
15321e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass LInteger32ToDouble: public LTemplateInstruction<1, 1, 0> {
1533b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
1534b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  explicit LInteger32ToDouble(LOperand* value) {
1535b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[0] = value;
1536086aeeaae12517475c22695a200be45495516549Ben Murdoch  }
1537b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1538b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Integer32ToDouble, "int32-to-double")
1539b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
1540b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1541b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
15421e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass LNumberTagI: public LTemplateInstruction<1, 1, 0> {
1543b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
1544b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  explicit LNumberTagI(LOperand* value) {
1545b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[0] = value;
1546086aeeaae12517475c22695a200be45495516549Ben Murdoch  }
1547b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1548b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(NumberTagI, "number-tag-i")
1549b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
1550b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1551b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1552b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochclass LNumberTagD: public LTemplateInstruction<1, 1, 1> {
1553b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
1554b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  explicit LNumberTagD(LOperand* value, LOperand* temp) {
1555b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[0] = value;
1556b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    temps_[0] = temp;
1557b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1558b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1559b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(NumberTagD, "number-tag-d")
1560b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1561b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1562b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1563b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch// Sometimes truncating conversion from a tagged value to an int32.
1564e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass LDoubleToI: public LTemplateInstruction<1, 1, 0> {
1565b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
1566e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  explicit LDoubleToI(LOperand* value) {
1567b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[0] = value;
1568b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
1569b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1570b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(DoubleToI, "double-to-i")
15713fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_HYDROGEN_ACCESSOR(UnaryOperation)
1572b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1573b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  bool truncating() { return hydrogen()->CanTruncateToInt32(); }
1574b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
1575b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1576b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1577b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch// Truncating conversion from a tagged value to an int32.
1578b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochclass LTaggedToI: public LTemplateInstruction<1, 1, 1> {
1579b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
1580b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LTaggedToI(LOperand* value, LOperand* temp) {
1581b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[0] = value;
1582b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    temps_[0] = temp;
1583b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1584b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1585b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(TaggedToI, "tagged-to-i")
15863fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_HYDROGEN_ACCESSOR(UnaryOperation)
1587b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1588b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  bool truncating() { return hydrogen()->CanTruncateToInt32(); }
1589b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
1590b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1591b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
15921e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass LSmiTag: public LTemplateInstruction<1, 1, 0> {
1593b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
1594b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  explicit LSmiTag(LOperand* value) {
1595b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[0] = value;
1596b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1597086aeeaae12517475c22695a200be45495516549Ben Murdoch
1598b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(SmiTag, "smi-tag")
1599b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1600b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1601b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
16021e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass LNumberUntagD: public LTemplateInstruction<1, 1, 0> {
1603b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
1604b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  explicit LNumberUntagD(LOperand* value) {
1605b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[0] = value;
1606b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
1607b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1608b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(NumberUntagD, "double-untag")
16097d3e7fc4b65010eabe860313ee0c64f50843f6e3Ben Murdoch  DECLARE_HYDROGEN_ACCESSOR(Change);
1610b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
1611b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1612b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
16131e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass LSmiUntag: public LTemplateInstruction<1, 1, 0> {
1614b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
1615b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LSmiUntag(LOperand* value, bool needs_check)
1616b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      : needs_check_(needs_check) {
1617b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[0] = value;
1618b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1619b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1620b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(SmiUntag, "smi-untag")
1621b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1622b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  bool needs_check() const { return needs_check_; }
1623b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1624b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch private:
1625b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  bool needs_check_;
1626b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
1627b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1628b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1629e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass LStoreNamedField: public LTemplateInstruction<0, 2, 1> {
1630b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
1631e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  LStoreNamedField(LOperand* object, LOperand* value, LOperand* temp) {
1632e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    inputs_[0] = object;
1633e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    inputs_[1] = value;
1634e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    temps_[0] = temp;
1635b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1636b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1637e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(StoreNamedField, "store-named-field")
1638e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(StoreNamedField)
1639b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1640b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  virtual void PrintDataTo(StringStream* stream);
1641b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1642b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LOperand* object() { return inputs_[0]; }
1643b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LOperand* value() { return inputs_[1]; }
1644b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1645e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  Handle<Object> name() const { return hydrogen()->name(); }
1646b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  bool is_in_object() { return hydrogen()->is_in_object(); }
1647b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  int offset() { return hydrogen()->offset(); }
1648b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  Handle<Map> transition() const { return hydrogen()->transition(); }
1649b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1650b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1651b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1652e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass LStoreNamedGeneric: public LTemplateInstruction<0, 2, 0> {
1653b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
1654e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  LStoreNamedGeneric(LOperand* object, LOperand* value) {
1655e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    inputs_[0] = object;
1656e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    inputs_[1] = value;
1657e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1658086aeeaae12517475c22695a200be45495516549Ben Murdoch
1659b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(StoreNamedGeneric, "store-named-generic")
1660b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_HYDROGEN_ACCESSOR(StoreNamedGeneric)
1661e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1662e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
1663e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1664e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  LOperand* object() { return inputs_[0]; }
1665e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  LOperand* value() { return inputs_[1]; }
1666e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  Handle<Object> name() const { return hydrogen()->name(); }
16673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  StrictModeFlag strict_mode_flag() { return hydrogen()->strict_mode_flag(); }
1668b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1669b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1670b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1671e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass LStoreKeyedFastElement: public LTemplateInstruction<0, 3, 0> {
1672b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
1673e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  LStoreKeyedFastElement(LOperand* obj, LOperand* key, LOperand* val) {
1674b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[0] = obj;
1675b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[1] = key;
1676b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[2] = val;
1677b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1678b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1679e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(StoreKeyedFastElement,
1680e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch                               "store-keyed-fast-element")
1681e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(StoreKeyedFastElement)
1682b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1683b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  virtual void PrintDataTo(StringStream* stream);
1684b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1685b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LOperand* object() { return inputs_[0]; }
1686b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LOperand* key() { return inputs_[1]; }
1687b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LOperand* value() { return inputs_[2]; }
1688b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
1689b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1690b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
16913fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass LStoreKeyedFastDoubleElement: public LTemplateInstruction<0, 3, 0> {
16923fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch public:
16933fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  LStoreKeyedFastDoubleElement(LOperand* elements,
16943fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch                               LOperand* key,
16953fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch                               LOperand* val) {
16963fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    inputs_[0] = elements;
16973fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    inputs_[1] = key;
16983fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    inputs_[2] = val;
16993fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
17003fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
17013fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(StoreKeyedFastDoubleElement,
17023fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch                               "store-keyed-fast-double-element")
17033fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_HYDROGEN_ACCESSOR(StoreKeyedFastDoubleElement)
17043fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
17053fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  virtual void PrintDataTo(StringStream* stream);
17063fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
17073fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  LOperand* elements() { return inputs_[0]; }
17083fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  LOperand* key() { return inputs_[1]; }
17093fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  LOperand* value() { return inputs_[2]; }
17103fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch};
17113fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
17123fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
171344f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass LStoreKeyedSpecializedArrayElement: public LTemplateInstruction<0, 3, 0> {
1714b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
171544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  LStoreKeyedSpecializedArrayElement(LOperand* external_pointer,
171644f0eee88ff00398ff7f715fab053374d808c90dSteve Block                                     LOperand* key,
171744f0eee88ff00398ff7f715fab053374d808c90dSteve Block                                     LOperand* val) {
1718e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    inputs_[0] = external_pointer;
1719e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    inputs_[1] = key;
1720e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    inputs_[2] = val;
1721e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1722b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
172344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  DECLARE_CONCRETE_INSTRUCTION(StoreKeyedSpecializedArrayElement,
172444f0eee88ff00398ff7f715fab053374d808c90dSteve Block                               "store-keyed-specialized-array-element")
172544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  DECLARE_HYDROGEN_ACCESSOR(StoreKeyedSpecializedArrayElement)
1726e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1727e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  LOperand* external_pointer() { return inputs_[0]; }
1728e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  LOperand* key() { return inputs_[1]; }
1729e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  LOperand* value() { return inputs_[2]; }
1730589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  ElementsKind elements_kind() const {
17313fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return hydrogen()->elements_kind();
173244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
1733b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
1734b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1735b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1736e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass LStoreKeyedGeneric: public LTemplateInstruction<0, 3, 0> {
1737b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
1738e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  LStoreKeyedGeneric(LOperand* object, LOperand* key, LOperand* value) {
1739e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    inputs_[0] = object;
1740e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    inputs_[1] = key;
1741e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    inputs_[2] = value;
1742e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1743b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1744b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(StoreKeyedGeneric, "store-keyed-generic")
17458b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  DECLARE_HYDROGEN_ACCESSOR(StoreKeyedGeneric)
1746e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1747e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
1748e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1749e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  LOperand* object() { return inputs_[0]; }
1750e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  LOperand* key() { return inputs_[1]; }
1751e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  LOperand* value() { return inputs_[2]; }
17523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  StrictModeFlag strict_mode_flag() { return hydrogen()->strict_mode_flag(); }
17533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
17543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
17553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
17563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass LTransitionElementsKind: public LTemplateInstruction<1, 1, 2> {
17573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
17583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LTransitionElementsKind(LOperand* object,
17593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                          LOperand* new_map_temp,
17603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                          LOperand* temp_reg) {
17613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[0] = object;
17623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    temps_[0] = new_map_temp;
17633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    temps_[1] = temp_reg;
17643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
17653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
17663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(TransitionElementsKind,
17673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                               "transition-elements-kind")
17683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(TransitionElementsKind)
17693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
17703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual void PrintDataTo(StringStream* stream);
17713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
17723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* object() { return inputs_[0]; }
17733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* new_map_reg() { return temps_[0]; }
17743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* temp_reg() { return temps_[1]; }
17753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Handle<Map> original_map() { return hydrogen()->original_map(); }
17763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Handle<Map> transitioned_map() { return hydrogen()->transitioned_map(); }
17778b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch};
17788b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
17798b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
1780257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochclass LStringAdd: public LTemplateInstruction<1, 2, 0> {
1781257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public:
1782257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  LStringAdd(LOperand* left, LOperand* right) {
1783257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    inputs_[0] = left;
1784257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    inputs_[1] = right;
1785257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
1786257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1787257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(StringAdd, "string-add")
1788257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_HYDROGEN_ACCESSOR(StringAdd)
1789257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1790257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  LOperand* left() { return inputs_[0]; }
1791257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  LOperand* right() { return inputs_[1]; }
1792257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
1793257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1794257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1795e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass LStringCharCodeAt: public LTemplateInstruction<1, 2, 0> {
1796e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch public:
1797e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  LStringCharCodeAt(LOperand* string, LOperand* index) {
1798e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    inputs_[0] = string;
1799e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    inputs_[1] = index;
1800e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1801e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1802e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(StringCharCodeAt, "string-char-code-at")
1803e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(StringCharCodeAt)
1804e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1805e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  LOperand* string() { return inputs_[0]; }
1806e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  LOperand* index() { return inputs_[1]; }
1807e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch};
1808e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1809e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
181044f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass LStringCharFromCode: public LTemplateInstruction<1, 1, 0> {
181144f0eee88ff00398ff7f715fab053374d808c90dSteve Block public:
181244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  explicit LStringCharFromCode(LOperand* char_code) {
181344f0eee88ff00398ff7f715fab053374d808c90dSteve Block    inputs_[0] = char_code;
181444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
181544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
181644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  DECLARE_CONCRETE_INSTRUCTION(StringCharFromCode, "string-char-from-code")
181744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  DECLARE_HYDROGEN_ACCESSOR(StringCharFromCode)
181844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
181944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  LOperand* char_code() { return inputs_[0]; }
182044f0eee88ff00398ff7f715fab053374d808c90dSteve Block};
182144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
182244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1823e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass LStringLength: public LTemplateInstruction<1, 1, 0> {
1824e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch public:
1825e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  explicit LStringLength(LOperand* string) {
1826e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    inputs_[0] = string;
1827e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1828e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1829e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(StringLength, "string-length")
1830e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(StringLength)
1831e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1832e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  LOperand* string() { return inputs_[0]; }
1833b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
1834b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1835b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
18361e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass LCheckFunction: public LTemplateInstruction<0, 1, 0> {
1837b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
1838b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  explicit LCheckFunction(LOperand* value) {
1839b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[0] = value;
1840b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1841b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
18423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* value() { return InputAt(0); }
18433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1844b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CheckFunction, "check-function")
1845b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_HYDROGEN_ACCESSOR(CheckFunction)
1846b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
1847b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1848b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
18491e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass LCheckInstanceType: public LTemplateInstruction<0, 1, 0> {
1850b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
18511e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  explicit LCheckInstanceType(LOperand* value) {
1852b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[0] = value;
1853b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1854b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1855b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CheckInstanceType, "check-instance-type")
1856b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_HYDROGEN_ACCESSOR(CheckInstanceType)
1857b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
1858b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1859b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
18601e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass LCheckMap: public LTemplateInstruction<0, 1, 0> {
1861b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
1862b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  explicit LCheckMap(LOperand* value) {
1863b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[0] = value;
1864b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1865b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1866b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CheckMap, "check-map")
1867b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_HYDROGEN_ACCESSOR(CheckMap)
1868b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
1869b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1870b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1871b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochclass LCheckPrototypeMaps: public LTemplateInstruction<0, 0, 1> {
1872b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
1873b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  explicit LCheckPrototypeMaps(LOperand* temp)  {
1874b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    temps_[0] = temp;
1875b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
1876b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1877b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CheckPrototypeMaps, "check-prototype-maps")
1878b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_HYDROGEN_ACCESSOR(CheckPrototypeMaps)
1879b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1880b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  Handle<JSObject> prototype() const { return hydrogen()->prototype(); }
1881b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  Handle<JSObject> holder() const { return hydrogen()->holder(); }
1882b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
1883b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1884b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
18851e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass LCheckSmi: public LTemplateInstruction<0, 1, 0> {
1886b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
188744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  explicit LCheckSmi(LOperand* value) {
1888b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[0] = value;
1889b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
1890b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
189144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  DECLARE_CONCRETE_INSTRUCTION(CheckSmi, "check-smi")
189244f0eee88ff00398ff7f715fab053374d808c90dSteve Block};
189344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1894b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1895257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochclass LClampDToUint8: public LTemplateInstruction<1, 1, 1> {
1896257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public:
1897257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  LClampDToUint8(LOperand* value, LOperand* temp) {
1898257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    inputs_[0] = value;
1899257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    temps_[0] = temp;
1900257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
1901257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1902257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  LOperand* unclamped() { return inputs_[0]; }
1903257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1904257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(ClampDToUint8, "clamp-d-to-uint8")
1905257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
1906257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1907257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1908257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochclass LClampIToUint8: public LTemplateInstruction<1, 1, 0> {
1909257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public:
1910257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  explicit LClampIToUint8(LOperand* value) {
1911257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    inputs_[0] = value;
1912257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
1913257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1914257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  LOperand* unclamped() { return inputs_[0]; }
1915257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1916257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(ClampIToUint8, "clamp-i-to-uint8")
1917257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
1918257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1919257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1920257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochclass LClampTToUint8: public LTemplateInstruction<1, 1, 2> {
1921257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public:
1922257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  LClampTToUint8(LOperand* value,
1923257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch                 LOperand* temp,
1924257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch                 LOperand* temp2) {
1925257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    inputs_[0] = value;
1926257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    temps_[0] = temp;
1927257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    temps_[1] = temp2;
1928257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
1929257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1930257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  LOperand* unclamped() { return inputs_[0]; }
1931257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1932257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(ClampTToUint8, "clamp-t-to-uint8")
1933257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
1934257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1935257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
193644f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass LCheckNonSmi: public LTemplateInstruction<0, 1, 0> {
193744f0eee88ff00398ff7f715fab053374d808c90dSteve Block public:
193844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  explicit LCheckNonSmi(LOperand* value) {
193944f0eee88ff00398ff7f715fab053374d808c90dSteve Block    inputs_[0] = value;
1940b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1941086aeeaae12517475c22695a200be45495516549Ben Murdoch
194244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  DECLARE_CONCRETE_INSTRUCTION(CheckNonSmi, "check-non-smi")
1943b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
1944b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1945b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
19463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass LAllocateObject: public LTemplateInstruction<1, 0, 1> {
19473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
19483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  explicit LAllocateObject(LOperand* temp) {
19493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    temps_[0] = temp;
19503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
19513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
19523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(AllocateObject, "allocate-object")
19533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(AllocateObject)
19543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
19553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
19563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
19573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass LFastLiteral: public LTemplateInstruction<1, 0, 0> {
19583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
19593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(FastLiteral, "fast-literal")
19603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(FastLiteral)
19613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
19623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
19633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
19645d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdochclass LArrayLiteral: public LTemplateInstruction<1, 0, 0> {
1965592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch public:
19665d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(ArrayLiteral, "array-literal")
19675d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(ArrayLiteral)
1968592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch};
1969592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
1970592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
19715d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdochclass LObjectLiteral: public LTemplateInstruction<1, 0, 0> {
1972b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
19735d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(ObjectLiteral, "object-literal")
19745d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(ObjectLiteral)
1975b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
1976b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1977b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1978b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochclass LRegExpLiteral: public LTemplateInstruction<1, 0, 0> {
1979b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
1980b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(RegExpLiteral, "regexp-literal")
1981b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_HYDROGEN_ACCESSOR(RegExpLiteral)
1982b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1983b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1984b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1985b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochclass LFunctionLiteral: public LTemplateInstruction<1, 0, 0> {
1986b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
1987b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(FunctionLiteral, "function-literal")
1988b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_HYDROGEN_ACCESSOR(FunctionLiteral)
1989b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1990b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  Handle<SharedFunctionInfo> shared_info() { return hydrogen()->shared_info(); }
1991b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
1992b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1993b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
199444f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass LToFastProperties: public LTemplateInstruction<1, 1, 0> {
199544f0eee88ff00398ff7f715fab053374d808c90dSteve Block public:
199644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  explicit LToFastProperties(LOperand* value) {
199744f0eee88ff00398ff7f715fab053374d808c90dSteve Block    inputs_[0] = value;
199844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
199944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
200044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  DECLARE_CONCRETE_INSTRUCTION(ToFastProperties, "to-fast-properties")
200144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  DECLARE_HYDROGEN_ACCESSOR(ToFastProperties)
200244f0eee88ff00398ff7f715fab053374d808c90dSteve Block};
200344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
200444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
20051e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass LTypeof: public LTemplateInstruction<1, 1, 0> {
2006b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
2007b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  explicit LTypeof(LOperand* value) {
2008b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[0] = value;
2009b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2010b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2011b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Typeof, "typeof")
2012b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
2013086aeeaae12517475c22695a200be45495516549Ben Murdoch
2014b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
20151e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass LTypeofIsAndBranch: public LControlInstruction<1, 0> {
2016b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
2017b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  explicit LTypeofIsAndBranch(LOperand* value) {
2018b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[0] = value;
2019b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
2020b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2021b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(TypeofIsAndBranch, "typeof-is-and-branch")
20223fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_HYDROGEN_ACCESSOR(TypeofIsAndBranch)
2023b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2024b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  Handle<String> type_literal() { return hydrogen()->type_literal(); }
2025b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2026b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  virtual void PrintDataTo(StringStream* stream);
2027b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
2028b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2029b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
20301e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass LIsConstructCallAndBranch: public LControlInstruction<0, 1> {
20311e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public:
20321e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  explicit LIsConstructCallAndBranch(LOperand* temp) {
20331e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    temps_[0] = temp;
20341e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
20351e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
20361e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  DECLARE_CONCRETE_INSTRUCTION(IsConstructCallAndBranch,
20371e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block                               "is-construct-call-and-branch")
20383fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_HYDROGEN_ACCESSOR(IsConstructCallAndBranch)
20391e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block};
20401e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
20411e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
20421e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass LDeleteProperty: public LTemplateInstruction<1, 2, 0> {
2043b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
2044b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LDeleteProperty(LOperand* obj, LOperand* key) {
2045b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[0] = obj;
2046b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inputs_[1] = key;
2047b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
2048b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2049b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(DeleteProperty, "delete-property")
2050b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2051b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LOperand* object() { return inputs_[0]; }
2052b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LOperand* key() { return inputs_[1]; }
2053b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
2054b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2055b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2056b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochclass LOsrEntry: public LTemplateInstruction<0, 0, 0> {
2057b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
2058b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LOsrEntry();
2059b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2060b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(OsrEntry, "osr-entry")
2061b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2062b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LOperand** SpilledRegisterArray() { return register_spills_; }
2063b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LOperand** SpilledDoubleRegisterArray() { return double_register_spills_; }
2064b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2065b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  void MarkSpilledRegister(int allocation_index, LOperand* spill_operand);
2066b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  void MarkSpilledDoubleRegister(int allocation_index,
2067b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch                                 LOperand* spill_operand);
2068086aeeaae12517475c22695a200be45495516549Ben Murdoch
2069086aeeaae12517475c22695a200be45495516549Ben Murdoch private:
2070b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  // Arrays of spill slot operands for registers with an assigned spill
2071b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  // slot, i.e., that must also be restored to the spill slot on OSR entry.
2072b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  // NULL if the register has no assigned spill slot.  Indexed by allocation
2073b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  // index.
2074b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LOperand* register_spills_[Register::kNumAllocatableRegisters];
2075b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LOperand* double_register_spills_[DoubleRegister::kNumAllocatableRegisters];
2076b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
2077086aeeaae12517475c22695a200be45495516549Ben Murdoch
2078086aeeaae12517475c22695a200be45495516549Ben Murdoch
2079b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochclass LStackCheck: public LTemplateInstruction<0, 0, 0> {
2080b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
2081b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(StackCheck, "stack-check")
20823fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_HYDROGEN_ACCESSOR(StackCheck)
20833fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
20843fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  Label* done_label() { return &done_label_; }
20853fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
20863fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch private:
20873fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  Label done_label_;
2088086aeeaae12517475c22695a200be45495516549Ben Murdoch};
2089086aeeaae12517475c22695a200be45495516549Ben Murdoch
2090086aeeaae12517475c22695a200be45495516549Ben Murdoch
20913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass LForInPrepareMap: public LTemplateInstruction<1, 1, 0> {
20923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
20933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  explicit LForInPrepareMap(LOperand* object) {
20943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[0] = object;
20953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
20963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
20973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* object() { return inputs_[0]; }
20983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
20993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(ForInPrepareMap, "for-in-prepare-map")
21003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
21013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass LForInCacheArray: public LTemplateInstruction<1, 1, 0> {
21043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
21053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  explicit LForInCacheArray(LOperand* map) {
21063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[0] = map;
21073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
21083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* map() { return inputs_[0]; }
21103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(ForInCacheArray, "for-in-cache-array")
21123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  int idx() {
21143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return HForInCacheArray::cast(this->hydrogen_value())->idx();
21153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
21163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
21173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass LCheckMapValue: public LTemplateInstruction<0, 2, 0> {
21203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
21213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LCheckMapValue(LOperand* value, LOperand* map) {
21223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[0] = value;
21233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[1] = map;
21243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
21253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* value() { return inputs_[0]; }
21273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* map() { return inputs_[1]; }
21283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(CheckMapValue, "check-map-value")
21303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
21313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass LLoadFieldByIndex: public LTemplateInstruction<1, 2, 0> {
21343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
21353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LLoadFieldByIndex(LOperand* object, LOperand* index) {
21363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[0] = object;
21373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[1] = index;
21383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
21393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* object() { return inputs_[0]; }
21413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* index() { return inputs_[1]; }
21423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(LoadFieldByIndex, "load-field-by-index")
21443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
21453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2147086aeeaae12517475c22695a200be45495516549Ben Murdochclass LChunkBuilder;
2148086aeeaae12517475c22695a200be45495516549Ben Murdochclass LChunk: public ZoneObject {
2149086aeeaae12517475c22695a200be45495516549Ben Murdoch public:
2150e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  explicit LChunk(CompilationInfo* info, HGraph* graph)
2151086aeeaae12517475c22695a200be45495516549Ben Murdoch    : spill_slot_count_(0),
2152e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      info_(info),
2153086aeeaae12517475c22695a200be45495516549Ben Murdoch      graph_(graph),
2154086aeeaae12517475c22695a200be45495516549Ben Murdoch      instructions_(32),
2155086aeeaae12517475c22695a200be45495516549Ben Murdoch      pointer_maps_(8),
2156086aeeaae12517475c22695a200be45495516549Ben Murdoch      inlined_closures_(1) { }
2157086aeeaae12517475c22695a200be45495516549Ben Murdoch
21581e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  void AddInstruction(LInstruction* instruction, HBasicBlock* block);
2159b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LConstantOperand* DefineConstantOperand(HConstant* constant);
2160b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  Handle<Object> LookupLiteral(LConstantOperand* operand) const;
2161b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  Representation LookupLiteralRepresentation(LConstantOperand* operand) const;
2162b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2163b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  int GetNextSpillIndex(bool is_double);
2164b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LOperand* GetNextSpillSlot(bool is_double);
2165b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2166b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  int ParameterAt(int index);
2167b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  int GetParameterStackSlot(int index) const;
2168086aeeaae12517475c22695a200be45495516549Ben Murdoch  int spill_slot_count() const { return spill_slot_count_; }
2169e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  CompilationInfo* info() const { return info_; }
2170086aeeaae12517475c22695a200be45495516549Ben Murdoch  HGraph* graph() const { return graph_; }
2171086aeeaae12517475c22695a200be45495516549Ben Murdoch  const ZoneList<LInstruction*>* instructions() const { return &instructions_; }
2172b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  void AddGapMove(int index, LOperand* from, LOperand* to);
2173b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LGap* GetGapAt(int index) const;
2174b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  bool IsGapAt(int index) const;
2175b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  int NearestGapPos(int index) const;
2176b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  void MarkEmptyBlocks();
2177086aeeaae12517475c22695a200be45495516549Ben Murdoch  const ZoneList<LPointerMap*>* pointer_maps() const { return &pointer_maps_; }
2178b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  LLabel* GetLabel(int block_id) const {
2179b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    HBasicBlock* block = graph_->blocks()->at(block_id);
2180b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    int first_instruction = block->first_instruction_index();
2181b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    return LLabel::cast(instructions_[first_instruction]);
2182b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2183b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  int LookupDestination(int block_id) const {
2184b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    LLabel* cur = GetLabel(block_id);
2185b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    while (cur->replacement() != NULL) {
2186b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      cur = cur->replacement();
2187b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    }
2188b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    return cur->block_id();
2189b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2190b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  Label* GetAssemblyLabel(int block_id) const {
2191b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    LLabel* label = GetLabel(block_id);
2192b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    ASSERT(!label->HasReplacement());
2193b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    return label->label();
2194b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2195b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2196b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  const ZoneList<Handle<JSFunction> >* inlined_closures() const {
2197b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    return &inlined_closures_;
2198b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2199b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2200b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  void AddInlinedClosure(Handle<JSFunction> closure) {
2201b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    inlined_closures_.Add(closure);
2202b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2203b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2204086aeeaae12517475c22695a200be45495516549Ben Murdoch private:
2205086aeeaae12517475c22695a200be45495516549Ben Murdoch  int spill_slot_count_;
2206e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  CompilationInfo* info_;
2207086aeeaae12517475c22695a200be45495516549Ben Murdoch  HGraph* const graph_;
2208086aeeaae12517475c22695a200be45495516549Ben Murdoch  ZoneList<LInstruction*> instructions_;
2209086aeeaae12517475c22695a200be45495516549Ben Murdoch  ZoneList<LPointerMap*> pointer_maps_;
2210086aeeaae12517475c22695a200be45495516549Ben Murdoch  ZoneList<Handle<JSFunction> > inlined_closures_;
2211b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2212b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2213b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2214b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass LChunkBuilder BASE_EMBEDDED {
2215b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
2216e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  LChunkBuilder(CompilationInfo* info, HGraph* graph, LAllocator* allocator)
2217086aeeaae12517475c22695a200be45495516549Ben Murdoch      : chunk_(NULL),
2218e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        info_(info),
2219086aeeaae12517475c22695a200be45495516549Ben Murdoch        graph_(graph),
22203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        zone_(graph->isolate()->zone()),
2221086aeeaae12517475c22695a200be45495516549Ben Murdoch        status_(UNUSED),
2222086aeeaae12517475c22695a200be45495516549Ben Murdoch        current_instruction_(NULL),
2223086aeeaae12517475c22695a200be45495516549Ben Murdoch        current_block_(NULL),
2224086aeeaae12517475c22695a200be45495516549Ben Murdoch        next_block_(NULL),
2225086aeeaae12517475c22695a200be45495516549Ben Murdoch        argument_count_(0),
2226086aeeaae12517475c22695a200be45495516549Ben Murdoch        allocator_(allocator),
2227086aeeaae12517475c22695a200be45495516549Ben Murdoch        position_(RelocInfo::kNoPosition),
22281e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block        instruction_pending_deoptimization_environment_(NULL),
2229086aeeaae12517475c22695a200be45495516549Ben Murdoch        pending_deoptimization_ast_id_(AstNode::kNoNumber) { }
2230b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2231b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Build the sequence for the graph.
2232086aeeaae12517475c22695a200be45495516549Ben Murdoch  LChunk* Build();
2233b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2234b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Declare methods that deal with the individual node types.
2235b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch#define DECLARE_DO(type) LInstruction* Do##type(H##type* node);
2236b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HYDROGEN_CONCRETE_INSTRUCTION_LIST(DECLARE_DO)
2237b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#undef DECLARE_DO
2238b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2239086aeeaae12517475c22695a200be45495516549Ben Murdoch private:
2240086aeeaae12517475c22695a200be45495516549Ben Murdoch  enum Status {
2241086aeeaae12517475c22695a200be45495516549Ben Murdoch    UNUSED,
2242086aeeaae12517475c22695a200be45495516549Ben Murdoch    BUILDING,
2243086aeeaae12517475c22695a200be45495516549Ben Murdoch    DONE,
2244086aeeaae12517475c22695a200be45495516549Ben Murdoch    ABORTED
2245086aeeaae12517475c22695a200be45495516549Ben Murdoch  };
2246086aeeaae12517475c22695a200be45495516549Ben Murdoch
2247086aeeaae12517475c22695a200be45495516549Ben Murdoch  LChunk* chunk() const { return chunk_; }
2248e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  CompilationInfo* info() const { return info_; }
2249086aeeaae12517475c22695a200be45495516549Ben Murdoch  HGraph* graph() const { return graph_; }
22503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Zone* zone() const { return zone_; }
2251086aeeaae12517475c22695a200be45495516549Ben Murdoch
2252086aeeaae12517475c22695a200be45495516549Ben Murdoch  bool is_unused() const { return status_ == UNUSED; }
2253086aeeaae12517475c22695a200be45495516549Ben Murdoch  bool is_building() const { return status_ == BUILDING; }
2254086aeeaae12517475c22695a200be45495516549Ben Murdoch  bool is_done() const { return status_ == DONE; }
2255086aeeaae12517475c22695a200be45495516549Ben Murdoch  bool is_aborted() const { return status_ == ABORTED; }
2256086aeeaae12517475c22695a200be45495516549Ben Murdoch
2257086aeeaae12517475c22695a200be45495516549Ben Murdoch  void Abort(const char* format, ...);
2258086aeeaae12517475c22695a200be45495516549Ben Murdoch
2259b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  // Methods for getting operands for Use / Define / Temp.
2260b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LUnallocated* ToUnallocated(Register reg);
2261b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LUnallocated* ToUnallocated(XMMRegister reg);
2262b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2263b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  // Methods for setting up define-use relationships.
2264b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  MUST_USE_RESULT LOperand* Use(HValue* value, LUnallocated* operand);
2265b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  MUST_USE_RESULT LOperand* UseFixed(HValue* value, Register fixed_register);
2266b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  MUST_USE_RESULT LOperand* UseFixedDouble(HValue* value,
2267b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch                                           XMMRegister fixed_register);
2268b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2269b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  // A value that is guaranteed to be allocated to a register.
2270b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  // Operand created by UseRegister is guaranteed to be live until the end of
2271b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  // instruction. This means that register allocator will not reuse it's
2272b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  // register for any other operand inside instruction.
2273b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  // Operand created by UseRegisterAtStart is guaranteed to be live only at
2274b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  // instruction start. Register allocator is free to assign the same register
2275b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  // to some other operand used inside instruction (i.e. temporary or
2276b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  // output).
2277b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  MUST_USE_RESULT LOperand* UseRegister(HValue* value);
2278b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  MUST_USE_RESULT LOperand* UseRegisterAtStart(HValue* value);
2279b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
22801e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  // An input operand in a register that may be trashed.
2281b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  MUST_USE_RESULT LOperand* UseTempRegister(HValue* value);
2282b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
22831e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  // An input operand in a register or stack slot.
2284b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  MUST_USE_RESULT LOperand* Use(HValue* value);
2285b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  MUST_USE_RESULT LOperand* UseAtStart(HValue* value);
2286b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
22871e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  // An input operand in a register, stack slot or a constant operand.
2288b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  MUST_USE_RESULT LOperand* UseOrConstant(HValue* value);
2289b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  MUST_USE_RESULT LOperand* UseOrConstantAtStart(HValue* value);
2290b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
22911e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  // An input operand in a register or a constant operand.
2292b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  MUST_USE_RESULT LOperand* UseRegisterOrConstant(HValue* value);
2293b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  MUST_USE_RESULT LOperand* UseRegisterOrConstantAtStart(HValue* value);
2294b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
22951e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  // An input operand in register, stack slot or a constant operand.
22961e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  // Will not be moved to a register even if one is freely available.
22971e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  MUST_USE_RESULT LOperand* UseAny(HValue* value);
22981e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
2299b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  // Temporary operand that must be in a register.
2300b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  MUST_USE_RESULT LUnallocated* TempRegister();
2301b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  MUST_USE_RESULT LOperand* FixedTemp(Register reg);
2302b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  MUST_USE_RESULT LOperand* FixedTemp(XMMRegister reg);
2303b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2304b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  // Methods for setting up define-use relationships.
2305b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  // Return the same instruction that they are passed.
2306b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  template<int I, int T>
2307b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      LInstruction* Define(LTemplateInstruction<1, I, T>* instr,
2308b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch                           LUnallocated* result);
2309b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  template<int I, int T>
2310b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      LInstruction* DefineAsRegister(LTemplateInstruction<1, I, T>* instr);
2311b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  template<int I, int T>
2312b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      LInstruction* DefineAsSpilled(LTemplateInstruction<1, I, T>* instr,
2313b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch                                    int index);
2314b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  template<int I, int T>
2315b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      LInstruction* DefineSameAsFirst(LTemplateInstruction<1, I, T>* instr);
2316b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  template<int I, int T>
2317b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      LInstruction* DefineFixed(LTemplateInstruction<1, I, T>* instr,
2318b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch                                Register reg);
2319b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  template<int I, int T>
2320b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      LInstruction* DefineFixedDouble(LTemplateInstruction<1, I, T>* instr,
2321b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch                                      XMMRegister reg);
232269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  // Assigns an environment to an instruction.  An instruction which can
232369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  // deoptimize must have an environment.
2324b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LInstruction* AssignEnvironment(LInstruction* instr);
232569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  // Assigns a pointer map to an instruction.  An instruction which can
232669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  // trigger a GC or a lazy deoptimization must have a pointer map.
2327b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LInstruction* AssignPointerMap(LInstruction* instr);
2328b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2329b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  enum CanDeoptimize { CAN_DEOPTIMIZE_EAGERLY, CANNOT_DEOPTIMIZE_EAGERLY };
2330b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
233169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  // Marks a call for the register allocator.  Assigns a pointer map to
233269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  // support GC and lazy deoptimization.  Assigns an environment to support
233369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  // eager deoptimization if CAN_DEOPTIMIZE_EAGERLY.
2334b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LInstruction* MarkAsCall(
2335b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      LInstruction* instr,
2336b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      HInstruction* hinstr,
2337b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      CanDeoptimize can_deoptimize = CANNOT_DEOPTIMIZE_EAGERLY);
2338b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LInstruction* MarkAsSaveDoubles(LInstruction* instr);
2339b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2340b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LInstruction* SetInstructionPendingDeoptimizationEnvironment(
2341b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      LInstruction* instr, int ast_id);
2342b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  void ClearInstructionPendingDeoptimizationEnvironment();
2343b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
23443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LEnvironment* CreateEnvironment(HEnvironment* hydrogen_env,
23453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                  int* argument_index_accumulator);
2346b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2347b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  void VisitInstruction(HInstruction* current);
2348b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2349086aeeaae12517475c22695a200be45495516549Ben Murdoch  void DoBasicBlock(HBasicBlock* block, HBasicBlock* next_block);
2350b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LInstruction* DoShift(Token::Value op, HBitwiseBinaryOperation* instr);
2351b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LInstruction* DoArithmeticD(Token::Value op,
2352b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch                              HArithmeticBinaryOperation* instr);
2353b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  LInstruction* DoArithmeticT(Token::Value op,
2354b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch                              HArithmeticBinaryOperation* instr);
2355086aeeaae12517475c22695a200be45495516549Ben Murdoch
2356086aeeaae12517475c22695a200be45495516549Ben Murdoch  LChunk* chunk_;
2357e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  CompilationInfo* info_;
2358086aeeaae12517475c22695a200be45495516549Ben Murdoch  HGraph* const graph_;
23593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Zone* zone_;
2360086aeeaae12517475c22695a200be45495516549Ben Murdoch  Status status_;
2361086aeeaae12517475c22695a200be45495516549Ben Murdoch  HInstruction* current_instruction_;
2362086aeeaae12517475c22695a200be45495516549Ben Murdoch  HBasicBlock* current_block_;
2363086aeeaae12517475c22695a200be45495516549Ben Murdoch  HBasicBlock* next_block_;
2364086aeeaae12517475c22695a200be45495516549Ben Murdoch  int argument_count_;
2365086aeeaae12517475c22695a200be45495516549Ben Murdoch  LAllocator* allocator_;
2366086aeeaae12517475c22695a200be45495516549Ben Murdoch  int position_;
23671e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  LInstruction* instruction_pending_deoptimization_environment_;
2368086aeeaae12517475c22695a200be45495516549Ben Murdoch  int pending_deoptimization_ast_id_;
2369086aeeaae12517475c22695a200be45495516549Ben Murdoch
2370b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(LChunkBuilder);
2371b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2372b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2373b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch#undef DECLARE_HYDROGEN_ACCESSOR
2374b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch#undef DECLARE_CONCRETE_INSTRUCTION
2375b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2376b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} }  // namespace v8::int
2377b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2378b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif  // V8_X64_LITHIUM_X64_H_
2379