hydrogen-instructions.h revision 592a9fc1d8ea420377a2e7efd0600e20b058be2b
11e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// Copyright 2011 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_HYDROGEN_INSTRUCTIONS_H_
29b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#define V8_HYDROGEN_INSTRUCTIONS_H_
30b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
31b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#include "v8.h"
3244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
33257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#include "allocation.h"
34b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#include "code-stubs.h"
35257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#include "data-flow.h"
3644f0eee88ff00398ff7f715fab053374d808c90dSteve Block#include "small-pointer-list.h"
37b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#include "string-stream.h"
383fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch#include "v8conversions.h"
393fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch#include "v8utils.h"
40b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#include "zone.h"
41b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
42b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochnamespace v8 {
43b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochnamespace internal {
44b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
45b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// Forward declarations.
46b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HBasicBlock;
47b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HEnvironment;
48b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HInstruction;
49b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HLoopInformation;
50b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HValue;
51b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass LInstruction;
52b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass LChunkBuilder;
53b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
54b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
55257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#define HYDROGEN_ABSTRACT_INSTRUCTION_LIST(V)  \
56b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(BitwiseBinaryOperation)                    \
57b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(ControlInstruction)                        \
58b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(Instruction)                               \
59b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
60b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
61b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#define HYDROGEN_CONCRETE_INSTRUCTION_LIST(V)  \
621e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  V(AbnormalExit)                              \
63b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(AccessArgumentsAt)                         \
64b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(Add)                                       \
65b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(ApplyArguments)                            \
66b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(ArgumentsElements)                         \
67b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(ArgumentsLength)                           \
68b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(ArgumentsObject)                           \
69b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(ArrayLiteral)                              \
70592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  V(Bitwise)                                   \
71b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(BitNot)                                    \
72b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(BlockEntry)                                \
73b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(BoundsCheck)                               \
743fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  V(Branch)                                    \
75b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(CallConstantFunction)                      \
76b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(CallFunction)                              \
77b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(CallGlobal)                                \
78b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(CallKeyed)                                 \
79b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(CallKnownGlobal)                           \
80b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(CallNamed)                                 \
81b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(CallNew)                                   \
82b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(CallRuntime)                               \
83b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(CallStub)                                  \
84b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(Change)                                    \
85b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(CheckFunction)                             \
86b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(CheckInstanceType)                         \
87b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(CheckMap)                                  \
88b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(CheckNonSmi)                               \
89b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(CheckPrototypeMaps)                        \
90b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(CheckSmi)                                  \
91257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(ClampToUint8)                              \
923fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  V(ClassOfTestAndBranch)                      \
933fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  V(CompareIDAndBranch)                        \
943fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  V(CompareGeneric)                            \
953fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  V(CompareObjectEqAndBranch)                  \
961e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  V(CompareMap)                                \
973fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  V(CompareConstantEqAndBranch)                \
98b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(Constant)                                  \
991e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  V(Context)                                   \
100b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(DeleteProperty)                            \
101b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(Deoptimize)                                \
102b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(Div)                                       \
1033fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  V(ElementsKind)                              \
104b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(EnterInlined)                              \
10569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  V(FixedArrayBaseLength)                      \
106257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(ForceRepresentation)                       \
107b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(FunctionLiteral)                           \
108e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  V(GetCachedArrayIndex)                       \
109b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(GlobalObject)                              \
110b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(GlobalReceiver)                            \
111b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(Goto)                                      \
1123fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  V(HasCachedArrayIndexAndBranch)              \
1133fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  V(HasInstanceTypeAndBranch)                  \
114257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(In)                                        \
115b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(InstanceOf)                                \
116086aeeaae12517475c22695a200be45495516549Ben Murdoch  V(InstanceOfKnownGlobal)                     \
117257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(InvokeFunction)                            \
1183fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  V(IsConstructCallAndBranch)                  \
119592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  V(IsNilAndBranch)                            \
1203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  V(IsObjectAndBranch)                         \
121592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  V(IsStringAndBranch)                         \
1223fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  V(IsSmiAndBranch)                            \
1233fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  V(IsUndetectableAndBranch)                   \
124592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  V(StringCompareAndBranch)                    \
1259fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block  V(JSArrayLength)                             \
126b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(LeaveInlined)                              \
127b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(LoadContextSlot)                           \
128b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(LoadElements)                              \
12944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(LoadExternalArrayPointer)                  \
1301e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  V(LoadFunctionPrototype)                     \
1318b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  V(LoadGlobalCell)                            \
1328b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  V(LoadGlobalGeneric)                         \
1333fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  V(LoadKeyedFastDoubleElement)                \
134b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(LoadKeyedFastElement)                      \
135b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(LoadKeyedGeneric)                          \
13644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(LoadKeyedSpecializedArrayElement)          \
137b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(LoadNamedField)                            \
13844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(LoadNamedFieldPolymorphic)                 \
139b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(LoadNamedGeneric)                          \
140b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(Mod)                                       \
141b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(Mul)                                       \
142592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  V(ObjectLiteralFast)                         \
143592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  V(ObjectLiteralGeneric)                      \
144b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(OsrEntry)                                  \
1451e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  V(OuterContext)                              \
146b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(Parameter)                                 \
147b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(Power)                                     \
148b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(PushArgument)                              \
149b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(RegExpLiteral)                             \
150b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(Return)                                    \
151b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(Sar)                                       \
152b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(Shl)                                       \
153b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(Shr)                                       \
154b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(Simulate)                                  \
1553fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  V(SoftDeoptimize)                            \
156b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(StackCheck)                                \
1571e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  V(StoreContextSlot)                          \
1588b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  V(StoreGlobalCell)                           \
1598b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  V(StoreGlobalGeneric)                        \
1603fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  V(StoreKeyedFastDoubleElement)               \
161b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(StoreKeyedFastElement)                     \
162b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(StoreKeyedGeneric)                         \
1633fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  V(StoreKeyedSpecializedArrayElement)         \
164b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(StoreNamedField)                           \
165b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(StoreNamedGeneric)                         \
166257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(StringAdd)                                 \
1671e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  V(StringCharCodeAt)                          \
16844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(StringCharFromCode)                        \
1691e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  V(StringLength)                              \
170b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(Sub)                                       \
1713fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  V(ThisFunction)                              \
172b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(Throw)                                     \
17344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(ToFastProperties)                          \
1743fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  V(ToInt32)                                   \
175592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  V(TransitionElementsKind)                    \
176b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(Typeof)                                    \
1773fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  V(TypeofIsAndBranch)                         \
178b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(UnaryMathOperation)                        \
179b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(UnknownOSRValue)                           \
1803fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  V(UseConst)                                  \
181b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(ValueOf)
182b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
183b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#define GVN_FLAG_LIST(V)                       \
184b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(Calls)                                     \
185b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(InobjectFields)                            \
186b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(BackingStoreFields)                        \
187592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  V(ElementsKind)                              \
188b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(ArrayElements)                             \
18969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  V(DoubleArrayElements)                       \
19044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(SpecializedArrayElements)                  \
191b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(GlobalVars)                                \
192b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(Maps)                                      \
193b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(ArrayLengths)                              \
1941e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  V(ContextSlots)                              \
195b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(OsrEntries)
196b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
197257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#define DECLARE_ABSTRACT_INSTRUCTION(type)          \
198b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual bool Is##type() const { return true; }    \
199b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static H##type* cast(HValue* value) {             \
200b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(value->Is##type());                      \
201b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return reinterpret_cast<H##type*>(value);       \
202257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
203b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
204b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
205257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#define DECLARE_CONCRETE_INSTRUCTION(type)                        \
206b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual LInstruction* CompileToLithium(LChunkBuilder* builder); \
207257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  static H##type* cast(HValue* value) {                           \
208257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    ASSERT(value->Is##type());                                    \
209257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return reinterpret_cast<H##type*>(value);                     \
210257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }                                                               \
211257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  virtual Opcode opcode() const { return HValue::k##type; }
212b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
213b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
214b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass Range: public ZoneObject {
215b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
216e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  Range()
217e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      : lower_(kMinInt),
218e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        upper_(kMaxInt),
219e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        next_(NULL),
220e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        can_be_minus_zero_(false) { }
221b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
222b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Range(int32_t lower, int32_t upper)
223e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      : lower_(lower),
224e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        upper_(upper),
225e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        next_(NULL),
226e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        can_be_minus_zero_(false) { }
227b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
228b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int32_t upper() const { return upper_; }
229b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int32_t lower() const { return lower_; }
230b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Range* next() const { return next_; }
231b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Range* CopyClearLower() const { return new Range(kMinInt, upper_); }
232b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Range* CopyClearUpper() const { return new Range(lower_, kMaxInt); }
23369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  Range* Copy() const {
23469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    Range* result = new Range(lower_, upper_);
23569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    result->set_can_be_minus_zero(CanBeMinusZero());
23669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    return result;
23769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  }
238b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int32_t Mask() const;
239b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void set_can_be_minus_zero(bool b) { can_be_minus_zero_ = b; }
240b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool CanBeMinusZero() const { return CanBeZero() && can_be_minus_zero_; }
241b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool CanBeZero() const { return upper_ >= 0 && lower_ <= 0; }
242b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool CanBeNegative() const { return lower_ < 0; }
243e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  bool Includes(int value) const { return lower_ <= value && upper_ >= value; }
24469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  bool IsMostGeneric() const {
24569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    return lower_ == kMinInt && upper_ == kMaxInt && CanBeMinusZero();
24669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  }
247e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  bool IsInSmiRange() const {
248e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return lower_ >= Smi::kMinValue && upper_ <= Smi::kMaxValue;
249b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
250e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  void KeepOrder();
251592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch#ifdef DEBUG
252e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  void Verify() const;
253592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch#endif
254b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
255b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void StackUpon(Range* other) {
256b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    Intersect(other);
257b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    next_ = other;
258b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
259b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
260e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  void Intersect(Range* other);
261e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  void Union(Range* other);
262b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
263e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  void AddConstant(int32_t value);
264e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  void Sar(int32_t value);
265e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  void Shl(int32_t value);
266b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool AddAndCheckOverflow(Range* other);
267b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool SubAndCheckOverflow(Range* other);
268b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool MulAndCheckOverflow(Range* other);
269b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
270b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
271b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int32_t lower_;
272b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int32_t upper_;
273b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Range* next_;
274b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool can_be_minus_zero_;
275b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
276b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
277b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
278b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass Representation {
279b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
280b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  enum Kind {
281b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kNone,
282b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kTagged,
283b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kDouble,
284b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kInteger32,
2851e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    kExternal,
286b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kNumRepresentations
287b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  };
288b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
289b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Representation() : kind_(kNone) { }
290b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
291b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static Representation None() { return Representation(kNone); }
292b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static Representation Tagged() { return Representation(kTagged); }
293b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static Representation Integer32() { return Representation(kInteger32); }
294b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static Representation Double() { return Representation(kDouble); }
2951e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  static Representation External() { return Representation(kExternal); }
296b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
297e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  bool Equals(const Representation& other) {
298b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return kind_ == other.kind_;
299b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
300b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3018b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  Kind kind() const { return static_cast<Kind>(kind_); }
302b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool IsNone() const { return kind_ == kNone; }
303b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool IsTagged() const { return kind_ == kTagged; }
304b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool IsInteger32() const { return kind_ == kInteger32; }
305b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool IsDouble() const { return kind_ == kDouble; }
3061e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  bool IsExternal() const { return kind_ == kExternal; }
307b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool IsSpecialization() const {
308b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return kind_ == kInteger32 || kind_ == kDouble;
309b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
310b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  const char* Mnemonic() const;
311b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
312b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
313b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  explicit Representation(Kind k) : kind_(k) { }
314b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3158b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  // Make sure kind fits in int8.
3168b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  STATIC_ASSERT(kNumRepresentations <= (1 << kBitsPerByte));
3178b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
3188b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  int8_t kind_;
319b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
320b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
321b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
322b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HType {
323b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
324b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HType() : type_(kUninitialized) { }
325b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
326b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static HType Tagged() { return HType(kTagged); }
327b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static HType TaggedPrimitive() { return HType(kTaggedPrimitive); }
328b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static HType TaggedNumber() { return HType(kTaggedNumber); }
329b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static HType Smi() { return HType(kSmi); }
330b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static HType HeapNumber() { return HType(kHeapNumber); }
331b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static HType String() { return HType(kString); }
332b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static HType Boolean() { return HType(kBoolean); }
333b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static HType NonPrimitive() { return HType(kNonPrimitive); }
334b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static HType JSArray() { return HType(kJSArray); }
335b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static HType JSObject() { return HType(kJSObject); }
336b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static HType Uninitialized() { return HType(kUninitialized); }
337b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
338b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Return the weakest (least precise) common type.
339b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HType Combine(HType other) {
340b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return HType(static_cast<Type>(type_ & other.type_));
341b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
342b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
343b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool Equals(const HType& other) {
344b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return type_ == other.type_;
345b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
346b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
347b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool IsSubtypeOf(const HType& other) {
348b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return Combine(other).Equals(other);
349b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
350b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
351b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool IsTagged() {
352b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(type_ != kUninitialized);
353b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return ((type_ & kTagged) == kTagged);
354b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
355b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
356b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool IsTaggedPrimitive() {
357b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(type_ != kUninitialized);
358b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return ((type_ & kTaggedPrimitive) == kTaggedPrimitive);
359b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
360b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
361b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool IsTaggedNumber() {
362b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(type_ != kUninitialized);
363b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return ((type_ & kTaggedNumber) == kTaggedNumber);
364b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
365b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
366b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool IsSmi() {
367b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(type_ != kUninitialized);
368b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return ((type_ & kSmi) == kSmi);
369b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
370b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
371b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool IsHeapNumber() {
372b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(type_ != kUninitialized);
373b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return ((type_ & kHeapNumber) == kHeapNumber);
374b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
375b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
376b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool IsString() {
377b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(type_ != kUninitialized);
378b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return ((type_ & kString) == kString);
379b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
380b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
381b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool IsBoolean() {
382b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(type_ != kUninitialized);
383b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return ((type_ & kBoolean) == kBoolean);
384b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
385b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
386b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool IsNonPrimitive() {
387b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(type_ != kUninitialized);
388b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return ((type_ & kNonPrimitive) == kNonPrimitive);
389b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
390b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
391b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool IsJSArray() {
392b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(type_ != kUninitialized);
393b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return ((type_ & kJSArray) == kJSArray);
394b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
395b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
396b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool IsJSObject() {
397b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(type_ != kUninitialized);
398b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return ((type_ & kJSObject) == kJSObject);
399b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
400b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
401b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool IsUninitialized() {
402b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return type_ == kUninitialized;
403b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
404b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
405592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  bool IsHeapObject() {
406592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch    ASSERT(type_ != kUninitialized);
407592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch    return IsHeapNumber() || IsString() || IsNonPrimitive();
408592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  }
409592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
410b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static HType TypeFromValue(Handle<Object> value);
411b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
412b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  const char* ToString();
413b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
414b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
415b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  enum Type {
416b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kTagged = 0x1,           // 0000 0000 0000 0001
417b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kTaggedPrimitive = 0x5,  // 0000 0000 0000 0101
418b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kTaggedNumber = 0xd,     // 0000 0000 0000 1101
419b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kSmi = 0x1d,             // 0000 0000 0001 1101
420b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kHeapNumber = 0x2d,      // 0000 0000 0010 1101
421b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kString = 0x45,          // 0000 0000 0100 0101
422b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kBoolean = 0x85,         // 0000 0000 1000 0101
423b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kNonPrimitive = 0x101,   // 0000 0001 0000 0001
424b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kJSObject = 0x301,       // 0000 0011 0000 0001
4253fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    kJSArray = 0x701,        // 0000 0111 0000 0001
426b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kUninitialized = 0x1fff  // 0001 1111 1111 1111
427b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  };
428b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4298b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  // Make sure type fits in int16.
4308b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  STATIC_ASSERT(kUninitialized < (1 << (2 * kBitsPerByte)));
4318b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
432b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  explicit HType(Type t) : type_(t) { }
433b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4348b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  int16_t type_;
435b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
436b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
437b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
438257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochclass HUseListNode: public ZoneObject {
439257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public:
440257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HUseListNode(HValue* value, int index, HUseListNode* tail)
441257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      : tail_(tail), value_(value), index_(index) {
442257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
443257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
444257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HUseListNode* tail() const { return tail_; }
445257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HValue* value() const { return value_; }
446257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  int index() const { return index_; }
447257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
448257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  void set_tail(HUseListNode* list) { tail_ = list; }
449257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
450257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#ifdef DEBUG
451257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  void Zap() {
452257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    tail_ = reinterpret_cast<HUseListNode*>(1);
453257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    value_ = NULL;
454257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    index_ = -1;
455257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
456257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#endif
457257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
458257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch private:
459257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HUseListNode* tail_;
460257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HValue* value_;
461257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  int index_;
462257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
463257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
464257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
465257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// We reuse use list nodes behind the scenes as uses are added and deleted.
466257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// This class is the safe way to iterate uses while deleting them.
467257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochclass HUseIterator BASE_EMBEDDED {
468257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public:
469257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  bool Done() { return current_ == NULL; }
470257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  void Advance();
471257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
472257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HValue* value() {
473257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    ASSERT(!Done());
474257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return value_;
475257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
476257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
477257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  int index() {
478257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    ASSERT(!Done());
479257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return index_;
480257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
481257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
482257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch private:
483257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  explicit HUseIterator(HUseListNode* head);
484257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
485257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HUseListNode* current_;
486257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HUseListNode* next_;
487257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HValue* value_;
488257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  int index_;
489257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
490257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  friend class HValue;
491257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
492257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
493257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
494b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HValue: public ZoneObject {
495b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
496b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static const int kNoNumber = -1;
497b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
498b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // There must be one corresponding kDepends flag for every kChanges flag and
499b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // the order of the kChanges flags must be exactly the same as of the kDepends
500b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // flags.
501b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  enum Flag {
502b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // Declare global value numbering flags.
503b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  #define DECLARE_DO(type) kChanges##type, kDependsOn##type,
504b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    GVN_FLAG_LIST(DECLARE_DO)
505b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  #undef DECLARE_DO
506b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kFlexibleRepresentation,
5073fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    // Participate in Global Value Numbering, i.e. elimination of
5083fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    // unnecessary recomputations. If an instruction sets this flag, it must
5093fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    // implement DataEquals(), which will be used to determine if other
5103fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    // occurrences of the instruction are indeed the same.
511b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kUseGVN,
512b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kCanOverflow,
513b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kBailoutOnMinusZero,
514b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kCanBeDivByZero,
5157d3e7fc4b65010eabe860313ee0c64f50843f6e3Ben Murdoch    kDeoptimizeOnUndefined,
516b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kIsArguments,
517b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kTruncatingToInt32,
518b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kLastFlag = kTruncatingToInt32
519b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  };
520b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
521b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  STATIC_ASSERT(kLastFlag < kBitsPerInt);
522b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
523b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static const int kChangesToDependsFlagsLeftShift = 1;
524b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
525b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static int ConvertChangesToDependsFlags(int flags) {
526b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return flags << kChangesToDependsFlagsLeftShift;
527b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
528b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
529b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static HValue* cast(HValue* value) { return value; }
530b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
531b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  enum Opcode {
532b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // Declare a unique enum value for each hydrogen instruction.
533257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  #define DECLARE_OPCODE(type) k##type,
534257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    HYDROGEN_CONCRETE_INSTRUCTION_LIST(DECLARE_OPCODE)
535257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    kPhi
536257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  #undef DECLARE_OPCODE
537b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  };
538257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  virtual Opcode opcode() const = 0;
539257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
540257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // Declare a non-virtual predicates for each concrete HInstruction or HValue.
541257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  #define DECLARE_PREDICATE(type) \
542257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    bool Is##type() const { return opcode() == k##type; }
543257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    HYDROGEN_CONCRETE_INSTRUCTION_LIST(DECLARE_PREDICATE)
544257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  #undef DECLARE_PREDICATE
545257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    bool IsPhi() const { return opcode() == kPhi; }
546257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
547257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // Declare virtual predicates for abstract HInstruction or HValue
548257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  #define DECLARE_PREDICATE(type) \
549257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    virtual bool Is##type() const { return false; }
550257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    HYDROGEN_ABSTRACT_INSTRUCTION_LIST(DECLARE_PREDICATE)
551257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  #undef DECLARE_PREDICATE
552b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
553b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HValue() : block_(NULL),
554b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch             id_(kNoNumber),
555b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch             type_(HType::Tagged()),
556257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch             use_list_(NULL),
557b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch             range_(NULL),
558b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch             flags_(0) {}
559b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual ~HValue() {}
560b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
561b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HBasicBlock* block() const { return block_; }
562b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void SetBlock(HBasicBlock* block);
563b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
564b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int id() const { return id_; }
565b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void set_id(int id) { id_ = id; }
566b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
567257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HUseIterator uses() const { return HUseIterator(use_list_); }
568b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
56944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual bool EmitAtUses() { return false; }
570b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Representation representation() const { return representation_; }
571b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void ChangeRepresentation(Representation r) {
572b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // Representation was already set and is allowed to be changed.
573b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(!r.IsNone());
574b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(CheckFlag(kFlexibleRepresentation));
575b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    RepresentationChanged(r);
576b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    representation_ = r;
577b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
578257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  void AssumeRepresentation(Representation r);
579257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
580257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  virtual bool IsConvertibleToInteger() const { return true; }
581b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
582b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HType type() const { return type_; }
58369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  void set_type(HType new_type) {
58469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    ASSERT(new_type.IsSubtypeOf(type_));
58569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    type_ = new_type;
586b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
587b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
588b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // An operation needs to override this function iff:
589b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  //   1) it can produce an int32 output.
590b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  //   2) the true value of its output can potentially be minus zero.
591b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // The implementation must set a flag so that it bails out in the case where
592b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // it would otherwise output what should be a minus zero as an int32 zero.
593b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // If the operation also exists in a form that takes int32 and outputs int32
594b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // then the operation should return its input value so that we can propagate
5953fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  // back.  There are three operations that need to propagate back to more than
5963fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  // one input.  They are phi and binary div and mul.  They always return NULL
5973fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  // and expect the caller to take care of things.
598b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited) {
599b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    visited->Add(id());
600b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return NULL;
601b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
602b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
603b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool IsDefinedAfter(HBasicBlock* other) const;
604b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
605b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Operands.
606e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual int OperandCount() = 0;
607e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual HValue* OperandAt(int index) = 0;
608b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void SetOperandAt(int index, HValue* value);
609b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
610257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  void DeleteAndReplaceWith(HValue* other);
611257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  void ReplaceAllUsesWith(HValue* other);
612257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  bool HasNoUses() const { return use_list_ == NULL; }
613257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  bool HasMultipleUses() const {
614257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return use_list_ != NULL && use_list_->tail() != NULL;
615257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
616257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  int UseCount() const;
617b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void ClearOperands();
618b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
619b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int flags() const { return flags_; }
6201e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  void SetFlag(Flag f) { flags_ |= (1 << f); }
6211e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  void ClearFlag(Flag f) { flags_ &= ~(1 << f); }
6221e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  bool CheckFlag(Flag f) const { return (flags_ & (1 << f)) != 0; }
6231e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
6241e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  void SetAllSideEffects() { flags_ |= AllSideEffects(); }
6251e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  void ClearAllSideEffects() { flags_ &= ~AllSideEffects(); }
6261e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  bool HasSideEffects() const { return (flags_ & AllSideEffects()) != 0; }
627592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  bool HasObservableSideEffects() const {
628592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch    return (flags_ & ObservableSideEffects()) != 0;
629592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  }
630b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
631589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  int ChangesFlags() const { return flags_ & ChangesFlagsMask(); }
632592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  int ObservableChangesFlags() const {
633592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch    return flags_ & ChangesFlagsMask() & ObservableSideEffects();
634592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  }
635589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
636b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Range* range() const { return range_; }
637b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool HasRange() const { return range_ != NULL; }
638b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void AddNewRange(Range* r);
639b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void RemoveLastAddedRange();
640b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void ComputeInitialRange();
641b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
642b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Representation helpers.
643592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) = 0;
644e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
645e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual Representation InferredRepresentation() {
646b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return representation();
647b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
648b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
649b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // This gives the instruction an opportunity to replace itself with an
650b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // instruction that does the same in some better way.  To replace an
651b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // instruction with a new one, first add the new instruction to the graph,
652b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // then return it.  Return NULL to have the instruction deleted.
653b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual HValue* Canonicalize() { return this; }
654b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
655e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  bool Equals(HValue* other);
656e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual intptr_t Hashcode();
657b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
658b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Printing support.
659e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintTo(StringStream* stream) = 0;
660b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void PrintNameTo(StringStream* stream);
661257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  void PrintTypeTo(StringStream* stream);
662257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  void PrintRangeTo(StringStream* stream);
663257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  void PrintChangesTo(StringStream* stream);
664b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
665257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  const char* Mnemonic() const;
666b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
667b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Updated the inferred type of this instruction and returns true if
668b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // it has changed.
669b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool UpdateInferredType();
670b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
671e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual HType CalculateInferredType();
672b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
673b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG
6741e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  virtual void Verify() = 0;
675b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif
676b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
677b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
6781e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  // This function must be overridden for instructions with flag kUseGVN, to
6791e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  // compare the non-Operand parts of the instruction.
680e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) {
6811e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    UNREACHABLE();
6821e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return false;
6831e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
684b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual void RepresentationChanged(Representation to) { }
685b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual Range* InferRange();
686b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual void DeleteFromGraph() = 0;
687e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void InternalSetOperandAt(int index, HValue* value) = 0;
688b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void clear_block() {
689b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(block_ != NULL);
690b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    block_ = NULL;
691b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
692b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
693b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void set_representation(Representation r) {
694b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // Representation is set-once.
695b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(representation_.IsNone() && !r.IsNone());
696b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    representation_ = r;
697b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
698b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
699b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
700589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  static int ChangesFlagsMask() {
701589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    int result = 0;
702589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    // Create changes mask.
703589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch#define ADD_FLAG(type) result |= (1 << kChanges##type);
704589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  GVN_FLAG_LIST(ADD_FLAG)
705589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch#undef ADD_FLAG
706589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    return result;
707589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  }
708589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
7091e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  // A flag mask to mark an instruction as having arbitrary side effects.
7101e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  static int AllSideEffects() {
7111e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return ChangesFlagsMask() & ~(1 << kChangesOsrEntries);
7121e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
7131e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
714592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  // A flag mask of all side effects that can make observable changes in
715592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  // an executing program (i.e. are not safe to repeat, move or remove);
716592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  static int ObservableSideEffects() {
717592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch    return ChangesFlagsMask() & ~(1 << kChangesElementsKind);
718592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  }
719592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
720257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // Remove the matching use from the use list if present.  Returns the
721257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // removed list node or NULL.
722257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HUseListNode* RemoveUse(HValue* value, int index);
723257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
724b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void RegisterUse(int index, HValue* new_value);
725b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
726b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HBasicBlock* block_;
727b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
728b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // The id of this instruction in the hydrogen graph, assigned when first
729b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // added to the graph. Reflects creation order.
730b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int id_;
731b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
732b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Representation representation_;
733b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HType type_;
734257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HUseListNode* use_list_;
735b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Range* range_;
736b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int flags_;
737b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
738b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(HValue);
739b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
740b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
741b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
742b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HInstruction: public HValue {
743b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
744b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HInstruction* next() const { return next_; }
745b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HInstruction* previous() const { return previous_; }
746b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
747e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintTo(StringStream* stream);
748e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream) { }
749b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
750b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool IsLinked() const { return block() != NULL; }
751b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void Unlink();
752b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void InsertBefore(HInstruction* next);
753b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void InsertAfter(HInstruction* previous);
754b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
755b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int position() const { return position_; }
756b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool has_position() const { return position_ != RelocInfo::kNoPosition; }
757b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void set_position(int position) { position_ = position; }
758b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
759b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual LInstruction* CompileToLithium(LChunkBuilder* builder) = 0;
760b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
761b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG
7621e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  virtual void Verify();
763b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif
764b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
765e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool IsCall() { return false; }
766e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
767257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_ABSTRACT_INSTRUCTION(Instruction)
768b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
769b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
770b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HInstruction()
771b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      : next_(NULL),
772b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        previous_(NULL),
773b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        position_(RelocInfo::kNoPosition) {
774b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kDependsOnOsrEntries);
775b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
776b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
777b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual void DeleteFromGraph() { Unlink(); }
778b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
779b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
780b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void InitializeAsFirst(HBasicBlock* block) {
781b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(!IsLinked());
782b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetBlock(block);
783b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
784b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
785257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  void PrintMnemonicTo(StringStream* stream);
786257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
787b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HInstruction* next_;
788b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HInstruction* previous_;
789b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int position_;
790b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
791b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  friend class HBasicBlock;
792b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
793b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
794b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
7953fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochtemplate<int V>
7963fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HTemplateInstruction : public HInstruction {
797b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
7983fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  int OperandCount() { return V; }
7993fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* OperandAt(int i) { return inputs_[i]; }
800b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
8013fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch protected:
8023fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  void InternalSetOperandAt(int i, HValue* value) { inputs_[i] = value; }
8031e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
8041e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block private:
8053fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  EmbeddedContainer<HValue*, V> inputs_;
806b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
807b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
808b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
8093fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HControlInstruction: public HInstruction {
810b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
8113fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  virtual HBasicBlock* SuccessorAt(int i) = 0;
8123fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  virtual int SuccessorCount() = 0;
8133fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  virtual void SetSuccessorAt(int i, HBasicBlock* block) = 0;
814e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
8153fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  virtual void PrintDataTo(StringStream* stream);
8163fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
8173fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HBasicBlock* FirstSuccessor() {
8183fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return SuccessorCount() > 0 ? SuccessorAt(0) : NULL;
8193fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
8203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HBasicBlock* SecondSuccessor() {
8213fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return SuccessorCount() > 1 ? SuccessorAt(1) : NULL;
822e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
823e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
8243fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_ABSTRACT_INSTRUCTION(ControlInstruction)
825e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch};
826e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
827e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
8283fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HSuccessorIterator BASE_EMBEDDED {
829e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch public:
8303fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  explicit HSuccessorIterator(HControlInstruction* instr)
8313fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : instr_(instr), current_(0) { }
832e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
8333fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  bool Done() { return current_ >= instr_->SuccessorCount(); }
8343fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HBasicBlock* Current() { return instr_->SuccessorAt(current_); }
8353fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  void Advance() { current_++; }
836e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
837e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch private:
8383fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HControlInstruction* instr_;
8393fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  int current_;
840e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch};
841e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
842e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
8433fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochtemplate<int S, int V>
8443fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HTemplateControlInstruction: public HControlInstruction {
845e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch public:
8463fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  int SuccessorCount() { return S; }
8473fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HBasicBlock* SuccessorAt(int i) { return successors_[i]; }
8483fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  void SetSuccessorAt(int i, HBasicBlock* block) { successors_[i] = block; }
8493fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
850e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  int OperandCount() { return V; }
851e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* OperandAt(int i) { return inputs_[i]; }
852e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
8533fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
854e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch protected:
855e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  void InternalSetOperandAt(int i, HValue* value) { inputs_[i] = value; }
856e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
857e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch private:
8583fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  EmbeddedContainer<HBasicBlock*, S> successors_;
8593fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  EmbeddedContainer<HValue*, V> inputs_;
860e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch};
861e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
862e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
863e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HBlockEntry: public HTemplateInstruction<0> {
864e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch public:
865592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
866e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
867e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
868e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
869257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(BlockEntry)
870e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch};
871e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
872e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
8733fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// We insert soft-deoptimize when we hit code with unknown typefeedback,
8743fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// so that we get a chance of re-optimizing with useful typefeedback.
8753fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// HSoftDeoptimize does not end a basic block as opposed to HDeoptimize.
8763fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HSoftDeoptimize: public HTemplateInstruction<0> {
8773fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch public:
878592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
8793fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return Representation::None();
8803fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
8813fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
8823fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(SoftDeoptimize)
8833fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch};
8843fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
8853fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
88644f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass HDeoptimize: public HControlInstruction {
887e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch public:
8883fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  explicit HDeoptimize(int environment_length) : values_(environment_length) { }
889e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
890592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
891e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
892e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
8931e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
89444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual int OperandCount() { return values_.length(); }
89544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual HValue* OperandAt(int index) { return values_[index]; }
8963fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  virtual void PrintDataTo(StringStream* stream);
8973fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
8983fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  virtual int SuccessorCount() { return 0; }
8993fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  virtual HBasicBlock* SuccessorAt(int i) {
9003fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    UNREACHABLE();
9013fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return NULL;
9023fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
9033fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  virtual void SetSuccessorAt(int i, HBasicBlock* block) {
9043fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    UNREACHABLE();
9053fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
90644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
90744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void AddEnvironmentValue(HValue* value) {
90844f0eee88ff00398ff7f715fab053374d808c90dSteve Block    values_.Add(NULL);
90944f0eee88ff00398ff7f715fab053374d808c90dSteve Block    SetOperandAt(values_.length() - 1, value);
91044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
91144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
912257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Deoptimize)
913257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
914257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  enum UseEnvironment {
915257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    kNoUses,
916257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    kUseAll
917257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  };
91844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
91944f0eee88ff00398ff7f715fab053374d808c90dSteve Block protected:
92044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual void InternalSetOperandAt(int index, HValue* value) {
92144f0eee88ff00398ff7f715fab053374d808c90dSteve Block    values_[index] = value;
92244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
92344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
92444f0eee88ff00398ff7f715fab053374d808c90dSteve Block private:
92544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ZoneList<HValue*> values_;
926b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
927b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
928b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
9293fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HGoto: public HTemplateControlInstruction<1, 0> {
930b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
9313fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  explicit HGoto(HBasicBlock* target) {
932592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch    SetSuccessorAt(0, target);
933592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  }
934b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
935592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
936e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
937e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
938e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
939589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  virtual void PrintDataTo(StringStream* stream);
940589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
941257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Goto)
942b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
943b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
944b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
9453fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HUnaryControlInstruction: public HTemplateControlInstruction<2, 1> {
946b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
9473fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HUnaryControlInstruction(HValue* value,
9483fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch                           HBasicBlock* true_target,
9493fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch                           HBasicBlock* false_target) {
950b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetOperandAt(0, value);
9513fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetSuccessorAt(0, true_target);
9523fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetSuccessorAt(1, false_target);
953b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
954b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
955e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
956b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
957e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* value() { return OperandAt(0); }
958b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
959b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
960b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
9613fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HBranch: public HUnaryControlInstruction {
962b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
96369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  HBranch(HValue* value,
96469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch          HBasicBlock* true_target,
96569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch          HBasicBlock* false_target,
96669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch          ToBooleanStub::Types expected_input_types = ToBooleanStub::no_types())
96769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch      : HUnaryControlInstruction(value, true_target, false_target),
96869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch        expected_input_types_(expected_input_types) {
9691e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    ASSERT(true_target != NULL && false_target != NULL);
970b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
9713fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  explicit HBranch(HValue* value)
9723fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : HUnaryControlInstruction(value, NULL, NULL) { }
9733fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
974b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
975592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
976b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return Representation::None();
977b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
978b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
97969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  ToBooleanStub::Types expected_input_types() const {
98069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    return expected_input_types_;
98169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  }
98269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
9833fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Branch)
98469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
98569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch private:
98669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  ToBooleanStub::Types expected_input_types_;
987b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
988b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
989b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
9901e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HCompareMap: public HUnaryControlInstruction {
991b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
9921e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HCompareMap(HValue* value,
9931e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block              Handle<Map> map,
9941e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block              HBasicBlock* true_target,
9951e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block              HBasicBlock* false_target)
9961e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      : HUnaryControlInstruction(value, true_target, false_target),
9971e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block        map_(map) {
9981e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    ASSERT(true_target != NULL);
9991e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    ASSERT(false_target != NULL);
1000b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(!map.is_null());
1001b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1002b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1003e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
1004b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1005b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<Map> map() const { return map_; }
1006b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1007592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
1008e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::Tagged();
1009e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1010e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1011257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CompareMap)
1012b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1013b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
1014b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<Map> map_;
1015b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1016b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1017b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
10183fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HReturn: public HTemplateControlInstruction<0, 1> {
1019b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
10203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  explicit HReturn(HValue* value) {
10213fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(0, value);
10221e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
1023b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1024592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
1025e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::Tagged();
1026e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1027e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
10283fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  virtual void PrintDataTo(StringStream* stream);
10293fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
10303fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* value() { return OperandAt(0); }
10313fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1032257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Return)
1033b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1034b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1035b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
10363fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HAbnormalExit: public HTemplateControlInstruction<0, 0> {
1037b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
1038592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
1039e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
1040e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1041b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1042257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(AbnormalExit)
1043b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1044b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1045b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1046e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HUnaryOperation: public HTemplateInstruction<1> {
1047b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
1048b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  explicit HUnaryOperation(HValue* value) {
1049b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetOperandAt(0, value);
1050b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1051b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
10523fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  static HUnaryOperation* cast(HValue* value) {
10533fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return reinterpret_cast<HUnaryOperation*>(value);
10543fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
10553fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
10563fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  virtual bool CanTruncateToInt32() const {
10573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return CheckFlag(kTruncatingToInt32);
10583fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
10593fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1060e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* value() { return OperandAt(0); }
1061e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
1062b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1063b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1064b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
10653fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HThrow: public HTemplateInstruction<2> {
10661e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public:
10673fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HThrow(HValue* context, HValue* value) {
10683fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(0, context);
10693fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(1, value);
10701e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetAllSideEffects();
10711e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
10721e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1073592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
10741e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return Representation::Tagged();
10751e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
10761e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
10773fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* context() { return OperandAt(0); }
10783fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* value() { return OperandAt(1); }
10793fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1080257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Throw)
1081257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
1082257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1083257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
10843fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HUseConst: public HUnaryOperation {
10853fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch public:
10863fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  explicit HUseConst(HValue* old_value) : HUnaryOperation(old_value) { }
10873fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1088592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
10893fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return Representation::None();
10903fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
10913fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
10923fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(UseConst)
10933fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch};
10943fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
10953fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1096257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochclass HForceRepresentation: public HTemplateInstruction<1> {
1097257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public:
1098257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HForceRepresentation(HValue* value, Representation required_representation) {
1099257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    SetOperandAt(0, value);
1100257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    set_representation(required_representation);
1101257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
1102257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1103257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HValue* value() { return OperandAt(0); }
1104257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1105257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited);
1106257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1107592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
1108257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return representation();  // Same as the output representation.
1109257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
1110257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1111257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(ForceRepresentation)
11121e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block};
11131e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
11141e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1115b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HChange: public HUnaryOperation {
1116b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
1117b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HChange(HValue* value,
1118e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch          Representation to,
11197d3e7fc4b65010eabe860313ee0c64f50843f6e3Ben Murdoch          bool is_truncating,
11207d3e7fc4b65010eabe860313ee0c64f50843f6e3Ben Murdoch          bool deoptimize_on_undefined)
1121592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch      : HUnaryOperation(value) {
1122592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch    ASSERT(!value->representation().IsNone() && !to.IsNone());
1123592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch    ASSERT(!value->representation().Equals(to));
1124b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(to);
1125592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch    set_type(HType::TaggedNumber());
1126b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kUseGVN);
1127592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch    if (deoptimize_on_undefined) SetFlag(kDeoptimizeOnUndefined);
1128e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    if (is_truncating) SetFlag(kTruncatingToInt32);
1129b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1130b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1131b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited);
1132592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual HType CalculateInferredType();
1133b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1134592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  Representation from() { return value()->representation(); }
1135592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  Representation to() { return representation(); }
1136592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  bool deoptimize_on_undefined() const {
1137592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch    return CheckFlag(kDeoptimizeOnUndefined);
1138592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  }
1139592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
1140592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch    return from();
1141b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1142b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
114369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  virtual Range* InferRange();
114469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
1145e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
1146b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1147257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Change)
1148b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1149b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
1150592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
1151b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1152b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1153b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1154257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochclass HClampToUint8: public HUnaryOperation {
1155257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public:
1156257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  explicit HClampToUint8(HValue* value)
11573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : HUnaryOperation(value) {
11583fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    set_representation(Representation::Integer32());
1159257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    SetFlag(kUseGVN);
1160257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
1161257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1162592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
11633fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return Representation::None();
1164257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
1165257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
11663fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(ClampToUint8)
11673fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
11683fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch protected:
11693fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  virtual bool DataEquals(HValue* other) { return true; }
11703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch};
11713fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
11723fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
11733fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HToInt32: public HUnaryOperation {
11743fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch public:
11753fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  explicit HToInt32(HValue* value)
11763fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : HUnaryOperation(value) {
11773fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    set_representation(Representation::Integer32());
11783fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetFlag(kUseGVN);
11793fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
11803fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1181592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
11823fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return Representation::None();
11833fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
11843fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
11853fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  virtual bool CanTruncateToInt32() const {
11863fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return true;
11873fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
11883fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
11893fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  virtual HValue* Canonicalize() {
11903fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    if (value()->representation().IsInteger32()) {
11913fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      return value();
1192257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    } else {
11933fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      return this;
1194257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    }
1195257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
1196257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
11973fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(ToInt32)
1198257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1199257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch protected:
1200257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  virtual bool DataEquals(HValue* other) { return true; }
1201257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
1202257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1203257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1204b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HSimulate: public HInstruction {
1205b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
12068b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  HSimulate(int ast_id, int pop_count)
1207b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      : ast_id_(ast_id),
1208b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        pop_count_(pop_count),
1209b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        values_(2),
1210b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        assigned_indexes_(2) {}
1211b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual ~HSimulate() {}
1212b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1213e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
1214b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1215b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool HasAstId() const { return ast_id_ != AstNode::kNoNumber; }
1216b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int ast_id() const { return ast_id_; }
1217b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void set_ast_id(int id) {
1218b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(!HasAstId());
1219b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ast_id_ = id;
1220b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1221b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1222b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int pop_count() const { return pop_count_; }
1223b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  const ZoneList<HValue*>* values() const { return &values_; }
1224b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int GetAssignedIndexAt(int index) const {
1225b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(HasAssignedIndexAt(index));
1226b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return assigned_indexes_[index];
1227b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1228b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool HasAssignedIndexAt(int index) const {
1229b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return assigned_indexes_[index] != kNoIndex;
1230b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1231b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void AddAssignedValue(int index, HValue* value) {
1232b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    AddValue(index, value);
1233b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1234b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void AddPushedValue(HValue* value) {
1235b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    AddValue(kNoIndex, value);
1236b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1237e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual int OperandCount() { return values_.length(); }
1238e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual HValue* OperandAt(int index) { return values_[index]; }
1239e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1240592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
1241e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
1242e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1243b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1244257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Simulate)
1245b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1246b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG
12471e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  virtual void Verify();
1248b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif
1249b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1250b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
1251b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual void InternalSetOperandAt(int index, HValue* value) {
1252b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    values_[index] = value;
1253b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1254b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1255b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
1256b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static const int kNoIndex = -1;
1257b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void AddValue(int index, HValue* value) {
1258b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    assigned_indexes_.Add(index);
1259b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // Resize the list of pushed values.
1260b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    values_.Add(NULL);
1261b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // Set the operand through the base method in HValue to make sure that the
1262b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // use lists are correctly updated.
1263b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetOperandAt(values_.length() - 1, value);
1264b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1265b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int ast_id_;
1266b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int pop_count_;
1267b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ZoneList<HValue*> values_;
1268b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ZoneList<int> assigned_indexes_;
1269b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1270b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1271b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
12723fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HStackCheck: public HTemplateInstruction<1> {
1273b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
12743fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  enum Type {
12753fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    kFunctionEntry,
12763fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    kBackwardsBranch
12773fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  };
12783fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
12793fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HStackCheck(HValue* context, Type type) : type_(type) {
12803fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(0, context);
12813fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
12823fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
12833fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* context() { return OperandAt(0); }
1284b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1285592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
12863fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return Representation::Tagged();
1287e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1288e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
12893fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  void Eliminate() {
12903fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    // The stack check eliminator might try to eliminate the same stack
12913fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    // check instruction multiple times.
12923fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    if (IsLinked()) {
12933fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      DeleteFromGraph();
12943fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    }
12953fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
12963fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
12973fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  bool is_function_entry() { return type_ == kFunctionEntry; }
12983fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  bool is_backwards_branch() { return type_ == kBackwardsBranch; }
12993fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1300257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(StackCheck)
13013fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
13023fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch private:
13033fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  Type type_;
1304b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1305b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1306b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1307e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HEnterInlined: public HTemplateInstruction<0> {
1308b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
1309257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HEnterInlined(Handle<JSFunction> closure,
1310257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch                FunctionLiteral* function,
1311257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch                CallKind call_kind)
1312257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      : closure_(closure),
1313257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        function_(function),
1314257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        call_kind_(call_kind) {
1315b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1316b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1317e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
1318b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1319b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<JSFunction> closure() const { return closure_; }
1320b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  FunctionLiteral* function() const { return function_; }
1321257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  CallKind call_kind() const { return call_kind_; }
1322b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1323592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
1324e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
1325e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1326e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1327257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(EnterInlined)
1328b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1329b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
1330b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<JSFunction> closure_;
1331b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  FunctionLiteral* function_;
1332257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  CallKind call_kind_;
1333b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1334b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1335b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1336e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HLeaveInlined: public HTemplateInstruction<0> {
1337b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
1338b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HLeaveInlined() {}
1339b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1340592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
1341e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
1342e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1343e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1344257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(LeaveInlined)
1345b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1346b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1347b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1348b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HPushArgument: public HUnaryOperation {
1349b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
1350e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  explicit HPushArgument(HValue* value) : HUnaryOperation(value) {
1351e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    set_representation(Representation::Tagged());
1352e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1353b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1354592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
1355b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return Representation::Tagged();
1356b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1357b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1358e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* argument() { return OperandAt(0); }
1359b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1360257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(PushArgument)
13611e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block};
1362b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
13631e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
13643fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HThisFunction: public HTemplateInstruction<0> {
13653fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch public:
1366592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  explicit HThisFunction(Handle<JSFunction> closure) : closure_(closure) {
13673fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    set_representation(Representation::Tagged());
13683fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetFlag(kUseGVN);
13693fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
13703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1371592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
13723fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return Representation::None();
13733fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
13743fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1375592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  Handle<JSFunction> closure() const { return closure_; }
1376592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
13773fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(ThisFunction)
13783fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
13793fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch protected:
1380592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual bool DataEquals(HValue* other) {
1381592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch    HThisFunction* b = HThisFunction::cast(other);
1382592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch    return *closure() == *b->closure();
1383592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  }
1384592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
1385592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch private:
1386592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  Handle<JSFunction> closure_;
13873fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch};
13883fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
13893fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1390e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HContext: public HTemplateInstruction<0> {
13911e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public:
13921e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HContext() {
13931e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    set_representation(Representation::Tagged());
13941e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetFlag(kUseGVN);
13951e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
13961e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1397592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
1398e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
1399e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1400e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
14013fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Context)
14021e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
14031e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
1404e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
1405b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1406b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1407b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
14081e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HOuterContext: public HUnaryOperation {
1409b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
14101e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  explicit HOuterContext(HValue* inner) : HUnaryOperation(inner) {
14111e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    set_representation(Representation::Tagged());
14121e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetFlag(kUseGVN);
14131e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
14141e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1415257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(OuterContext);
14161e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1417592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
1418e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::Tagged();
1419e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1420e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
14211e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
1422e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
14231e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block};
14241e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
14251e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
14261e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HGlobalObject: public HUnaryOperation {
14271e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public:
14281e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  explicit HGlobalObject(HValue* context) : HUnaryOperation(context) {
1429b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
1430b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kUseGVN);
1431b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1432b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1433257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(GlobalObject)
14341e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1435592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
1436e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::Tagged();
1437e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1438e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
14391e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
1440e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
1441b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1442b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1443b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
14441e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HGlobalReceiver: public HUnaryOperation {
1445b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
14461e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  explicit HGlobalReceiver(HValue* global_object)
14471e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      : HUnaryOperation(global_object) {
1448b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
1449b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kUseGVN);
1450b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1451b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1452257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(GlobalReceiver)
14531e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1454592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
1455e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::Tagged();
1456e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1457e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
14581e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
1459e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
1460b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1461b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1462b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1463e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochtemplate <int V>
1464e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HCall: public HTemplateInstruction<V> {
1465b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
14661e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  // The argument count includes the receiver.
1467e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  explicit HCall<V>(int argument_count) : argument_count_(argument_count) {
1468e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    this->set_representation(Representation::Tagged());
1469e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    this->SetAllSideEffects();
14701e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
1471b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1472e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual HType CalculateInferredType() { return HType::Tagged(); }
1473b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
14741e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  virtual int argument_count() const { return argument_count_; }
14751e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1476e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool IsCall() { return true; }
14771e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
14781e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block private:
14791e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  int argument_count_;
14801e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block};
14811e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
14821e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1483e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HUnaryCall: public HCall<1> {
14841e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public:
14851e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HUnaryCall(HValue* value, int argument_count)
1486e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      : HCall<1>(argument_count) {
14871e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetOperandAt(0, value);
14881e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
14891e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1490592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
1491e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::Tagged();
1492b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
14931e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1494e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
14951e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1496e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* value() { return OperandAt(0); }
14971e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block};
14981e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
14991e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1500e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HBinaryCall: public HCall<2> {
15011e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public:
15021e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HBinaryCall(HValue* first, HValue* second, int argument_count)
1503e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      : HCall<2>(argument_count) {
15041e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetOperandAt(0, first);
15051e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetOperandAt(1, second);
1506b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1507b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1508e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
1509b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1510592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
1511e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::Tagged();
1512e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
15131e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1514e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* first() { return OperandAt(0); }
1515e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* second() { return OperandAt(1); }
1516257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
1517257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
15181e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1519257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochclass HInvokeFunction: public HBinaryCall {
1520257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public:
1521257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HInvokeFunction(HValue* context, HValue* function, int argument_count)
1522257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      : HBinaryCall(context, function, argument_count) {
1523257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
1524257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1525592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
1526257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return Representation::Tagged();
1527257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
1528257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1529257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HValue* context() { return first(); }
1530257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HValue* function() { return second(); }
1531257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1532257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(InvokeFunction)
1533b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1534b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1535b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1536e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HCallConstantFunction: public HCall<0> {
1537b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
1538b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HCallConstantFunction(Handle<JSFunction> function, int argument_count)
1539e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      : HCall<0>(argument_count), function_(function) { }
1540b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1541b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<JSFunction> function() const { return function_; }
15421e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1543b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool IsApplyFunction() const {
154444f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return function_->code() ==
154544f0eee88ff00398ff7f715fab053374d808c90dSteve Block        Isolate::Current()->builtins()->builtin(Builtins::kFunctionApply);
1546b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1547b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1548e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
1549e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1550592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
1551e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
1552e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1553b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1554257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CallConstantFunction)
1555b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1556b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
1557b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<JSFunction> function_;
1558b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1559b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1560b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
15611e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HCallKeyed: public HBinaryCall {
1562b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
15631e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HCallKeyed(HValue* context, HValue* key, int argument_count)
15641e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      : HBinaryCall(context, key, argument_count) {
1565b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1566b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1567592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
1568b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return Representation::Tagged();
1569b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1570b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1571e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* context() { return first(); }
1572e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* key() { return second(); }
1573b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1574257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CallKeyed)
1575b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1576b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1577b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
15781e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HCallNamed: public HUnaryCall {
1579b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
15801e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HCallNamed(HValue* context, Handle<String> name, int argument_count)
15811e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      : HUnaryCall(context, argument_count), name_(name) {
15821e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
15831e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1584e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
1585b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1586e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* context() { return value(); }
1587b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<String> name() const { return name_; }
1588b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1589257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CallNamed)
1590b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1591592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
1592e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::Tagged();
1593e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1594e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1595b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
1596b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<String> name_;
1597b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1598b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1599b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1600592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdochclass HCallFunction: public HBinaryCall {
1601b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
1602592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  HCallFunction(HValue* context, HValue* function, int argument_count)
1603592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch      : HBinaryCall(context, function, argument_count) {
16041e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
16051e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1606592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  HValue* context() { return first(); }
1607592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  HValue* function() { return second(); }
1608e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1609592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
1610e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::Tagged();
1611e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1612b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1613257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CallFunction)
1614b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1615b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1616b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
16171e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HCallGlobal: public HUnaryCall {
1618b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
16191e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HCallGlobal(HValue* context, Handle<String> name, int argument_count)
16201e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      : HUnaryCall(context, argument_count), name_(name) {
16211e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
1622b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1623e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
1624b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1625e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* context() { return value(); }
1626b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<String> name() const { return name_; }
1627b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1628592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
1629e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::Tagged();
1630e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1631e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1632257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CallGlobal)
1633b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1634b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
1635b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<String> name_;
1636b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1637b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1638b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1639e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HCallKnownGlobal: public HCall<0> {
1640b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
16411e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HCallKnownGlobal(Handle<JSFunction> target, int argument_count)
1642e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      : HCall<0>(argument_count), target_(target) { }
1643b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1644e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
16451e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1646b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<JSFunction> target() const { return target_; }
1647b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1648592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
1649e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
1650e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1651e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1652257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CallKnownGlobal)
1653b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1654b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
1655b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<JSFunction> target_;
1656b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1657b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1658b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
16591e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HCallNew: public HBinaryCall {
1660b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
16611e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HCallNew(HValue* context, HValue* constructor, int argument_count)
16621e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      : HBinaryCall(context, constructor, argument_count) {
16631e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
1664b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1665592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
1666b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return Representation::Tagged();
1667b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1668b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1669e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* context() { return first(); }
1670e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* constructor() { return second(); }
1671b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1672257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CallNew)
1673b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1674b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1675b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
16763fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HCallRuntime: public HCall<1> {
1677b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
16783fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HCallRuntime(HValue* context,
16793fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch               Handle<String> name,
168044f0eee88ff00398ff7f715fab053374d808c90dSteve Block               const Runtime::Function* c_function,
1681b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch               int argument_count)
16823fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : HCall<1>(argument_count), c_function_(c_function), name_(name) {
16833fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(0, context);
16843fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
16853fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1686e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
1687b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
16883fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* context() { return OperandAt(0); }
168944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  const Runtime::Function* function() const { return c_function_; }
1690b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<String> name() const { return name_; }
1691b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1692592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
16933fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return Representation::Tagged();
1694e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1695e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1696257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CallRuntime)
1697b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1698b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
169944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  const Runtime::Function* c_function_;
1700b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<String> name_;
1701b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1702b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1703b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
170469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochclass HJSArrayLength: public HTemplateInstruction<2> {
1705b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
170669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  HJSArrayLength(HValue* value, HValue* typecheck) {
1707b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // The length of an array is stored as a tagged value in the array
1708b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // object. It is guaranteed to be 32 bit integer, but it can be
1709b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // represented as either a smi or heap number.
171069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    SetOperandAt(0, value);
171169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    SetOperandAt(1, typecheck);
1712b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
1713b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kUseGVN);
171444f0eee88ff00398ff7f715fab053374d808c90dSteve Block    SetFlag(kDependsOnArrayLengths);
171544f0eee88ff00398ff7f715fab053374d808c90dSteve Block    SetFlag(kDependsOnMaps);
1716b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1717b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1718592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
1719b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return Representation::Tagged();
1720b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1721b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1722589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  virtual void PrintDataTo(StringStream* stream);
1723589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
172469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  HValue* value() { return OperandAt(0); }
1725589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  HValue* typecheck() { return OperandAt(1); }
172669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
1727257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(JSArrayLength)
17281e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
17291e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
1730e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
17319fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block};
17329fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block
17339fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block
173469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochclass HFixedArrayBaseLength: public HUnaryOperation {
17359fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block public:
173669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  explicit HFixedArrayBaseLength(HValue* value) : HUnaryOperation(value) {
17379fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block    set_representation(Representation::Tagged());
17389fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block    SetFlag(kUseGVN);
173944f0eee88ff00398ff7f715fab053374d808c90dSteve Block    SetFlag(kDependsOnArrayLengths);
17409fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block  }
17419fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block
1742592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
17439fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block    return Representation::Tagged();
17449fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block  }
17459fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block
174669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(FixedArrayBaseLength)
17471e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
17481e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
1749e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
1750b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1751b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1752b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
17533fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HElementsKind: public HUnaryOperation {
17543fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch public:
17553fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  explicit HElementsKind(HValue* value) : HUnaryOperation(value) {
17563fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    set_representation(Representation::Integer32());
17573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetFlag(kUseGVN);
1758592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch    SetFlag(kDependsOnElementsKind);
17593fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
17603fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1761592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
17623fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return Representation::Tagged();
17633fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
17643fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
17653fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(ElementsKind)
17663fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
17673fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch protected:
17683fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  virtual bool DataEquals(HValue* other) { return true; }
17693fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch};
17703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
17713fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1772b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HBitNot: public HUnaryOperation {
1773b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
1774b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  explicit HBitNot(HValue* value) : HUnaryOperation(value) {
1775b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Integer32());
1776b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kUseGVN);
1777b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kTruncatingToInt32);
1778b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1779b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1780592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
1781b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return Representation::Integer32();
1782b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1783e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual HType CalculateInferredType();
1784b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1785257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(BitNot)
17861e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
17871e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
1788e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
1789b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1790b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1791b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
17923fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HUnaryMathOperation: public HTemplateInstruction<2> {
1793b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
17943fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HUnaryMathOperation(HValue* context, HValue* value, BuiltinFunctionId op)
17953fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : op_(op) {
17963fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(0, context);
17973fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(1, value);
1798b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    switch (op) {
1799b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      case kMathFloor:
1800b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      case kMathRound:
1801b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      case kMathCeil:
1802b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        set_representation(Representation::Integer32());
1803b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        break;
1804b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      case kMathAbs:
1805b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        set_representation(Representation::Tagged());
1806b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        SetFlag(kFlexibleRepresentation);
1807b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        break;
1808b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      case kMathSqrt:
1809b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      case kMathPowHalf:
1810b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      case kMathLog:
1811b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      case kMathSin:
1812b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      case kMathCos:
1813b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        set_representation(Representation::Double());
1814b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        break;
1815b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      default:
1816b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        UNREACHABLE();
1817b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
1818b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kUseGVN);
1819b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1820b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
18213fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* context() { return OperandAt(0); }
18223fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* value() { return OperandAt(1); }
18233fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1824e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
1825b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1826e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual HType CalculateInferredType();
1827b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1828b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited);
1829b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1830592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
18313fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    if (index == 0) {
18323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      return Representation::Tagged();
18333fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    } else {
18343fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      switch (op_) {
18353fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        case kMathFloor:
18363fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        case kMathRound:
18373fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        case kMathCeil:
18383fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        case kMathSqrt:
18393fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        case kMathPowHalf:
18403fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        case kMathLog:
18413fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        case kMathSin:
18423fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        case kMathCos:
18433fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch          return Representation::Double();
18443fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        case kMathAbs:
18453fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch          return representation();
18463fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        default:
18473fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch          UNREACHABLE();
18483fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch          return Representation::None();
18493fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      }
1850b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
1851b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1852b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1853b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual HValue* Canonicalize() {
1854b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // If the input is integer32 then we replace the floor instruction
1855b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // with its inputs.  This happens before the representation changes are
1856b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // introduced.
1857b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (op() == kMathFloor) {
1858b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      if (value()->representation().IsInteger32()) return value();
1859b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
1860b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return this;
1861b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1862b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1863b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  BuiltinFunctionId op() const { return op_; }
1864b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  const char* OpName() const;
1865b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1866257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(UnaryMathOperation)
1867b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1868b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
1869e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) {
1870b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    HUnaryMathOperation* b = HUnaryMathOperation::cast(other);
1871b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return op_ == b->op();
1872b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1873b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1874b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
1875b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  BuiltinFunctionId op_;
1876b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1877b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1878b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1879b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HLoadElements: public HUnaryOperation {
1880b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
1881b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  explicit HLoadElements(HValue* value) : HUnaryOperation(value) {
1882b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
1883b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kUseGVN);
1884b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kDependsOnMaps);
1885592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch    SetFlag(kDependsOnElementsKind);
1886b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1887b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1888592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
1889b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return Representation::Tagged();
1890b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1891b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1892257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(LoadElements)
18931e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
18941e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
1895e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
18961e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block};
18971e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
18981e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
189944f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass HLoadExternalArrayPointer: public HUnaryOperation {
19001e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public:
190144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  explicit HLoadExternalArrayPointer(HValue* value)
19021e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      : HUnaryOperation(value) {
19031e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    set_representation(Representation::External());
19041e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    // The result of this instruction is idempotent as long as its inputs don't
190544f0eee88ff00398ff7f715fab053374d808c90dSteve Block    // change.  The external array of a specialized array elements object cannot
19061e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    // change once set, so it's no necessary to introduce any additional
19071e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    // dependencies on top of the inputs.
19081e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetFlag(kUseGVN);
19091e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
19101e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1911592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
19121e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return Representation::Tagged();
19131e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
19141e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1915257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(LoadExternalArrayPointer)
19161e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
19171e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
1918e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
1919b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1920b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1921b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
192269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochclass HCheckMap: public HTemplateInstruction<2> {
1923b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
192469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  HCheckMap(HValue* value, Handle<Map> map, HValue* typecheck = NULL)
192569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch      : map_(map) {
192669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    SetOperandAt(0, value);
192769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    // If callers don't depend on a typecheck, they can pass in NULL. In that
192869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    // case we use a copy of the |value| argument as a dummy value.
192969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    SetOperandAt(1, typecheck != NULL ? typecheck : value);
1930b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
1931b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kUseGVN);
1932b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kDependsOnMaps);
1933b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1934b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1935592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
1936b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return Representation::Tagged();
1937b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1938e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
1939e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual HType CalculateInferredType();
1940b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
194169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  HValue* value() { return OperandAt(0); }
1942b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<Map> map() const { return map_; }
1943b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1944257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CheckMap)
1945b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1946b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
1947e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) {
1948b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    HCheckMap* b = HCheckMap::cast(other);
1949b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return map_.is_identical_to(b->map());
1950b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1951b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1952b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
1953b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<Map> map_;
1954b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1955b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1956b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1957b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HCheckFunction: public HUnaryOperation {
1958b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
1959b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HCheckFunction(HValue* value, Handle<JSFunction> function)
1960b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      : HUnaryOperation(value), target_(function) {
1961b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
1962b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kUseGVN);
1963b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1964b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1965592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
1966b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return Representation::Tagged();
1967b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1968e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
1969e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual HType CalculateInferredType();
1970b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1971b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG
19721e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  virtual void Verify();
1973b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif
1974b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1975b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<JSFunction> target() const { return target_; }
1976b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1977257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CheckFunction)
1978b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1979b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
1980e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) {
1981b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    HCheckFunction* b = HCheckFunction::cast(other);
1982b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return target_.is_identical_to(b->target());
1983b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1984b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1985b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
1986b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<JSFunction> target_;
1987b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1988b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1989b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1990b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HCheckInstanceType: public HUnaryOperation {
1991b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
19923fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  static HCheckInstanceType* NewIsSpecObject(HValue* value) {
19933fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return new HCheckInstanceType(value, IS_SPEC_OBJECT);
1994257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
1995257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  static HCheckInstanceType* NewIsJSArray(HValue* value) {
1996257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return new HCheckInstanceType(value, IS_JS_ARRAY);
1997257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
1998257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  static HCheckInstanceType* NewIsString(HValue* value) {
1999257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return new HCheckInstanceType(value, IS_STRING);
2000257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
2001257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  static HCheckInstanceType* NewIsSymbol(HValue* value) {
2002257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return new HCheckInstanceType(value, IS_SYMBOL);
2003b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2004b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2005592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual void PrintDataTo(StringStream* stream);
2006592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
2007592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
2008b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return Representation::Tagged();
2009b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2010b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
20113fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  virtual HValue* Canonicalize();
2012b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2013257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  bool is_interval_check() const { return check_ <= LAST_INTERVAL_CHECK; }
2014257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  void GetCheckInterval(InstanceType* first, InstanceType* last);
2015257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  void GetCheckMaskAndTag(uint8_t* mask, uint8_t* tag);
2016b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2017257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CheckInstanceType)
2018b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2019b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
2020b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // TODO(ager): It could be nice to allow the ommision of instance
2021b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // type checks if we have already performed an instance type check
2022b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // with a larger range.
2023e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) {
2024b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    HCheckInstanceType* b = HCheckInstanceType::cast(other);
2025257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return check_ == b->check_;
2026b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2027b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2028b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
2029257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  enum Check {
20303fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    IS_SPEC_OBJECT,
2031257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    IS_JS_ARRAY,
2032257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    IS_STRING,
2033257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    IS_SYMBOL,
2034257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    LAST_INTERVAL_CHECK = IS_JS_ARRAY
2035257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  };
2036257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2037592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  const char* GetCheckName();
2038592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
2039257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HCheckInstanceType(HValue* value, Check check)
2040257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      : HUnaryOperation(value), check_(check) {
2041257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    set_representation(Representation::Tagged());
2042257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    SetFlag(kUseGVN);
2043257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
2044257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2045257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  const Check check_;
2046b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2047b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2048b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2049b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HCheckNonSmi: public HUnaryOperation {
2050b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
2051b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  explicit HCheckNonSmi(HValue* value) : HUnaryOperation(value) {
2052b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
2053b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kUseGVN);
2054b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2055b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2056592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
2057b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return Representation::Tagged();
2058b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2059b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2060e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual HType CalculateInferredType();
2061b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2062b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG
20631e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  virtual void Verify();
2064b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif
2065b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2066257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  virtual HValue* Canonicalize() {
2067257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    HType value_type = value()->type();
2068257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    if (!value_type.IsUninitialized() &&
2069257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        (value_type.IsHeapNumber() ||
2070257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch         value_type.IsString() ||
2071257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch         value_type.IsBoolean() ||
2072257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch         value_type.IsNonPrimitive())) {
2073257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      return NULL;
2074257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    }
2075257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return this;
2076257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
2077257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2078257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CheckNonSmi)
20791e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
20801e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
2081e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
2082b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2083b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2084b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2085e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HCheckPrototypeMaps: public HTemplateInstruction<0> {
2086b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
2087b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  HCheckPrototypeMaps(Handle<JSObject> prototype, Handle<JSObject> holder)
2088b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      : prototype_(prototype), holder_(holder) {
2089b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kUseGVN);
2090b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kDependsOnMaps);
2091b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2092b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2093b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG
20941e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  virtual void Verify();
2095b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif
2096b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2097b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  Handle<JSObject> prototype() const { return prototype_; }
2098b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<JSObject> holder() const { return holder_; }
2099b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2100257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CheckPrototypeMaps)
2101b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2102592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
2103e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
2104e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
2105e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
2106e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual intptr_t Hashcode() {
210744f0eee88ff00398ff7f715fab053374d808c90dSteve Block    ASSERT(!HEAP->IsAllocationAllowed());
2108b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    intptr_t hash = reinterpret_cast<intptr_t>(*prototype());
2109b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    hash = 17 * hash + reinterpret_cast<intptr_t>(*holder());
2110b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    return hash;
2111b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
2112b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2113b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
2114e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) {
2115b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    HCheckPrototypeMaps* b = HCheckPrototypeMaps::cast(other);
2116b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    return prototype_.is_identical_to(b->prototype()) &&
2117b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch        holder_.is_identical_to(b->holder());
2118b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2119b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2120b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
2121b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  Handle<JSObject> prototype_;
2122b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<JSObject> holder_;
2123b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2124b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2125b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2126b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HCheckSmi: public HUnaryOperation {
2127b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
2128b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  explicit HCheckSmi(HValue* value) : HUnaryOperation(value) {
2129b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
2130b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kUseGVN);
2131b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2132b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2133592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
2134b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return Representation::Tagged();
2135b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2136e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual HType CalculateInferredType();
2137b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2138b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG
21391e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  virtual void Verify();
2140b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif
2141b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2142257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CheckSmi)
21431e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
21441e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
2145e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
2146b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2147b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2148b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2149b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HPhi: public HValue {
2150b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
2151b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  explicit HPhi(int merged_index)
2152b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      : inputs_(2),
2153b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        merged_index_(merged_index),
215444f0eee88ff00398ff7f715fab053374d808c90dSteve Block        phi_id_(-1),
2155257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        is_live_(false),
2156257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        is_convertible_to_integer_(true) {
2157b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    for (int i = 0; i < Representation::kNumRepresentations; i++) {
2158b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      non_phi_uses_[i] = 0;
2159b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      indirect_uses_[i] = 0;
2160b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
2161b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(merged_index >= 0);
2162b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
2163b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kFlexibleRepresentation);
2164b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2165b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2166e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual Representation InferredRepresentation() {
2167b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    bool double_occurred = false;
2168b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    bool int32_occurred = false;
2169b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    for (int i = 0; i < OperandCount(); ++i) {
2170b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      HValue* value = OperandAt(i);
2171b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      if (value->representation().IsDouble()) double_occurred = true;
2172b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      if (value->representation().IsInteger32()) int32_occurred = true;
2173b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      if (value->representation().IsTagged()) return Representation::Tagged();
2174b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
2175b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2176b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (double_occurred) return Representation::Double();
2177b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (int32_occurred) return Representation::Integer32();
2178b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return Representation::None();
2179b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2180b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2181b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual Range* InferRange();
2182592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
2183b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return representation();
2184b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2185e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual HType CalculateInferredType();
2186e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual int OperandCount() { return inputs_.length(); }
2187e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual HValue* OperandAt(int index) { return inputs_[index]; }
2188e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* GetRedundantReplacement();
2189b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void AddInput(HValue* value);
219044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  bool HasRealUses();
2191b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
21921e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  bool IsReceiver() { return merged_index_ == 0; }
2193b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2194b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int merged_index() const { return merged_index_; }
2195b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2196e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintTo(StringStream* stream);
2197b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2198b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG
21991e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  virtual void Verify();
2200b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif
2201b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2202b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void InitRealUses(int id);
2203b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void AddNonPhiUsesFrom(HPhi* other);
2204b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void AddIndirectUsesTo(int* use_count);
2205b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2206b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int tagged_non_phi_uses() const {
2207b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return non_phi_uses_[Representation::kTagged];
2208b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2209b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int int32_non_phi_uses() const {
2210b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return non_phi_uses_[Representation::kInteger32];
2211b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2212b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int double_non_phi_uses() const {
2213b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return non_phi_uses_[Representation::kDouble];
2214b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2215b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int tagged_indirect_uses() const {
2216b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return indirect_uses_[Representation::kTagged];
2217b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2218b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int int32_indirect_uses() const {
2219b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return indirect_uses_[Representation::kInteger32];
2220b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2221b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int double_indirect_uses() const {
2222b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return indirect_uses_[Representation::kDouble];
2223b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2224b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int phi_id() { return phi_id_; }
222544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  bool is_live() { return is_live_; }
222644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void set_is_live(bool b) { is_live_ = b; }
2227b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2228257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  static HPhi* cast(HValue* value) {
2229257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    ASSERT(value->IsPhi());
2230257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return reinterpret_cast<HPhi*>(value);
2231257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
2232257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  virtual Opcode opcode() const { return HValue::kPhi; }
2233257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2234257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  virtual bool IsConvertibleToInteger() const {
2235257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return is_convertible_to_integer_;
2236257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
2237257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2238257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  void set_is_convertible_to_integer(bool b) {
2239257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    is_convertible_to_integer_ = b;
2240257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
2241257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2242589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  bool AllOperandsConvertibleToInteger() {
2243589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    for (int i = 0; i < OperandCount(); ++i) {
2244589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch      if (!OperandAt(i)->IsConvertibleToInteger()) return false;
2245589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    }
2246589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    return true;
2247589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  }
2248589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
2249b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
2250b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual void DeleteFromGraph();
2251b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual void InternalSetOperandAt(int index, HValue* value) {
2252b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    inputs_[index] = value;
2253b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2254b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2255b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
2256b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ZoneList<HValue*> inputs_;
2257b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int merged_index_;
2258b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2259b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int non_phi_uses_[Representation::kNumRepresentations];
2260b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int indirect_uses_[Representation::kNumRepresentations];
2261b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int phi_id_;
226244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  bool is_live_;
2263257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  bool is_convertible_to_integer_;
2264b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2265b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2266b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2267e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HArgumentsObject: public HTemplateInstruction<0> {
2268b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
2269b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HArgumentsObject() {
2270b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
2271b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kIsArguments);
2272b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2273b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2274592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
2275e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
2276e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
2277e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
2278257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(ArgumentsObject)
2279b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2280b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2281b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2282e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HConstant: public HTemplateInstruction<0> {
2283b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
2284b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HConstant(Handle<Object> handle, Representation r);
2285b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2286b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<Object> handle() const { return handle_; }
2287b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
228844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  bool InOldSpace() const { return !HEAP->InNewSpace(*handle_); }
22899fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block
2290592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  bool ImmortalImmovable() const {
2291592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch    Heap* heap = HEAP;
2292592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch    if (*handle_ == heap->undefined_value()) return true;
2293592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch    if (*handle_ == heap->null_value()) return true;
2294592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch    if (*handle_ == heap->true_value()) return true;
2295592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch    if (*handle_ == heap->false_value()) return true;
2296592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch    if (*handle_ == heap->the_hole_value()) return true;
2297592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch    if (*handle_ == heap->minus_zero_value()) return true;
2298592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch    if (*handle_ == heap->nan_value()) return true;
2299592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch    if (*handle_ == heap->empty_string()) return true;
2300592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch    return false;
2301592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  }
2302592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
2303592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
2304e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
2305e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
2306e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
2307257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  virtual bool IsConvertibleToInteger() const {
2308257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    if (handle_->IsSmi()) return true;
2309257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    if (handle_->IsHeapNumber() &&
2310257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        (HeapNumber::cast(*handle_)->value() ==
2311257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch         static_cast<double>(NumberToInt32(*handle_)))) return true;
2312257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return false;
2313257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
2314257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
231544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual bool EmitAtUses() { return !representation().IsDouble(); }
2316592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual HValue* Canonicalize();
2317e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
2318e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual HType CalculateInferredType();
2319b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool IsInteger() const { return handle_->IsSmi(); }
2320b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HConstant* CopyToRepresentation(Representation r) const;
2321b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HConstant* CopyToTruncatedInt32() const;
2322b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool HasInteger32Value() const { return has_int32_value_; }
2323b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int32_t Integer32Value() const {
2324b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(HasInteger32Value());
2325b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return int32_value_;
2326b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2327b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool HasDoubleValue() const { return has_double_value_; }
2328b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  double DoubleValue() const {
2329b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(HasDoubleValue());
2330b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return double_value_;
2331b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2332592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  bool HasNumberValue() const { return has_int32_value_ || has_double_value_; }
2333592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  int32_t NumberValueAsInteger32() const {
2334592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch    ASSERT(HasNumberValue());
2335592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch    if (has_int32_value_) return int32_value_;
2336592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch    return DoubleToInt32(double_value_);
2337592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  }
2338b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool HasStringValue() const { return handle_->IsString(); }
2339b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
23408b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  bool ToBoolean() const;
23418b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
2342e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual intptr_t Hashcode() {
234344f0eee88ff00398ff7f715fab053374d808c90dSteve Block    ASSERT(!HEAP->allow_allocation(false));
2344b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return reinterpret_cast<intptr_t>(*handle());
2345b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2346b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2347b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG
23481e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  virtual void Verify() { }
2349b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif
2350b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2351257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Constant)
2352b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2353b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
2354b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual Range* InferRange();
2355b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2356e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) {
2357b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    HConstant* other_constant = HConstant::cast(other);
2358b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return handle().is_identical_to(other_constant->handle());
2359b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2360b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2361b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
2362b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<Object> handle_;
2363b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2364b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // The following two values represent the int32 and the double value of the
2365b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // given constant if there is a lossless conversion between the constant
2366b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // and the specific representation.
2367257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  bool has_int32_value_ : 1;
2368257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  bool has_double_value_ : 1;
2369b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int32_t int32_value_;
2370b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  double double_value_;
2371b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2372b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2373b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
23743fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HBinaryOperation: public HTemplateInstruction<3> {
2375b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
23763fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HBinaryOperation(HValue* context, HValue* left, HValue* right) {
2377b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(left != NULL && right != NULL);
23783fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(0, context);
23793fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(1, left);
23803fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(2, right);
2381b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2382b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
23833fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* context() { return OperandAt(0); }
23843fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* left() { return OperandAt(1); }
23853fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* right() { return OperandAt(2); }
2386b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2387b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // TODO(kasperl): Move these helpers to the IA-32 Lithium
2388b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // instruction sequence builder.
2389e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* LeastConstantOperand() {
2390b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (IsCommutative() && left()->IsConstant()) return right();
2391b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return left();
2392b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2393e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* MostConstantOperand() {
2394b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (IsCommutative() && left()->IsConstant()) return left();
2395b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return right();
2396b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2397b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2398b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual bool IsCommutative() const { return false; }
2399b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2400e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
2401b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2402b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2403b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2404e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HApplyArguments: public HTemplateInstruction<4> {
2405b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
2406b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HApplyArguments(HValue* function,
2407b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch                  HValue* receiver,
2408b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch                  HValue* length,
2409b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch                  HValue* elements) {
2410b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
2411b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetOperandAt(0, function);
2412b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetOperandAt(1, receiver);
2413b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetOperandAt(2, length);
2414b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetOperandAt(3, elements);
24151e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetAllSideEffects();
2416b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2417b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2418592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
2419b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // The length is untagged, all other inputs are tagged.
2420b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return (index == 2)
2421b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        ? Representation::Integer32()
2422b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        : Representation::Tagged();
2423b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2424b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2425e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* function() { return OperandAt(0); }
2426e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* receiver() { return OperandAt(1); }
2427e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* length() { return OperandAt(2); }
2428e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* elements() { return OperandAt(3); }
2429b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2430257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(ApplyArguments)
2431b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2432b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2433b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2434e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HArgumentsElements: public HTemplateInstruction<0> {
2435b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
2436b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HArgumentsElements() {
2437b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // The value produced by this instruction is a pointer into the stack
2438b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // that looks as if it was a smi because of alignment.
2439b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
2440b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kUseGVN);
2441b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2442b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2443257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(ArgumentsElements)
24441e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
2445592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
2446e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
2447e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
2448e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
24491e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
2450e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
2451b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2452b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2453b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2454b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HArgumentsLength: public HUnaryOperation {
2455b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
2456b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  explicit HArgumentsLength(HValue* value) : HUnaryOperation(value) {
2457b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Integer32());
2458b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kUseGVN);
2459b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2460b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2461592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
2462e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::Tagged();
2463e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
2464e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
2465257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(ArgumentsLength)
24661e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
24671e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
2468e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
2469b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2470b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2471b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2472e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HAccessArgumentsAt: public HTemplateInstruction<3> {
2473b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
2474b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HAccessArgumentsAt(HValue* arguments, HValue* length, HValue* index) {
2475b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
2476b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kUseGVN);
2477b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetOperandAt(0, arguments);
2478b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetOperandAt(1, length);
2479b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetOperandAt(2, index);
2480b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2481b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2482e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
2483b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2484592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
2485b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // The arguments elements is considered tagged.
2486b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return index == 0
2487b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        ? Representation::Tagged()
2488b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        : Representation::Integer32();
2489b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2490b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2491e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* arguments() { return OperandAt(0); }
2492e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* length() { return OperandAt(1); }
2493e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* index() { return OperandAt(2); }
2494b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2495257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(AccessArgumentsAt)
2496b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2497e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
2498b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2499b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2500b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
25013fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HBoundsCheck: public HTemplateInstruction<2> {
2502b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
25033fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HBoundsCheck(HValue* index, HValue* length) {
25043fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(0, index);
25053fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(1, length);
25067d3e7fc4b65010eabe860313ee0c64f50843f6e3Ben Murdoch    set_representation(Representation::Integer32());
2507b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kUseGVN);
2508b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2509b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2510592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
2511b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return Representation::Integer32();
2512b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2513b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
251469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  virtual void PrintDataTo(StringStream* stream);
2515b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
25163fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* index() { return OperandAt(0); }
25173fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* length() { return OperandAt(1); }
2518b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2519257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(BoundsCheck)
25201e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
25211e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
2522e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
2523b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2524b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2525b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2526b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HBitwiseBinaryOperation: public HBinaryOperation {
2527b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
25283fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HBitwiseBinaryOperation(HValue* context, HValue* left, HValue* right)
25293fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : HBinaryOperation(context, left, right) {
25301e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    set_representation(Representation::Tagged());
25311e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetFlag(kFlexibleRepresentation);
25321e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetAllSideEffects();
2533b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2534b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2535592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
25363fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return index == 0
25373fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        ? Representation::Tagged()
25383fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        : representation();
2539b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2540b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
25411e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  virtual void RepresentationChanged(Representation to) {
25421e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    if (!to.IsTagged()) {
25431e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      ASSERT(to.IsInteger32());
25441e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      ClearAllSideEffects();
25451e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      SetFlag(kTruncatingToInt32);
25461e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      SetFlag(kUseGVN);
25471e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    }
25481e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
25491e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
2550e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual HType CalculateInferredType();
25511e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
2552257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_ABSTRACT_INSTRUCTION(BitwiseBinaryOperation)
2553b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2554b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2555b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2556b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HArithmeticBinaryOperation: public HBinaryOperation {
2557b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
25583fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HArithmeticBinaryOperation(HValue* context, HValue* left, HValue* right)
25593fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : HBinaryOperation(context, left, right) {
2560b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
2561b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kFlexibleRepresentation);
25621e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetAllSideEffects();
2563b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2564b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2565b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual void RepresentationChanged(Representation to) {
2566b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (!to.IsTagged()) {
25671e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      ClearAllSideEffects();
2568b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      SetFlag(kUseGVN);
2569b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
2570b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2571b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2572e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual HType CalculateInferredType();
2573592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
25743fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return index == 0
25753fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        ? Representation::Tagged()
25763fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        : representation();
2577b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
25783fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
2579e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual Representation InferredRepresentation() {
2580b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (left()->representation().Equals(right()->representation())) {
2581b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      return left()->representation();
2582b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
2583b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return HValue::InferredRepresentation();
2584b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2585b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2586b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2587b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
25883fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HCompareGeneric: public HBinaryOperation {
2589b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
25903fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HCompareGeneric(HValue* context,
25913fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch                  HValue* left,
25923fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch                  HValue* right,
25933fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch                  Token::Value token)
25943fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : HBinaryOperation(context, left, right), token_(token) {
2595b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(Token::IsCompareOp(token));
2596b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
25971e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetAllSideEffects();
2598b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2599b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2600592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
26013fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return Representation::Tagged();
2602b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
26033fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
2604b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Representation GetInputRepresentation() const {
26053fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return Representation::Tagged();
2606b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
26073fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
2608b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Token::Value token() const { return token_; }
2609e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
2610b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2611e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual HType CalculateInferredType();
2612b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
26133fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CompareGeneric)
2614b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2615b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
2616b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Token::Value token_;
2617b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2618b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2619b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
26203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HCompareIDAndBranch: public HTemplateControlInstruction<2, 2> {
2621b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
26223fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HCompareIDAndBranch(HValue* left, HValue* right, Token::Value token)
26233fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : token_(token) {
26243fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    ASSERT(Token::IsCompareOp(token));
26253fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(0, left);
26263fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(1, right);
2627b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2628b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
26293fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* left() { return OperandAt(0); }
26303fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* right() { return OperandAt(1); }
26313fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  Token::Value token() const { return token_; }
26323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
26333fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  void SetInputRepresentation(Representation r);
26343fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  Representation GetInputRepresentation() const {
26353fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return input_representation_;
26361e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
26371e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
2638592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
26393fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return input_representation_;
2640b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
26413fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  virtual void PrintDataTo(StringStream* stream);
2642b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
26433fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CompareIDAndBranch)
26441e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
26453fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch private:
26463fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  Representation input_representation_;
26473fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  Token::Value token_;
2648b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2649b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2650b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
26513fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HCompareObjectEqAndBranch: public HTemplateControlInstruction<2, 2> {
2652257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public:
26533fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HCompareObjectEqAndBranch(HValue* left, HValue* right) {
26543fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(0, left);
26553fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(1, right);
2656257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
2657257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
26583fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* left() { return OperandAt(0); }
26593fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* right() { return OperandAt(1); }
2660257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2661592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual void PrintDataTo(StringStream* stream);
2662592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
2663592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
2664257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return Representation::Tagged();
2665257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
2666257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
26673fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CompareObjectEqAndBranch)
2668257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
2669257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2670257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
26713fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HCompareConstantEqAndBranch: public HUnaryControlInstruction {
2672b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
26733fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HCompareConstantEqAndBranch(HValue* left, int right, Token::Value op)
26743fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : HUnaryControlInstruction(left, NULL, NULL), op_(op), right_(right) {
26753fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    ASSERT(op == Token::EQ_STRICT);
2676b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
26771e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
26783fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  Token::Value op() const { return op_; }
26793fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* left() { return value(); }
26803fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  int right() const { return right_; }
26811e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
2682592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
26833fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return Representation::Integer32();
2684b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
26853fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
26863fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CompareConstantEqAndBranch);
26873fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
26883fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch private:
26893fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  const Token::Value op_;
26903fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  const int right_;
2691b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2692b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2693b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2694592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdochclass HIsNilAndBranch: public HUnaryControlInstruction {
2695b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
2696592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  HIsNilAndBranch(HValue* value, EqualityKind kind, NilValue nil)
2697592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch      : HUnaryControlInstruction(value, NULL, NULL), kind_(kind), nil_(nil) { }
2698592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
2699592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  EqualityKind kind() const { return kind_; }
2700592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  NilValue nil() const { return nil_; }
2701b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2702592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual void PrintDataTo(StringStream* stream);
2703b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2704592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
27053fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return Representation::Tagged();
2706b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2707b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2708592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(IsNilAndBranch)
27093fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
2710b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
2711592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  EqualityKind kind_;
2712592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  NilValue nil_;
2713b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2714b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2715b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
27163fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HIsObjectAndBranch: public HUnaryControlInstruction {
2717b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
27183fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  explicit HIsObjectAndBranch(HValue* value)
27193fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    : HUnaryControlInstruction(value, NULL, NULL) { }
2720b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2721592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
27223fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return Representation::Tagged();
27233fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
27241e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
27253fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(IsObjectAndBranch)
2726b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2727b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2728592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdochclass HIsStringAndBranch: public HUnaryControlInstruction {
2729592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch public:
2730592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  explicit HIsStringAndBranch(HValue* value)
2731592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch    : HUnaryControlInstruction(value, NULL, NULL) { }
2732592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
2733592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
2734592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch    return Representation::Tagged();
2735592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  }
2736592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
2737592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(IsStringAndBranch)
2738592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch};
2739592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
2740b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
27413fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HIsSmiAndBranch: public HUnaryControlInstruction {
2742b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
27433fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  explicit HIsSmiAndBranch(HValue* value)
27443fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : HUnaryControlInstruction(value, NULL, NULL) { }
27453fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
27463fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(IsSmiAndBranch)
2747b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2748592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
27493fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return Representation::Tagged();
27503fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
2751257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2752257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch protected:
2753257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  virtual bool DataEquals(HValue* other) { return true; }
2754257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
2755257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2756257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
27573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HIsUndetectableAndBranch: public HUnaryControlInstruction {
2758257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public:
27593fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  explicit HIsUndetectableAndBranch(HValue* value)
27603fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : HUnaryControlInstruction(value, NULL, NULL) { }
2761257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2762592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
27633fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return Representation::Tagged();
27643fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
27651e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
27663fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(IsUndetectableAndBranch)
27671e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block};
27681e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
27691e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
2770592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdochclass HStringCompareAndBranch: public HTemplateControlInstruction<2, 3> {
2771592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch public:
2772592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  HStringCompareAndBranch(HValue* context,
2773592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch                           HValue* left,
2774592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch                           HValue* right,
2775592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch                           Token::Value token)
2776592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch      : token_(token) {
2777592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch    ASSERT(Token::IsCompareOp(token));
2778592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch    SetOperandAt(0, context);
2779592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch    SetOperandAt(1, left);
2780592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch    SetOperandAt(2, right);
2781592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch    set_representation(Representation::Tagged());
2782592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  }
2783592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
2784592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  HValue* context() { return OperandAt(0); }
2785592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  HValue* left() { return OperandAt(1); }
2786592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  HValue* right() { return OperandAt(2); }
2787592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  Token::Value token() const { return token_; }
2788592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
2789592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual void PrintDataTo(StringStream* stream);
2790592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
2791592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
2792592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch    return Representation::Tagged();
2793592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  }
2794592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
2795592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  Representation GetInputRepresentation() const {
2796592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch    return Representation::Tagged();
2797592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  }
2798592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
2799592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(StringCompareAndBranch)
2800592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
2801592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch private:
2802592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  Token::Value token_;
2803592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch};
2804592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
2805592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
28063fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HIsConstructCallAndBranch: public HTemplateControlInstruction<2, 0> {
28071e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public:
2808592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
2809e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
2810e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
2811e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
28123fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(IsConstructCallAndBranch)
2813b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2814b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2815b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
28163fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HHasInstanceTypeAndBranch: public HUnaryControlInstruction {
2817b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
28183fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HHasInstanceTypeAndBranch(HValue* value, InstanceType type)
28193fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : HUnaryControlInstruction(value, NULL, NULL), from_(type), to_(type) { }
28203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HHasInstanceTypeAndBranch(HValue* value, InstanceType from, InstanceType to)
28213fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : HUnaryControlInstruction(value, NULL, NULL), from_(from), to_(to) {
2822b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(to == LAST_TYPE);  // Others not implemented yet in backend.
2823b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2824b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2825b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  InstanceType from() { return from_; }
2826b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  InstanceType to() { return to_; }
2827b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2828e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
2829b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2830592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
28313fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return Representation::Tagged();
2832b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2833b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
28343fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(HasInstanceTypeAndBranch)
28353fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
2836b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
2837b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  InstanceType from_;
2838b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  InstanceType to_;  // Inclusive range, not all combinations work.
2839b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2840b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2841b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
28423fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HHasCachedArrayIndexAndBranch: public HUnaryControlInstruction {
2843b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
28443fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  explicit HHasCachedArrayIndexAndBranch(HValue* value)
28453fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : HUnaryControlInstruction(value, NULL, NULL) { }
2846b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2847592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
28483fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return Representation::Tagged();
28493fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
28501e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
28513fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(HasCachedArrayIndexAndBranch)
2852e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch};
2853e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
2854e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
28553fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HGetCachedArrayIndex: public HUnaryOperation {
2856e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch public:
28573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  explicit HGetCachedArrayIndex(HValue* value) : HUnaryOperation(value) {
28583fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    set_representation(Representation::Tagged());
28593fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetFlag(kUseGVN);
28603fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
28613fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
2862592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
28633fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return Representation::Tagged();
28643fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
2865e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
2866257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(GetCachedArrayIndex)
2867e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
2868e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch protected:
2869e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
2870b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2871b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2872b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
28733fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HClassOfTestAndBranch: public HUnaryControlInstruction {
2874b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
28753fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HClassOfTestAndBranch(HValue* value, Handle<String> class_name)
28763fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : HUnaryControlInstruction(value, NULL, NULL),
28773fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        class_name_(class_name) { }
2878b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
28793fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(ClassOfTestAndBranch)
28803fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
2881592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
28823fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return Representation::Tagged();
28833fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
2884b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2885e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
2886b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2887b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<String> class_name() const { return class_name_; }
2888b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2889b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
2890b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<String> class_name_;
2891b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2892b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2893b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
28943fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HTypeofIsAndBranch: public HUnaryControlInstruction {
2895b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
28963fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HTypeofIsAndBranch(HValue* value, Handle<String> type_literal)
28973fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : HUnaryControlInstruction(value, NULL, NULL),
28983fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        type_literal_(type_literal) { }
2899b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2900b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<String> type_literal() { return type_literal_; }
2901e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
2902b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
29033fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(TypeofIsAndBranch)
2904b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2905592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
29063fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return Representation::Tagged();
2907b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2908b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2909b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
2910b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<String> type_literal_;
2911b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2912b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2913b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
29143fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HInstanceOf: public HBinaryOperation {
2915b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
29163fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HInstanceOf(HValue* context, HValue* left, HValue* right)
29173fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : HBinaryOperation(context, left, right) {
2918b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
29191e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetAllSideEffects();
2920b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2921b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2922592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
2923b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return Representation::Tagged();
2924b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2925b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
29263fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  virtual HType CalculateInferredType();
29273fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
2928e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
29291e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
2930257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(InstanceOf)
2931b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2932b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2933b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
29343fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HInstanceOfKnownGlobal: public HTemplateInstruction<2> {
2935086aeeaae12517475c22695a200be45495516549Ben Murdoch public:
29363fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HInstanceOfKnownGlobal(HValue* context,
29373fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch                         HValue* left,
29383fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch                         Handle<JSFunction> right)
29393fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : function_(right) {
29403fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(0, context);
29413fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(1, left);
2942086aeeaae12517475c22695a200be45495516549Ben Murdoch    set_representation(Representation::Tagged());
29431e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetAllSideEffects();
2944086aeeaae12517475c22695a200be45495516549Ben Murdoch  }
2945086aeeaae12517475c22695a200be45495516549Ben Murdoch
29463fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* context() { return OperandAt(0); }
29473fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* left() { return OperandAt(1); }
2948086aeeaae12517475c22695a200be45495516549Ben Murdoch  Handle<JSFunction> function() { return function_; }
2949086aeeaae12517475c22695a200be45495516549Ben Murdoch
2950592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
2951086aeeaae12517475c22695a200be45495516549Ben Murdoch    return Representation::Tagged();
2952086aeeaae12517475c22695a200be45495516549Ben Murdoch  }
2953086aeeaae12517475c22695a200be45495516549Ben Murdoch
29543fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  virtual HType CalculateInferredType();
29553fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
2956257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(InstanceOfKnownGlobal)
2957086aeeaae12517475c22695a200be45495516549Ben Murdoch
2958086aeeaae12517475c22695a200be45495516549Ben Murdoch private:
2959086aeeaae12517475c22695a200be45495516549Ben Murdoch  Handle<JSFunction> function_;
2960086aeeaae12517475c22695a200be45495516549Ben Murdoch};
2961086aeeaae12517475c22695a200be45495516549Ben Murdoch
2962086aeeaae12517475c22695a200be45495516549Ben Murdoch
29633fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HPower: public HTemplateInstruction<2> {
2964b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
29653fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HPower(HValue* left, HValue* right) {
29663fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(0, left);
29673fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(1, right);
2968b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Double());
2969b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kUseGVN);
2970b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2971b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
29723fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* left() { return OperandAt(0); }
29733fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* right() { return OperandAt(1); }
29743fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
2975592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
29763fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return index == 0
29773fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      ? Representation::Double()
29783fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : Representation::None();
2979b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2980b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2981257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Power)
29821e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
29831e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
2984e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
2985b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2986b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2987b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2988b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HAdd: public HArithmeticBinaryOperation {
2989b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
29903fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HAdd(HValue* context, HValue* left, HValue* right)
29913fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : HArithmeticBinaryOperation(context, left, right) {
2992b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kCanOverflow);
2993b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2994b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2995b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Add is only commutative if two integer values are added and not if two
2996b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // tagged values are added (because it might be a String concatenation).
2997b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual bool IsCommutative() const {
2998b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return !representation().IsTagged();
2999b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3000b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3001b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited);
3002b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3003592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  static HInstruction* NewHAdd(Zone* zone,
3004592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch                               HValue* context,
3005592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch                               HValue* left,
3006592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch                               HValue* right);
3007592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
3008e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual HType CalculateInferredType();
3009b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3010257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Add)
3011b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3012b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
3013e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
30141e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
3015b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual Range* InferRange();
3016b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3017b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3018b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3019b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HSub: public HArithmeticBinaryOperation {
3020b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
30213fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HSub(HValue* context, HValue* left, HValue* right)
30223fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : HArithmeticBinaryOperation(context, left, right) {
3023b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kCanOverflow);
3024b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3025b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3026b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited);
3027b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3028592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  static HInstruction* NewHSub(Zone* zone,
3029592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch                              HValue* context,
3030592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch                              HValue* left,
3031592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch                              HValue* right);
3032592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
3033257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Sub)
3034b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3035b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
3036e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
30371e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
3038b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual Range* InferRange();
3039b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3040b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3041b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3042b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HMul: public HArithmeticBinaryOperation {
3043b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
30443fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HMul(HValue* context, HValue* left, HValue* right)
30453fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : HArithmeticBinaryOperation(context, left, right) {
3046b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kCanOverflow);
3047b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3048b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3049b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited);
3050b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3051b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Only commutative if it is certain that not two objects are multiplicated.
3052b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual bool IsCommutative() const {
3053b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return !representation().IsTagged();
3054b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3055b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3056592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  static HInstruction* NewHMul(Zone* zone,
3057592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch                               HValue* context,
3058592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch                               HValue* left,
3059592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch                               HValue* right);
3060592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
3061257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Mul)
3062b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3063b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
3064e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
30651e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
3066b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual Range* InferRange();
3067b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3068b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3069b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3070b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HMod: public HArithmeticBinaryOperation {
3071b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
30723fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HMod(HValue* context, HValue* left, HValue* right)
30733fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : HArithmeticBinaryOperation(context, left, right) {
3074b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kCanBeDivByZero);
3075b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3076b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
307744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  bool HasPowerOf2Divisor() {
307844f0eee88ff00398ff7f715fab053374d808c90dSteve Block    if (right()->IsConstant() &&
307944f0eee88ff00398ff7f715fab053374d808c90dSteve Block        HConstant::cast(right())->HasInteger32Value()) {
308044f0eee88ff00398ff7f715fab053374d808c90dSteve Block      int32_t value = HConstant::cast(right())->Integer32Value();
308144f0eee88ff00398ff7f715fab053374d808c90dSteve Block      return value != 0 && (IsPowerOf2(value) || IsPowerOf2(-value));
308244f0eee88ff00398ff7f715fab053374d808c90dSteve Block    }
308344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
308444f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return false;
308544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
308644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
3087b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited);
3088b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3089592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  static HInstruction* NewHMod(Zone* zone,
3090592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch                               HValue* context,
3091592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch                               HValue* left,
3092592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch                               HValue* right);
3093592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
3094257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Mod)
3095b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3096b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
3097e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
30981e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
3099b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual Range* InferRange();
3100b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3101b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3102b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3103b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HDiv: public HArithmeticBinaryOperation {
3104b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
31053fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HDiv(HValue* context, HValue* left, HValue* right)
31063fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : HArithmeticBinaryOperation(context, left, right) {
3107b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kCanBeDivByZero);
3108b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kCanOverflow);
3109b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3110b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3111b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited);
3112b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3113b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3114592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  static HInstruction* NewHDiv(Zone* zone,
3115592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch                               HValue* context,
3116592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch                               HValue* left,
3117592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch                               HValue* right);
3118b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3119592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(Div)
3120b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3121b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
3122e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
31231e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
3124b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual Range* InferRange();
3125b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3126b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3127b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3128592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdochclass HBitwise: public HBitwiseBinaryOperation {
3129b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
3130592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  HBitwise(Token::Value op, HValue* context, HValue* left, HValue* right)
3131592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch      : HBitwiseBinaryOperation(context, left, right), op_(op) {
3132592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch        ASSERT(op == Token::BIT_AND ||
3133592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch               op == Token::BIT_OR ||
3134592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch               op == Token::BIT_XOR);
3135592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch      }
3136b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3137592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  Token::Value op() const { return op_; }
3138b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3139b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual bool IsCommutative() const { return true; }
3140b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3141592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  static HInstruction* NewHBitwise(Zone* zone,
3142592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch                                   Token::Value op,
3143592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch                                   HValue* context,
3144592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch                                   HValue* left,
3145592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch                                   HValue* right);
3146592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
3147592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(Bitwise)
3148b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3149b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
3150592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual bool DataEquals(HValue* other) {
3151592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch    return op() == HBitwise::cast(other)->op();
3152592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  }
31531e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
3154b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual Range* InferRange();
3155592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
3156592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch private:
3157592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  Token::Value op_;
3158b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3159b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3160b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3161b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HShl: public HBitwiseBinaryOperation {
3162b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
31633fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HShl(HValue* context, HValue* left, HValue* right)
31643fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : HBitwiseBinaryOperation(context, left, right) { }
3165b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3166b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual Range* InferRange();
3167592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
3168592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  static HInstruction* NewHShl(Zone* zone,
3169592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch                               HValue* context,
3170592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch                               HValue* left,
3171592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch                               HValue* right);
3172b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3173257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Shl)
31741e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
31751e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
3176e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
3177b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3178b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3179b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3180b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HShr: public HBitwiseBinaryOperation {
3181b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
31823fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HShr(HValue* context, HValue* left, HValue* right)
31833fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : HBitwiseBinaryOperation(context, left, right) { }
3184b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
318569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  virtual Range* InferRange();
3186592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
3187592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  static HInstruction* NewHShr(Zone* zone,
3188592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch                               HValue* context,
3189592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch                               HValue* left,
3190592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch                               HValue* right);
3191b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3192257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Shr)
31931e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
31941e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
3195e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
3196b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3197b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3198b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3199b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HSar: public HBitwiseBinaryOperation {
3200b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
32013fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HSar(HValue* context, HValue* left, HValue* right)
32023fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : HBitwiseBinaryOperation(context, left, right) { }
3203b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3204b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual Range* InferRange();
3205592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
3206592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  static HInstruction* NewHSar(Zone* zone,
3207592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch                               HValue* context,
3208592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch                               HValue* left,
3209592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch                               HValue* right);
3210b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3211257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Sar)
32121e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
32131e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
3214e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
3215b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3216b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3217b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3218e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HOsrEntry: public HTemplateInstruction<0> {
3219b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
3220b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  explicit HOsrEntry(int ast_id) : ast_id_(ast_id) {
3221b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kChangesOsrEntries);
3222b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3223b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3224b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int ast_id() const { return ast_id_; }
3225b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3226592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
3227e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
3228e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
3229e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
3230257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(OsrEntry)
3231b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3232b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
3233b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int ast_id_;
3234b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3235b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3236b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3237e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HParameter: public HTemplateInstruction<0> {
3238b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
3239b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  explicit HParameter(unsigned index) : index_(index) {
3240b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
3241b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3242b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3243b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  unsigned index() const { return index_; }
3244b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3245e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
3246e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
3247592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
3248e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
3249e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
3250b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3251257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Parameter)
3252b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3253b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
3254b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  unsigned index_;
3255b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3256b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3257b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
32581e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HCallStub: public HUnaryCall {
3259b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
32601e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HCallStub(HValue* context, CodeStub::Major major_key, int argument_count)
32611e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      : HUnaryCall(context, argument_count),
32621e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block        major_key_(major_key),
3263b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        transcendental_type_(TranscendentalCache::kNumberOfCaches) {
3264b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3265b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3266b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  CodeStub::Major major_key() { return major_key_; }
32671e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
3268e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* context() { return value(); }
3269b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3270b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void set_transcendental_type(TranscendentalCache::Type transcendental_type) {
3271b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    transcendental_type_ = transcendental_type;
3272b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3273b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  TranscendentalCache::Type transcendental_type() {
3274b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return transcendental_type_;
3275b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
32761e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
3277e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
3278e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
3279592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
3280e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::Tagged();
3281e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
3282b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3283257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CallStub)
3284b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3285b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
3286b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  CodeStub::Major major_key_;
3287b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  TranscendentalCache::Type transcendental_type_;
3288b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3289b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3290b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3291e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HUnknownOSRValue: public HTemplateInstruction<0> {
3292b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
3293b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HUnknownOSRValue() { set_representation(Representation::Tagged()); }
3294b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3295592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
3296e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
3297e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
3298e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
3299257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(UnknownOSRValue)
3300b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3301b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3302b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
33038b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochclass HLoadGlobalCell: public HTemplateInstruction<0> {
3304b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
3305592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  HLoadGlobalCell(Handle<JSGlobalPropertyCell> cell, PropertyDetails details)
3306592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch      : cell_(cell), details_(details) {
3307b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
3308b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kUseGVN);
3309b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kDependsOnGlobalVars);
3310b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3311b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3312b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<JSGlobalPropertyCell>  cell() const { return cell_; }
3313592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  bool RequiresHoleCheck();
3314b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3315e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
3316b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3317e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual intptr_t Hashcode() {
331844f0eee88ff00398ff7f715fab053374d808c90dSteve Block    ASSERT(!HEAP->allow_allocation(false));
3319b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return reinterpret_cast<intptr_t>(*cell_);
3320b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3321b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3322592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
3323e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
3324e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
3325e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
3326257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(LoadGlobalCell)
3327b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3328b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
3329e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) {
33308b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    HLoadGlobalCell* b = HLoadGlobalCell::cast(other);
3331b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return cell_.is_identical_to(b->cell());
3332b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3333b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3334b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
3335b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<JSGlobalPropertyCell> cell_;
3336592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  PropertyDetails details_;
3337b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3338b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3339b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
33403fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HLoadGlobalGeneric: public HTemplateInstruction<2> {
3341b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
33428b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  HLoadGlobalGeneric(HValue* context,
33438b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch                     HValue* global_object,
33448b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch                     Handle<Object> name,
33458b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch                     bool for_typeof)
33463fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : name_(name),
33478b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch        for_typeof_(for_typeof) {
33483fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(0, context);
33493fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(1, global_object);
33508b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    set_representation(Representation::Tagged());
33518b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    SetAllSideEffects();
33528b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  }
33538b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
33548b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  HValue* context() { return OperandAt(0); }
33558b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  HValue* global_object() { return OperandAt(1); }
33568b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  Handle<Object> name() const { return name_; }
33578b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  bool for_typeof() const { return for_typeof_; }
33588b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
33598b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  virtual void PrintDataTo(StringStream* stream);
33608b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
3361592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
33628b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    return Representation::Tagged();
33638b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  }
33648b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
3365257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(LoadGlobalGeneric)
33668b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
33678b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch private:
33688b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  Handle<Object> name_;
33698b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  bool for_typeof_;
33708b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch};
33718b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
33728b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
3373592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdochinline bool StoringValueNeedsWriteBarrier(HValue* value) {
3374592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  return !value->type().IsBoolean()
3375592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch      && !value->type().IsSmi()
3376592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch      && !(value->IsConstant() && HConstant::cast(value)->ImmortalImmovable());
3377592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch}
3378592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
3379592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
33808b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochclass HStoreGlobalCell: public HUnaryOperation {
33818b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch public:
33828b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  HStoreGlobalCell(HValue* value,
33838b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch                   Handle<JSGlobalPropertyCell> cell,
3384592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch                   PropertyDetails details)
33851e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      : HUnaryOperation(value),
33861e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block        cell_(cell),
3387592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch        details_(details) {
3388b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kChangesGlobalVars);
3389b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3390b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3391b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<JSGlobalPropertyCell> cell() const { return cell_; }
3392592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  bool RequiresHoleCheck() {
3393592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch    return !details_.IsDontDelete() || details_.IsReadOnly();
3394592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  }
3395592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  bool NeedsWriteBarrier() {
3396592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch    return StoringValueNeedsWriteBarrier(value());
3397592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  }
3398b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3399592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
3400b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return Representation::Tagged();
3401b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3402e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
3403b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3404257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(StoreGlobalCell)
3405b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3406b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
3407b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<JSGlobalPropertyCell> cell_;
3408592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  PropertyDetails details_;
3409b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3410b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3411b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
34128b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochclass HStoreGlobalGeneric: public HTemplateInstruction<3> {
34138b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch public:
34148b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  HStoreGlobalGeneric(HValue* context,
34158b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch                      HValue* global_object,
34168b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch                      Handle<Object> name,
34178b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch                      HValue* value,
3418592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch                      StrictModeFlag strict_mode_flag)
34198b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch      : name_(name),
3420592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch        strict_mode_flag_(strict_mode_flag) {
34218b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    SetOperandAt(0, context);
34228b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    SetOperandAt(1, global_object);
34238b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    SetOperandAt(2, value);
34248b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    set_representation(Representation::Tagged());
34258b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    SetAllSideEffects();
34268b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  }
34278b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
34288b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  HValue* context() { return OperandAt(0); }
34298b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  HValue* global_object() { return OperandAt(1); }
34308b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  Handle<Object> name() const { return name_; }
34318b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  HValue* value() { return OperandAt(2); }
3432592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  StrictModeFlag strict_mode_flag() { return strict_mode_flag_; }
34338b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
34348b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  virtual void PrintDataTo(StringStream* stream);
34358b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
3436592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
34378b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    return Representation::Tagged();
34388b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  }
34398b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
3440257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(StoreGlobalGeneric)
34418b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
34428b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch private:
34438b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  Handle<Object> name_;
3444592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  StrictModeFlag strict_mode_flag_;
34458b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch};
34468b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
34478b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
34481e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HLoadContextSlot: public HUnaryOperation {
3449b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
34501e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HLoadContextSlot(HValue* context , int slot_index)
34511e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      : HUnaryOperation(context), slot_index_(slot_index) {
3452b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    set_representation(Representation::Tagged());
3453b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    SetFlag(kUseGVN);
34541e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetFlag(kDependsOnContextSlots);
3455b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
3456b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
3457b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  int slot_index() const { return slot_index_; }
3458b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
3459592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
34601e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return Representation::Tagged();
3461b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
3462b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
3463e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
34641e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
3465257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(LoadContextSlot)
3466b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
3467b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch protected:
3468e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) {
3469b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    HLoadContextSlot* b = HLoadContextSlot::cast(other);
34701e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return (slot_index() == b->slot_index());
3471b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
3472b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
3473b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch private:
34741e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  int slot_index_;
34751e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block};
34761e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
34771e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
34783fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HStoreContextSlot: public HTemplateInstruction<2> {
34791e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public:
34801e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HStoreContextSlot(HValue* context, int slot_index, HValue* value)
34813fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : slot_index_(slot_index) {
34823fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(0, context);
34833fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(1, value);
34841e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetFlag(kChangesContextSlots);
34851e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
34861e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
3487e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* context() { return OperandAt(0); }
3488e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* value() { return OperandAt(1); }
34891e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  int slot_index() const { return slot_index_; }
34901e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
3491e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  bool NeedsWriteBarrier() {
34921e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return StoringValueNeedsWriteBarrier(value());
34931e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
34941e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
3495592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
34961e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return Representation::Tagged();
34971e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
34981e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
3499e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
35001e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
3501257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(StoreContextSlot)
35021e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
35031e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block private:
3504b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  int slot_index_;
3505b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
3506b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
3507b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
3508b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HLoadNamedField: public HUnaryOperation {
3509b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
3510b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HLoadNamedField(HValue* object, bool is_in_object, int offset)
3511b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      : HUnaryOperation(object),
3512b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        is_in_object_(is_in_object),
3513b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        offset_(offset) {
3514b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
3515b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kUseGVN);
351644f0eee88ff00398ff7f715fab053374d808c90dSteve Block    SetFlag(kDependsOnMaps);
3517b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (is_in_object) {
3518b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      SetFlag(kDependsOnInobjectFields);
3519b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    } else {
3520b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      SetFlag(kDependsOnBackingStoreFields);
3521b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
3522b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3523b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3524e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* object() { return OperandAt(0); }
3525b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool is_in_object() const { return is_in_object_; }
3526b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int offset() const { return offset_; }
3527b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3528592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
3529b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return Representation::Tagged();
3530b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3531e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
3532b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3533257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(LoadNamedField)
3534b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3535b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
3536e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) {
3537b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    HLoadNamedField* b = HLoadNamedField::cast(other);
3538b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return is_in_object_ == b->is_in_object_ && offset_ == b->offset_;
3539b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3540b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3541b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
3542b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool is_in_object_;
3543b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int offset_;
3544b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3545b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3546b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
35473fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HLoadNamedFieldPolymorphic: public HTemplateInstruction<2> {
354844f0eee88ff00398ff7f715fab053374d808c90dSteve Block public:
35493fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HLoadNamedFieldPolymorphic(HValue* context,
35503fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch                             HValue* object,
355169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch                             SmallMapList* types,
355244f0eee88ff00398ff7f715fab053374d808c90dSteve Block                             Handle<String> name);
355344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
35543fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* context() { return OperandAt(0); }
35553fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* object() { return OperandAt(1); }
355669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  SmallMapList* types() { return &types_; }
355744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Handle<String> name() { return name_; }
355844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  bool need_generic() { return need_generic_; }
355944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
3560592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
356144f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return Representation::Tagged();
356244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
356344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
356469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  virtual void PrintDataTo(StringStream* stream);
356569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
3566257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(LoadNamedFieldPolymorphic)
356744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
356844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static const int kMaxLoadPolymorphism = 4;
356944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
357044f0eee88ff00398ff7f715fab053374d808c90dSteve Block protected:
357144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual bool DataEquals(HValue* value);
357244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
357344f0eee88ff00398ff7f715fab053374d808c90dSteve Block private:
357469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  SmallMapList types_;
357544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Handle<String> name_;
357644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  bool need_generic_;
357744f0eee88ff00398ff7f715fab053374d808c90dSteve Block};
357844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
357944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
358044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
35813fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HLoadNamedGeneric: public HTemplateInstruction<2> {
3582b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
35831e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HLoadNamedGeneric(HValue* context, HValue* object, Handle<Object> name)
35843fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : name_(name) {
35853fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(0, context);
35863fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(1, object);
3587b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
35881e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetAllSideEffects();
3589b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3590b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3591e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* context() { return OperandAt(0); }
3592e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* object() { return OperandAt(1); }
3593b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<Object> name() const { return name_; }
3594b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3595592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
3596b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return Representation::Tagged();
3597b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3598b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
359969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  virtual void PrintDataTo(StringStream* stream);
360069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
3601257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(LoadNamedGeneric)
3602b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3603b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
3604b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<Object> name_;
3605b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3606b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3607b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
36089fac840a46e8b7e26894f4792ba26dde14c56b04Steve Blockclass HLoadFunctionPrototype: public HUnaryOperation {
36099fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block public:
36109fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block  explicit HLoadFunctionPrototype(HValue* function)
36119fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block      : HUnaryOperation(function) {
36129fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block    set_representation(Representation::Tagged());
36131e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetFlag(kUseGVN);
36141e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetFlag(kDependsOnCalls);
36159fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block  }
36169fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block
3617e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* function() { return OperandAt(0); }
36189fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block
3619592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
36209fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block    return Representation::Tagged();
36219fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block  }
36229fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block
3623257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(LoadFunctionPrototype)
36249fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block
36259fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block protected:
3626e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
36279fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block};
36289fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block
36299fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block
36303fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HLoadKeyedFastElement: public HTemplateInstruction<2> {
3631b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
36323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HLoadKeyedFastElement(HValue* obj, HValue* key) {
36333fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(0, obj);
36343fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(1, key);
3635b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
3636b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kDependsOnArrayElements);
3637b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kUseGVN);
3638b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3639b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3640e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* object() { return OperandAt(0); }
3641e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* key() { return OperandAt(1); }
3642e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
3643592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
3644b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // The key is supposed to be Integer32.
36453fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return index == 0
36463fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      ? Representation::Tagged()
36473fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : Representation::Integer32();
3648b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3649b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3650e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
3651e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
3652592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  bool RequiresHoleCheck();
3653257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
3654257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(LoadKeyedFastElement)
36551e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
36561e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
3657e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
36581e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block};
36591e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
36601e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
36613fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HLoadKeyedFastDoubleElement: public HTemplateInstruction<2> {
36623fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch public:
36633fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HLoadKeyedFastDoubleElement(HValue* elements, HValue* key) {
36643fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(0, elements);
36653fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(1, key);
36663fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    set_representation(Representation::Double());
366769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    SetFlag(kDependsOnDoubleArrayElements);
36683fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetFlag(kUseGVN);
36693fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
36703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
36713fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* elements() { return OperandAt(0); }
36723fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* key() { return OperandAt(1); }
36733fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
3674592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
36753fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    // The key is supposed to be Integer32.
36763fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return index == 0
36773fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      ? Representation::Tagged()
36783fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : Representation::Integer32();
36793fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
36803fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
36813fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  virtual void PrintDataTo(StringStream* stream);
36823fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
36833fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(LoadKeyedFastDoubleElement)
36843fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
36853fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch protected:
36863fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  virtual bool DataEquals(HValue* other) { return true; }
36873fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch};
36883fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
36893fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
36903fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HLoadKeyedSpecializedArrayElement: public HTemplateInstruction<2> {
36911e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public:
369244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  HLoadKeyedSpecializedArrayElement(HValue* external_elements,
369344f0eee88ff00398ff7f715fab053374d808c90dSteve Block                                    HValue* key,
3694589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch                                    ElementsKind elements_kind)
36953fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      :  elements_kind_(elements_kind) {
36963fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(0, external_elements);
36973fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(1, key);
3698589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    if (elements_kind == EXTERNAL_FLOAT_ELEMENTS ||
3699589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch        elements_kind == EXTERNAL_DOUBLE_ELEMENTS) {
370044f0eee88ff00398ff7f715fab053374d808c90dSteve Block      set_representation(Representation::Double());
370144f0eee88ff00398ff7f715fab053374d808c90dSteve Block    } else {
370244f0eee88ff00398ff7f715fab053374d808c90dSteve Block      set_representation(Representation::Integer32());
370344f0eee88ff00398ff7f715fab053374d808c90dSteve Block    }
370444f0eee88ff00398ff7f715fab053374d808c90dSteve Block    SetFlag(kDependsOnSpecializedArrayElements);
370544f0eee88ff00398ff7f715fab053374d808c90dSteve Block    // Native code could change the specialized array.
37061e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetFlag(kDependsOnCalls);
37071e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetFlag(kUseGVN);
37081e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
37091e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
3710e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
37111e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
3712592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
37131e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    // The key is supposed to be Integer32, but the base pointer
37141e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    // for the element load is a naked pointer.
37153fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return index == 0
37163fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      ? Representation::External()
37173fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : Representation::Integer32();
37181e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
37191e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
3720e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* external_pointer() { return OperandAt(0); }
3721e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* key() { return OperandAt(1); }
3722589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  ElementsKind elements_kind() const { return elements_kind_; }
37231e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
3724257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(LoadKeyedSpecializedArrayElement)
37251e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
37261e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
372744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual bool DataEquals(HValue* other) {
372844f0eee88ff00398ff7f715fab053374d808c90dSteve Block    if (!other->IsLoadKeyedSpecializedArrayElement()) return false;
372944f0eee88ff00398ff7f715fab053374d808c90dSteve Block    HLoadKeyedSpecializedArrayElement* cast_other =
373044f0eee88ff00398ff7f715fab053374d808c90dSteve Block        HLoadKeyedSpecializedArrayElement::cast(other);
37313fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return elements_kind_ == cast_other->elements_kind();
373244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
373344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
373444f0eee88ff00398ff7f715fab053374d808c90dSteve Block private:
3735589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  ElementsKind elements_kind_;
3736b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3737b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3738b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3739e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HLoadKeyedGeneric: public HTemplateInstruction<3> {
3740b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
3741257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HLoadKeyedGeneric(HValue* context, HValue* obj, HValue* key) {
3742e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    set_representation(Representation::Tagged());
3743e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    SetOperandAt(0, obj);
3744e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    SetOperandAt(1, key);
37451e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetOperandAt(2, context);
37461e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetAllSideEffects();
37471e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
37481e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
3749e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* object() { return OperandAt(0); }
3750e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* key() { return OperandAt(1); }
3751e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* context() { return OperandAt(2); }
37529fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block
3753e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
3754b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3755592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
3756b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return Representation::Tagged();
3757b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3758b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3759257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(LoadKeyedGeneric)
3760b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3761b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3762b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
37633fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HStoreNamedField: public HTemplateInstruction<2> {
3764b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
3765b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HStoreNamedField(HValue* obj,
37661e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block                   Handle<String> name,
3767b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch                   HValue* val,
3768b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch                   bool in_object,
3769b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch                   int offset)
37703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : name_(name),
3771b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        is_in_object_(in_object),
3772b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        offset_(offset) {
37733fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(0, obj);
37743fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(1, val);
3775b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (is_in_object_) {
3776b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      SetFlag(kChangesInobjectFields);
3777b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    } else {
3778b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      SetFlag(kChangesBackingStoreFields);
3779b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
3780b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3781b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3782257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(StoreNamedField)
3783b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3784592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
37851e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return Representation::Tagged();
3786b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3787e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
3788e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
3789e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* object() { return OperandAt(0); }
3790e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* value() { return OperandAt(1); }
3791b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3792e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  Handle<String> name() const { return name_; }
3793b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool is_in_object() const { return is_in_object_; }
3794b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int offset() const { return offset_; }
3795b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<Map> transition() const { return transition_; }
3796b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void set_transition(Handle<Map> map) { transition_ = map; }
3797b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3798e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  bool NeedsWriteBarrier() {
37991e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return StoringValueNeedsWriteBarrier(value());
38001e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
38011e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
3802b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
3803e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  Handle<String> name_;
3804b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool is_in_object_;
3805b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int offset_;
3806b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<Map> transition_;
3807b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3808b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3809b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3810e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HStoreNamedGeneric: public HTemplateInstruction<3> {
3811b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
38121e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HStoreNamedGeneric(HValue* context,
38131e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block                     HValue* object,
38141e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block                     Handle<String> name,
38158b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch                     HValue* value,
3816592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch                     StrictModeFlag strict_mode_flag)
38178b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch      : name_(name),
3818592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch        strict_mode_flag_(strict_mode_flag) {
3819e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    SetOperandAt(0, object);
3820e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    SetOperandAt(1, value);
38211e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetOperandAt(2, context);
38221e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetAllSideEffects();
38231e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
38241e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
3825e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* object() { return OperandAt(0); }
3826e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* value() { return OperandAt(1); }
3827e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* context() { return OperandAt(2); }
3828e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  Handle<String> name() { return name_; }
3829592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  StrictModeFlag strict_mode_flag() { return strict_mode_flag_; }
38301e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
3831e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
38321e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
3833592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
3834e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::Tagged();
3835b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3836b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3837257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(StoreNamedGeneric)
38381e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
38391e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block private:
3840e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  Handle<String> name_;
3841592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  StrictModeFlag strict_mode_flag_;
3842b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3843b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3844b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3845e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HStoreKeyedFastElement: public HTemplateInstruction<3> {
3846b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
3847592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  HStoreKeyedFastElement(HValue* obj, HValue* key, HValue* val,
3848592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch                         ElementsKind elements_kind = FAST_ELEMENTS)
3849592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch      : elements_kind_(elements_kind) {
3850b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetOperandAt(0, obj);
3851b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetOperandAt(1, key);
3852b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetOperandAt(2, val);
3853e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    SetFlag(kChangesArrayElements);
3854b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3855b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3856592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
3857e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    // The key is supposed to be Integer32.
38583fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return index == 1
38593fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        ? Representation::Integer32()
3860e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        : Representation::Tagged();
3861b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3862b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3863e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* object() { return OperandAt(0); }
3864e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* key() { return OperandAt(1); }
3865e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* value() { return OperandAt(2); }
3866592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  bool value_is_smi() {
3867592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch    return elements_kind_ == FAST_SMI_ONLY_ELEMENTS;
3868592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  }
3869b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3870e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  bool NeedsWriteBarrier() {
3871592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch    if (value_is_smi()) {
3872592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch      return false;
3873592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch    } else {
3874592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch      return StoringValueNeedsWriteBarrier(value());
3875592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch    }
3876592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  }
3877592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
3878592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  bool ValueNeedsSmiCheck() {
3879592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch    return value_is_smi();
38809fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block  }
38819fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block
3882e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
3883b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3884257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(StoreKeyedFastElement)
3885592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
3886592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch private:
3887592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  ElementsKind elements_kind_;
3888b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3889b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3890b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
38913fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HStoreKeyedFastDoubleElement: public HTemplateInstruction<3> {
38923fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch public:
38933fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HStoreKeyedFastDoubleElement(HValue* elements,
38943fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch                               HValue* key,
38953fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch                               HValue* val) {
38963fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(0, elements);
38973fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(1, key);
38983fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(2, val);
389969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    SetFlag(kChangesDoubleArrayElements);
39003fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
39013fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
3902592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
39033fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    if (index == 1) {
39043fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      return Representation::Integer32();
39053fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    } else if (index == 2) {
39063fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      return Representation::Double();
39073fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    } else {
39083fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      return Representation::Tagged();
39093fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    }
39103fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
39113fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
39123fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* elements() { return OperandAt(0); }
39133fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* key() { return OperandAt(1); }
39143fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* value() { return OperandAt(2); }
39153fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
39163fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  bool NeedsWriteBarrier() {
39173fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return StoringValueNeedsWriteBarrier(value());
39183fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
39193fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
39203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  virtual void PrintDataTo(StringStream* stream);
39213fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
39223fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(StoreKeyedFastDoubleElement)
39233fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch};
39243fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
39253fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
392644f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass HStoreKeyedSpecializedArrayElement: public HTemplateInstruction<3> {
3927b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
392844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  HStoreKeyedSpecializedArrayElement(HValue* external_elements,
392944f0eee88ff00398ff7f715fab053374d808c90dSteve Block                                     HValue* key,
393044f0eee88ff00398ff7f715fab053374d808c90dSteve Block                                     HValue* val,
3931589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch                                     ElementsKind elements_kind)
39323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : elements_kind_(elements_kind) {
393344f0eee88ff00398ff7f715fab053374d808c90dSteve Block    SetFlag(kChangesSpecializedArrayElements);
3934e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    SetOperandAt(0, external_elements);
3935e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    SetOperandAt(1, key);
3936e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    SetOperandAt(2, val);
3937b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3938b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3939e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
3940e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
3941592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
3942e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    if (index == 0) {
3943e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      return Representation::External();
3944e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    } else {
39453fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      bool float_or_double_elements =
3946589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch          elements_kind() == EXTERNAL_FLOAT_ELEMENTS ||
3947589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch          elements_kind() == EXTERNAL_DOUBLE_ELEMENTS;
39483fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      if (index == 2 && float_or_double_elements) {
394944f0eee88ff00398ff7f715fab053374d808c90dSteve Block        return Representation::Double();
395044f0eee88ff00398ff7f715fab053374d808c90dSteve Block      } else {
395144f0eee88ff00398ff7f715fab053374d808c90dSteve Block        return Representation::Integer32();
395244f0eee88ff00398ff7f715fab053374d808c90dSteve Block      }
3953e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    }
3954b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3955b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3956e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* external_pointer() { return OperandAt(0); }
3957e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* key() { return OperandAt(1); }
3958e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* value() { return OperandAt(2); }
3959589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  ElementsKind elements_kind() const { return elements_kind_; }
3960e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
3961257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(StoreKeyedSpecializedArrayElement)
3962257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
396344f0eee88ff00398ff7f715fab053374d808c90dSteve Block private:
3964589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  ElementsKind elements_kind_;
3965b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3966b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3967b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3968e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HStoreKeyedGeneric: public HTemplateInstruction<4> {
3969b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
39701e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HStoreKeyedGeneric(HValue* context,
39711e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block                     HValue* object,
39721e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block                     HValue* key,
39738b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch                     HValue* value,
3974592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch                     StrictModeFlag strict_mode_flag)
3975592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch      : strict_mode_flag_(strict_mode_flag) {
3976e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    SetOperandAt(0, object);
3977e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    SetOperandAt(1, key);
3978e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    SetOperandAt(2, value);
39791e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetOperandAt(3, context);
39801e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetAllSideEffects();
39811e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
39821e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
3983e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* object() { return OperandAt(0); }
3984e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* key() { return OperandAt(1); }
3985e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* value() { return OperandAt(2); }
3986e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* context() { return OperandAt(3); }
3987592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  StrictModeFlag strict_mode_flag() { return strict_mode_flag_; }
39881e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
3989592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
3990e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::Tagged();
3991b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3992b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3993e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
39941e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
3995257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(StoreKeyedGeneric)
39968b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
39978b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch private:
3998592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  StrictModeFlag strict_mode_flag_;
3999592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch};
4000592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
4001592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
4002592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdochclass HTransitionElementsKind: public HTemplateInstruction<1> {
4003592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch public:
4004592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  HTransitionElementsKind(HValue* object,
4005592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch                          Handle<Map> original_map,
4006592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch                          Handle<Map> transitioned_map)
4007592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch      : original_map_(original_map),
4008592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch        transitioned_map_(transitioned_map) {
4009592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch    SetOperandAt(0, object);
4010592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch    SetFlag(kUseGVN);
4011592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch    SetFlag(kChangesElementsKind);
4012592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch    set_representation(Representation::Tagged());
4013592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  }
4014592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
4015592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
4016592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch    return Representation::Tagged();
4017592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  }
4018592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
4019592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  HValue* object() { return OperandAt(0); }
4020592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  Handle<Map> original_map() { return original_map_; }
4021592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  Handle<Map> transitioned_map() { return transitioned_map_; }
4022592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
4023592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual void PrintDataTo(StringStream* stream);
4024592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
4025592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(TransitionElementsKind)
4026592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
4027592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch protected:
4028592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual bool DataEquals(HValue* other) {
4029592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch    HTransitionElementsKind* instr = HTransitionElementsKind::cast(other);
4030592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch    return original_map_.is_identical_to(instr->original_map()) &&
4031592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch        transitioned_map_.is_identical_to(instr->transitioned_map());
4032592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  }
4033592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
4034592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch private:
4035592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  Handle<Map> original_map_;
4036592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  Handle<Map> transitioned_map_;
40378b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch};
40388b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
40398b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
4040257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochclass HStringAdd: public HBinaryOperation {
4041257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public:
40423fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HStringAdd(HValue* context, HValue* left, HValue* right)
40433fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : HBinaryOperation(context, left, right) {
4044257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    set_representation(Representation::Tagged());
4045257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    SetFlag(kUseGVN);
4046257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    SetFlag(kDependsOnMaps);
4047257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
4048257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
4049592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
4050257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return Representation::Tagged();
4051257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
4052257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
4053257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  virtual HType CalculateInferredType() {
4054257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return HType::String();
4055257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
4056257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
4057257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(StringAdd)
4058257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
4059257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch protected:
4060257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  virtual bool DataEquals(HValue* other) { return true; }
4061257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
4062257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
4063257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
40643fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HStringCharCodeAt: public HTemplateInstruction<3> {
40651e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public:
40663fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HStringCharCodeAt(HValue* context, HValue* string, HValue* index) {
40673fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(0, context);
40683fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(1, string);
40693fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(2, index);
40701e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    set_representation(Representation::Integer32());
40711e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetFlag(kUseGVN);
407244f0eee88ff00398ff7f715fab053374d808c90dSteve Block    SetFlag(kDependsOnMaps);
40731e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
40741e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
4075592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
40761e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    // The index is supposed to be Integer32.
40773fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return index == 2
40783fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        ? Representation::Integer32()
40791e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block        : Representation::Tagged();
40801e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
40811e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
40823fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* context() { return OperandAt(0); }
40833fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* string() { return OperandAt(1); }
40843fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* index() { return OperandAt(2); }
40851e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
4086257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(StringCharCodeAt)
40871e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
40881e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
4089e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
40901e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
40911e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  virtual Range* InferRange() {
40921e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return new Range(0, String::kMaxUC16CharCode);
40931e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
40941e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block};
40951e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
40961e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
40973fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HStringCharFromCode: public HTemplateInstruction<2> {
409844f0eee88ff00398ff7f715fab053374d808c90dSteve Block public:
40993fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HStringCharFromCode(HValue* context, HValue* char_code) {
41003fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(0, context);
41013fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(1, char_code);
4102592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch    set_representation(Representation::Tagged());
410344f0eee88ff00398ff7f715fab053374d808c90dSteve Block    SetFlag(kUseGVN);
410444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
410544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
4106592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
41073fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return index == 0
41083fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        ? Representation::Tagged()
41093fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        : Representation::Integer32();
411044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
4111592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual HType CalculateInferredType();
411244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
41133fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* context() { return OperandAt(0); }
41143fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* value() { return OperandAt(1); }
41153fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
411644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual bool DataEquals(HValue* other) { return true; }
411744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
4118257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(StringCharFromCode)
411944f0eee88ff00398ff7f715fab053374d808c90dSteve Block};
412044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
412144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
41221e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HStringLength: public HUnaryOperation {
41231e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public:
41241e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  explicit HStringLength(HValue* string) : HUnaryOperation(string) {
41251e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    set_representation(Representation::Tagged());
41261e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetFlag(kUseGVN);
412744f0eee88ff00398ff7f715fab053374d808c90dSteve Block    SetFlag(kDependsOnMaps);
41281e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
41291e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
4130592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
41311e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return Representation::Tagged();
41321e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
41331e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
4134e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual HType CalculateInferredType() {
41351e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    STATIC_ASSERT(String::kMaxLength <= Smi::kMaxValue);
41361e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return HType::Smi();
41371e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
41381e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
4139257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(StringLength)
41401e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
41411e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
4142e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
41431e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
41441e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  virtual Range* InferRange() {
41451e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return new Range(0, String::kMaxLength);
41461e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
4147b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
4148b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4149b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4150e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochtemplate <int V>
4151e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HMaterializedLiteral: public HTemplateInstruction<V> {
4152b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
4153e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HMaterializedLiteral<V>(int index, int depth)
4154b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      : literal_index_(index), depth_(depth) {
4155e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    this->set_representation(Representation::Tagged());
4156b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
4157b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4158b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int literal_index() const { return literal_index_; }
4159b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int depth() const { return depth_; }
4160b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4161b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
4162b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int literal_index_;
4163b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int depth_;
4164b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
4165b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4166b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
41673fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HArrayLiteral: public HMaterializedLiteral<1> {
4168b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
41693fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HArrayLiteral(HValue* context,
41703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch                Handle<FixedArray> constant_elements,
4171b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch                int length,
4172b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch                int literal_index,
4173b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch                int depth)
41743fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : HMaterializedLiteral<1>(literal_index, depth),
4175b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        length_(length),
41763fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        constant_elements_(constant_elements) {
41773fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(0, context);
41783fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
4179b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
41803fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* context() { return OperandAt(0); }
4181b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<FixedArray> constant_elements() const { return constant_elements_; }
4182b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int length() const { return length_; }
4183b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4184b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool IsCopyOnWrite() const;
4185b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4186592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
41873fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return Representation::Tagged();
4188e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
4189592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual HType CalculateInferredType();
4190e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
4191257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(ArrayLiteral)
4192b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4193b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
4194b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int length_;
4195b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<FixedArray> constant_elements_;
4196b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
4197b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4198b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4199592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdochclass HObjectLiteralFast: public HMaterializedLiteral<1> {
4200b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
4201592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  HObjectLiteralFast(HValue* context,
4202592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch                     Handle<JSObject> boilerplate,
4203592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch                     int total_size,
4204592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch                     int literal_index,
4205592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch                     int depth)
4206592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch      : HMaterializedLiteral<1>(literal_index, depth),
4207592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch        boilerplate_(boilerplate),
4208592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch        total_size_(total_size) {
4209592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch    SetOperandAt(0, context);
4210592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  }
4211592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
4212592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  // Maximum depth and total number of properties for object literal
4213592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  // graphs to be considered for fast deep-copying.
4214592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  static const int kMaxObjectLiteralDepth = 3;
4215592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  static const int kMaxObjectLiteralProperties = 8;
4216592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
4217592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  HValue* context() { return OperandAt(0); }
4218592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  Handle<JSObject> boilerplate() const { return boilerplate_; }
4219592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  int total_size() const { return total_size_; }
4220592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
4221592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
4222592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch    return Representation::Tagged();
4223592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  }
4224592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual HType CalculateInferredType();
4225592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
4226592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(ObjectLiteralFast)
4227592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
4228592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch private:
4229592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  Handle<JSObject> boilerplate_;
4230592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  int total_size_;
4231592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch};
4232592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
4233592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
4234592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdochclass HObjectLiteralGeneric: public HMaterializedLiteral<1> {
4235592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch public:
4236592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  HObjectLiteralGeneric(HValue* context,
4237592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch                        Handle<FixedArray> constant_properties,
4238592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch                        bool fast_elements,
4239592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch                        int literal_index,
4240592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch                        int depth,
4241592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch                        bool has_function)
4242e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      : HMaterializedLiteral<1>(literal_index, depth),
4243b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        constant_properties_(constant_properties),
424444f0eee88ff00398ff7f715fab053374d808c90dSteve Block        fast_elements_(fast_elements),
424544f0eee88ff00398ff7f715fab053374d808c90dSteve Block        has_function_(has_function) {
42461e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetOperandAt(0, context);
42471e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
4248b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4249e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* context() { return OperandAt(0); }
4250b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<FixedArray> constant_properties() const {
4251b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return constant_properties_;
4252b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
4253b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool fast_elements() const { return fast_elements_; }
425444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  bool has_function() const { return has_function_; }
4255b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4256592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
4257e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::Tagged();
4258e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
4259592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual HType CalculateInferredType();
42601e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
4261592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(ObjectLiteralGeneric)
4262b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4263b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
4264b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<FixedArray> constant_properties_;
4265b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool fast_elements_;
426644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  bool has_function_;
4267b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
4268b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4269b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
42703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HRegExpLiteral: public HMaterializedLiteral<1> {
4271b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
42723fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HRegExpLiteral(HValue* context,
42733fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch                 Handle<String> pattern,
4274b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch                 Handle<String> flags,
4275b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch                 int literal_index)
42763fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : HMaterializedLiteral<1>(literal_index, 0),
4277b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        pattern_(pattern),
42783fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        flags_(flags) {
42793fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(0, context);
42802b4ba1175df6a5a6b9b5cda034189197bf6565ecBen Murdoch    SetAllSideEffects();
42813fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
4282b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
42833fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* context() { return OperandAt(0); }
4284b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<String> pattern() { return pattern_; }
4285b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<String> flags() { return flags_; }
4286b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4287592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
42883fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return Representation::Tagged();
4289e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
4290592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual HType CalculateInferredType();
4291e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
4292257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(RegExpLiteral)
4293b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4294b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
4295b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<String> pattern_;
4296b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<String> flags_;
4297b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
4298b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4299b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
43003fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HFunctionLiteral: public HTemplateInstruction<1> {
4301b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
43023fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HFunctionLiteral(HValue* context,
43033fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch                   Handle<SharedFunctionInfo> shared,
43043fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch                   bool pretenure)
4305b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      : shared_info_(shared), pretenure_(pretenure) {
43063fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(0, context);
4307b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
4308b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
4309b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
43103fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* context() { return OperandAt(0); }
43113fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
4312592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
43133fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return Representation::Tagged();
4314e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
4315592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual HType CalculateInferredType();
4316e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
4317257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(FunctionLiteral)
4318b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4319b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<SharedFunctionInfo> shared_info() const { return shared_info_; }
4320b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool pretenure() const { return pretenure_; }
4321b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4322b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
4323b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<SharedFunctionInfo> shared_info_;
4324b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool pretenure_;
4325b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
4326b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4327b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
43283fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HTypeof: public HTemplateInstruction<2> {
4329b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
43303fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  explicit HTypeof(HValue* context, HValue* value) {
43313fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(0, context);
43323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(1, value);
4333b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
4334b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
4335b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
43363fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* context() { return OperandAt(0); }
43373fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* value() { return OperandAt(1); }
43383fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
4339592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual HValue* Canonicalize();
4340592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual void PrintDataTo(StringStream* stream);
4341592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
4342592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
43431e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return Representation::Tagged();
43441e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
43451e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
4346257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Typeof)
4347b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
4348b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4349b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
435044f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass HToFastProperties: public HUnaryOperation {
435144f0eee88ff00398ff7f715fab053374d808c90dSteve Block public:
435244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  explicit HToFastProperties(HValue* value) : HUnaryOperation(value) {
435344f0eee88ff00398ff7f715fab053374d808c90dSteve Block    // This instruction is not marked as having side effects, but
435444f0eee88ff00398ff7f715fab053374d808c90dSteve Block    // changes the map of the input operand. Use it only when creating
435544f0eee88ff00398ff7f715fab053374d808c90dSteve Block    // object literals.
4356592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch    ASSERT(value->IsObjectLiteralGeneric() || value->IsObjectLiteralFast());
435744f0eee88ff00398ff7f715fab053374d808c90dSteve Block    set_representation(Representation::Tagged());
435844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
435944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
4360592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
436144f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return Representation::Tagged();
436244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
436344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
4364257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(ToFastProperties)
436544f0eee88ff00398ff7f715fab053374d808c90dSteve Block};
436644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
436744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
4368b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HValueOf: public HUnaryOperation {
4369b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
4370b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  explicit HValueOf(HValue* value) : HUnaryOperation(value) {
4371b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
4372b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
4373b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4374592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
4375e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::Tagged();
4376e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
4377e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
4378257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(ValueOf)
4379b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
4380b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4381b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4382b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HDeleteProperty: public HBinaryOperation {
4383b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
43843fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HDeleteProperty(HValue* context, HValue* obj, HValue* key)
43853fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : HBinaryOperation(context, obj, key) {
4386b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
43871e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetAllSideEffects();
4388b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
4389b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4390592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
4391b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return Representation::Tagged();
4392b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
4393b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
43943fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  virtual HType CalculateInferredType();
43953fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
4396257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(DeleteProperty)
4397b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4398e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* object() { return left(); }
4399e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* key() { return right(); }
4400b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
4401b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4402257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
44033fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HIn: public HTemplateInstruction<3> {
4404257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public:
44053fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HIn(HValue* context, HValue* key, HValue* object) {
44063fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(0, context);
44073fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(1, key);
44083fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(2, object);
4409257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    set_representation(Representation::Tagged());
4410257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    SetAllSideEffects();
4411257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
4412257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
44133fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* context() { return OperandAt(0); }
44143fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* key() { return OperandAt(1); }
44153fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* object() { return OperandAt(2); }
4416257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
4417592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
4418257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return Representation::Tagged();
4419257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
4420257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
4421257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  virtual HType CalculateInferredType() {
4422257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return HType::Boolean();
4423257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
4424257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
4425257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  virtual void PrintDataTo(StringStream* stream);
4426257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
4427257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(In)
4428257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
4429257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
4430b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#undef DECLARE_INSTRUCTION
4431b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#undef DECLARE_CONCRETE_INSTRUCTION
4432b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4433b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} }  // namespace v8::internal
4434b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4435b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif  // V8_HYDROGEN_INSTRUCTIONS_H_
4436