13ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Copyright 2012 the V8 project authors. All rights reserved.
2b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// Redistribution and use in source and binary forms, with or without
3b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// modification, are permitted provided that the following conditions are
4b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// met:
5b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch//
6b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch//     * Redistributions of source code must retain the above copyright
7b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch//       notice, this list of conditions and the following disclaimer.
8b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch//     * Redistributions in binary form must reproduce the above
9b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch//       copyright notice, this list of conditions and the following
10b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch//       disclaimer in the documentation and/or other materials provided
11b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch//       with the distribution.
12b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch//     * Neither the name of Google Inc. nor the names of its
13b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch//       contributors may be used to endorse or promote products derived
14b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch//       from this software without specific prior written permission.
15b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch//
16b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
28b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifndef V8_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)                                       \
653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  V(AllocateObject)                            \
66b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(ApplyArguments)                            \
67b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(ArgumentsElements)                         \
68b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(ArgumentsLength)                           \
69b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(ArgumentsObject)                           \
70b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(ArrayLiteral)                              \
713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  V(Bitwise)                                   \
72b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(BitNot)                                    \
73b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(BlockEntry)                                \
74b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(BoundsCheck)                               \
753fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  V(Branch)                                    \
76b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(CallConstantFunction)                      \
77b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(CallFunction)                              \
78b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(CallGlobal)                                \
79b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(CallKeyed)                                 \
80b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(CallKnownGlobal)                           \
81b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(CallNamed)                                 \
82b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(CallNew)                                   \
83b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(CallRuntime)                               \
84b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(CallStub)                                  \
85b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(Change)                                    \
86b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(CheckFunction)                             \
87b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(CheckInstanceType)                         \
88b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(CheckMap)                                  \
89b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(CheckNonSmi)                               \
90b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(CheckPrototypeMaps)                        \
91b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(CheckSmi)                                  \
92257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(ClampToUint8)                              \
933fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  V(ClassOfTestAndBranch)                      \
943fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  V(CompareIDAndBranch)                        \
953fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  V(CompareGeneric)                            \
963fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  V(CompareObjectEqAndBranch)                  \
971e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  V(CompareMap)                                \
983fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  V(CompareConstantEqAndBranch)                \
99b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(Constant)                                  \
1001e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  V(Context)                                   \
1013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  V(DeclareGlobals)                            \
102b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(DeleteProperty)                            \
103b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(Deoptimize)                                \
104b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(Div)                                       \
1053fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  V(ElementsKind)                              \
106b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(EnterInlined)                              \
1073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  V(FastLiteral)                               \
10869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  V(FixedArrayBaseLength)                      \
109257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(ForceRepresentation)                       \
110b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(FunctionLiteral)                           \
111e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  V(GetCachedArrayIndex)                       \
112b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(GlobalObject)                              \
113b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(GlobalReceiver)                            \
114b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(Goto)                                      \
1153fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  V(HasCachedArrayIndexAndBranch)              \
1163fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  V(HasInstanceTypeAndBranch)                  \
117257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(In)                                        \
118b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(InstanceOf)                                \
119086aeeaae12517475c22695a200be45495516549Ben Murdoch  V(InstanceOfKnownGlobal)                     \
120257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(InvokeFunction)                            \
1213fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  V(IsConstructCallAndBranch)                  \
1223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  V(IsNilAndBranch)                            \
1233fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  V(IsObjectAndBranch)                         \
1243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  V(IsStringAndBranch)                         \
1253fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  V(IsSmiAndBranch)                            \
1263fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  V(IsUndetectableAndBranch)                   \
1273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  V(StringCompareAndBranch)                    \
1289fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block  V(JSArrayLength)                             \
129b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(LeaveInlined)                              \
130b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(LoadContextSlot)                           \
131b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(LoadElements)                              \
13244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(LoadExternalArrayPointer)                  \
1331e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  V(LoadFunctionPrototype)                     \
1348b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  V(LoadGlobalCell)                            \
1358b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  V(LoadGlobalGeneric)                         \
1363fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  V(LoadKeyedFastDoubleElement)                \
137b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(LoadKeyedFastElement)                      \
138b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(LoadKeyedGeneric)                          \
13944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(LoadKeyedSpecializedArrayElement)          \
140b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(LoadNamedField)                            \
14144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(LoadNamedFieldPolymorphic)                 \
142b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(LoadNamedGeneric)                          \
143b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(Mod)                                       \
144b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(Mul)                                       \
1455d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch  V(ObjectLiteral)                             \
146b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(OsrEntry)                                  \
1471e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  V(OuterContext)                              \
148b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(Parameter)                                 \
149b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(Power)                                     \
150b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(PushArgument)                              \
1513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  V(Random)                                    \
152b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(RegExpLiteral)                             \
153b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(Return)                                    \
154b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(Sar)                                       \
155b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(Shl)                                       \
156b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(Shr)                                       \
157b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(Simulate)                                  \
1583fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  V(SoftDeoptimize)                            \
159b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(StackCheck)                                \
1601e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  V(StoreContextSlot)                          \
1618b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  V(StoreGlobalCell)                           \
1628b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  V(StoreGlobalGeneric)                        \
1633fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  V(StoreKeyedFastDoubleElement)               \
164b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(StoreKeyedFastElement)                     \
165b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(StoreKeyedGeneric)                         \
1663fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  V(StoreKeyedSpecializedArrayElement)         \
167b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(StoreNamedField)                           \
168b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(StoreNamedGeneric)                         \
169257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(StringAdd)                                 \
1701e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  V(StringCharCodeAt)                          \
17144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(StringCharFromCode)                        \
1721e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  V(StringLength)                              \
173b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(Sub)                                       \
1743fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  V(ThisFunction)                              \
175b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(Throw)                                     \
17644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(ToFastProperties)                          \
1773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  V(TransitionElementsKind)                    \
178b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(Typeof)                                    \
1793fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  V(TypeofIsAndBranch)                         \
180b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(UnaryMathOperation)                        \
181b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(UnknownOSRValue)                           \
1823fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  V(UseConst)                                  \
1833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  V(ValueOf)                                   \
1843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  V(ForInPrepareMap)                           \
1853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  V(ForInCacheArray)                           \
1863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  V(CheckMapValue)                             \
1873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  V(LoadFieldByIndex)                          \
1883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  V(DateField)                                 \
1893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  V(WrapReceiver)
190b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
191b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#define GVN_FLAG_LIST(V)                       \
192b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(Calls)                                     \
193b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(InobjectFields)                            \
194b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(BackingStoreFields)                        \
1953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  V(ElementsKind)                              \
1963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  V(ElementsPointer)                           \
197b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(ArrayElements)                             \
19869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  V(DoubleArrayElements)                       \
19944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(SpecializedArrayElements)                  \
200b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(GlobalVars)                                \
201b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(Maps)                                      \
202b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(ArrayLengths)                              \
2031e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  V(ContextSlots)                              \
204b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(OsrEntries)
205b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
206257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#define DECLARE_ABSTRACT_INSTRUCTION(type)          \
207b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual bool Is##type() const { return true; }    \
208b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static H##type* cast(HValue* value) {             \
209b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(value->Is##type());                      \
210b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return reinterpret_cast<H##type*>(value);       \
211257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
212b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
213b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
214257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#define DECLARE_CONCRETE_INSTRUCTION(type)                        \
215b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual LInstruction* CompileToLithium(LChunkBuilder* builder); \
216257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  static H##type* cast(HValue* value) {                           \
217257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    ASSERT(value->Is##type());                                    \
218257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return reinterpret_cast<H##type*>(value);                     \
219257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }                                                               \
220257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  virtual Opcode opcode() const { return HValue::k##type; }
221b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
222b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
223b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass Range: public ZoneObject {
224b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
225e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  Range()
226e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      : lower_(kMinInt),
227e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        upper_(kMaxInt),
228e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        next_(NULL),
229e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        can_be_minus_zero_(false) { }
230b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
231b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Range(int32_t lower, int32_t upper)
232e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      : lower_(lower),
233e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        upper_(upper),
234e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        next_(NULL),
235e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        can_be_minus_zero_(false) { }
236b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
237b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int32_t upper() const { return upper_; }
238b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int32_t lower() const { return lower_; }
239b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Range* next() const { return next_; }
2403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Range* CopyClearLower(Zone* zone) const {
2413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return new(zone) Range(kMinInt, upper_);
2423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
2433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Range* CopyClearUpper(Zone* zone) const {
2443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return new(zone) Range(lower_, kMaxInt);
2453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
2463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Range* Copy(Zone* zone) const {
2473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    Range* result = new(zone) Range(lower_, upper_);
24869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    result->set_can_be_minus_zero(CanBeMinusZero());
24969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    return result;
25069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  }
251b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int32_t Mask() const;
252b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void set_can_be_minus_zero(bool b) { can_be_minus_zero_ = b; }
253b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool CanBeMinusZero() const { return CanBeZero() && can_be_minus_zero_; }
254b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool CanBeZero() const { return upper_ >= 0 && lower_ <= 0; }
255b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool CanBeNegative() const { return lower_ < 0; }
256e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  bool Includes(int value) const { return lower_ <= value && upper_ >= value; }
25769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  bool IsMostGeneric() const {
25869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    return lower_ == kMinInt && upper_ == kMaxInt && CanBeMinusZero();
25969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  }
260e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  bool IsInSmiRange() const {
261e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return lower_ >= Smi::kMinValue && upper_ <= Smi::kMaxValue;
262b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
263e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  void KeepOrder();
2643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#ifdef DEBUG
265e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  void Verify() const;
2663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#endif
267b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
268b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void StackUpon(Range* other) {
269b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    Intersect(other);
270b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    next_ = other;
271b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
272b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
273e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  void Intersect(Range* other);
274e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  void Union(Range* other);
275b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
276e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  void AddConstant(int32_t value);
277e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  void Sar(int32_t value);
278e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  void Shl(int32_t value);
279b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool AddAndCheckOverflow(Range* other);
280b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool SubAndCheckOverflow(Range* other);
281b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool MulAndCheckOverflow(Range* other);
282b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
283b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
284b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int32_t lower_;
285b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int32_t upper_;
286b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Range* next_;
287b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool can_be_minus_zero_;
288b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
289b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
290b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
291b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass Representation {
292b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
293b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  enum Kind {
294b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kNone,
295b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kTagged,
296b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kDouble,
297b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kInteger32,
2981e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    kExternal,
299b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kNumRepresentations
300b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  };
301b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
302b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Representation() : kind_(kNone) { }
303b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
304b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static Representation None() { return Representation(kNone); }
305b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static Representation Tagged() { return Representation(kTagged); }
306b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static Representation Integer32() { return Representation(kInteger32); }
307b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static Representation Double() { return Representation(kDouble); }
3081e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  static Representation External() { return Representation(kExternal); }
309b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
310e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  bool Equals(const Representation& other) {
311b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return kind_ == other.kind_;
312b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
313b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3148b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  Kind kind() const { return static_cast<Kind>(kind_); }
315b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool IsNone() const { return kind_ == kNone; }
316b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool IsTagged() const { return kind_ == kTagged; }
317b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool IsInteger32() const { return kind_ == kInteger32; }
318b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool IsDouble() const { return kind_ == kDouble; }
3191e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  bool IsExternal() const { return kind_ == kExternal; }
320b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool IsSpecialization() const {
321b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return kind_ == kInteger32 || kind_ == kDouble;
322b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
323b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  const char* Mnemonic() const;
324b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
325b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
326b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  explicit Representation(Kind k) : kind_(k) { }
327b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3288b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  // Make sure kind fits in int8.
3298b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  STATIC_ASSERT(kNumRepresentations <= (1 << kBitsPerByte));
3308b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
3318b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  int8_t kind_;
332b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
333b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
334b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
335b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HType {
336b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
337b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HType() : type_(kUninitialized) { }
338b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
339b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static HType Tagged() { return HType(kTagged); }
340b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static HType TaggedPrimitive() { return HType(kTaggedPrimitive); }
341b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static HType TaggedNumber() { return HType(kTaggedNumber); }
342b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static HType Smi() { return HType(kSmi); }
343b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static HType HeapNumber() { return HType(kHeapNumber); }
344b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static HType String() { return HType(kString); }
345b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static HType Boolean() { return HType(kBoolean); }
346b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static HType NonPrimitive() { return HType(kNonPrimitive); }
347b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static HType JSArray() { return HType(kJSArray); }
348b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static HType JSObject() { return HType(kJSObject); }
349b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static HType Uninitialized() { return HType(kUninitialized); }
350b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
351b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Return the weakest (least precise) common type.
352b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HType Combine(HType other) {
353b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return HType(static_cast<Type>(type_ & other.type_));
354b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
355b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
356b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool Equals(const HType& other) {
357b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return type_ == other.type_;
358b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
359b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
360b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool IsSubtypeOf(const HType& other) {
361b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return Combine(other).Equals(other);
362b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
363b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
364b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool IsTagged() {
365b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(type_ != kUninitialized);
366b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return ((type_ & kTagged) == kTagged);
367b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
368b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
369b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool IsTaggedPrimitive() {
370b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(type_ != kUninitialized);
371b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return ((type_ & kTaggedPrimitive) == kTaggedPrimitive);
372b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
373b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
374b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool IsTaggedNumber() {
375b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(type_ != kUninitialized);
376b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return ((type_ & kTaggedNumber) == kTaggedNumber);
377b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
378b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
379b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool IsSmi() {
380b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(type_ != kUninitialized);
381b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return ((type_ & kSmi) == kSmi);
382b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
383b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
384b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool IsHeapNumber() {
385b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(type_ != kUninitialized);
386b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return ((type_ & kHeapNumber) == kHeapNumber);
387b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
388b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
389b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool IsString() {
390b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(type_ != kUninitialized);
391b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return ((type_ & kString) == kString);
392b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
393b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
394b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool IsBoolean() {
395b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(type_ != kUninitialized);
396b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return ((type_ & kBoolean) == kBoolean);
397b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
398b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
399b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool IsNonPrimitive() {
400b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(type_ != kUninitialized);
401b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return ((type_ & kNonPrimitive) == kNonPrimitive);
402b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
403b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
404b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool IsJSArray() {
405b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(type_ != kUninitialized);
406b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return ((type_ & kJSArray) == kJSArray);
407b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
408b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
409b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool IsJSObject() {
410b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(type_ != kUninitialized);
411b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return ((type_ & kJSObject) == kJSObject);
412b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
413b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
414b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool IsUninitialized() {
415b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return type_ == kUninitialized;
416b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
417b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool IsHeapObject() {
4193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    ASSERT(type_ != kUninitialized);
4203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return IsHeapNumber() || IsString() || IsNonPrimitive();
4213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
4223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
423b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static HType TypeFromValue(Handle<Object> value);
424b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
425b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  const char* ToString();
426b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
427b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
428b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  enum Type {
429b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kTagged = 0x1,           // 0000 0000 0000 0001
430b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kTaggedPrimitive = 0x5,  // 0000 0000 0000 0101
431b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kTaggedNumber = 0xd,     // 0000 0000 0000 1101
432b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kSmi = 0x1d,             // 0000 0000 0001 1101
433b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kHeapNumber = 0x2d,      // 0000 0000 0010 1101
434b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kString = 0x45,          // 0000 0000 0100 0101
435b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kBoolean = 0x85,         // 0000 0000 1000 0101
436b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kNonPrimitive = 0x101,   // 0000 0001 0000 0001
437b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kJSObject = 0x301,       // 0000 0011 0000 0001
4383fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    kJSArray = 0x701,        // 0000 0111 0000 0001
439b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kUninitialized = 0x1fff  // 0001 1111 1111 1111
440b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  };
441b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4428b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  // Make sure type fits in int16.
4438b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  STATIC_ASSERT(kUninitialized < (1 << (2 * kBitsPerByte)));
4448b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
445b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  explicit HType(Type t) : type_(t) { }
446b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4478b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  int16_t type_;
448b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
449b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
450b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
451257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochclass HUseListNode: public ZoneObject {
452257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public:
453257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HUseListNode(HValue* value, int index, HUseListNode* tail)
454257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      : tail_(tail), value_(value), index_(index) {
455257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
456257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
4573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HUseListNode* tail();
458257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HValue* value() const { return value_; }
459257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  int index() const { return index_; }
460257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
461257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  void set_tail(HUseListNode* list) { tail_ = list; }
462257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
463257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#ifdef DEBUG
464257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  void Zap() {
465257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    tail_ = reinterpret_cast<HUseListNode*>(1);
466257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    value_ = NULL;
467257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    index_ = -1;
468257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
469257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#endif
470257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
471257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch private:
472257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HUseListNode* tail_;
473257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HValue* value_;
474257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  int index_;
475257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
476257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
477257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
478257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// We reuse use list nodes behind the scenes as uses are added and deleted.
479257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// This class is the safe way to iterate uses while deleting them.
480257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochclass HUseIterator BASE_EMBEDDED {
481257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public:
482257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  bool Done() { return current_ == NULL; }
483257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  void Advance();
484257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
485257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HValue* value() {
486257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    ASSERT(!Done());
487257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return value_;
488257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
489257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
490257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  int index() {
491257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    ASSERT(!Done());
492257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return index_;
493257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
494257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
495257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch private:
496257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  explicit HUseIterator(HUseListNode* head);
497257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
498257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HUseListNode* current_;
499257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HUseListNode* next_;
500257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HValue* value_;
501257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  int index_;
502257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
503257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  friend class HValue;
504257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
505257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
506257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
5073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// There must be one corresponding kDepends flag for every kChanges flag and
5083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// the order of the kChanges flags must be exactly the same as of the kDepends
5093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// flags.
5103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochenum GVNFlag {
5113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Declare global value numbering flags.
5123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#define DECLARE_FLAG(type) kChanges##type, kDependsOn##type,
5133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  GVN_FLAG_LIST(DECLARE_FLAG)
5143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#undef DECLARE_FLAG
5153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  kAfterLastFlag,
5163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  kLastFlag = kAfterLastFlag - 1
5173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
5183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochtypedef EnumSet<GVNFlag> GVNFlagSet;
5203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
522b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HValue: public ZoneObject {
523b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
524b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static const int kNoNumber = -1;
525b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
526b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  enum Flag {
527b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kFlexibleRepresentation,
5283fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    // Participate in Global Value Numbering, i.e. elimination of
5293fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    // unnecessary recomputations. If an instruction sets this flag, it must
5303fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    // implement DataEquals(), which will be used to determine if other
5313fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    // occurrences of the instruction are indeed the same.
532b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kUseGVN,
533b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kCanOverflow,
534b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kBailoutOnMinusZero,
535b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kCanBeDivByZero,
5367d3e7fc4b65010eabe860313ee0c64f50843f6e3Ben Murdoch    kDeoptimizeOnUndefined,
537b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kIsArguments,
538b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kTruncatingToInt32,
5393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    kIsDead,
5403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    kLastFlag = kIsDead
541b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  };
542b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
543b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  STATIC_ASSERT(kLastFlag < kBitsPerInt);
544b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
545b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static const int kChangesToDependsFlagsLeftShift = 1;
546b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  static GVNFlagSet ConvertChangesToDependsFlags(GVNFlagSet flags) {
5483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return GVNFlagSet(flags.ToIntegral() << kChangesToDependsFlagsLeftShift);
549b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
550b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
551b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static HValue* cast(HValue* value) { return value; }
552b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
553b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  enum Opcode {
554b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // Declare a unique enum value for each hydrogen instruction.
555257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  #define DECLARE_OPCODE(type) k##type,
556257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    HYDROGEN_CONCRETE_INSTRUCTION_LIST(DECLARE_OPCODE)
557257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    kPhi
558257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  #undef DECLARE_OPCODE
559b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  };
560257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  virtual Opcode opcode() const = 0;
561257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
562257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // Declare a non-virtual predicates for each concrete HInstruction or HValue.
563257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  #define DECLARE_PREDICATE(type) \
564257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    bool Is##type() const { return opcode() == k##type; }
565257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    HYDROGEN_CONCRETE_INSTRUCTION_LIST(DECLARE_PREDICATE)
566257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  #undef DECLARE_PREDICATE
567257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    bool IsPhi() const { return opcode() == kPhi; }
568257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
569257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // Declare virtual predicates for abstract HInstruction or HValue
570257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  #define DECLARE_PREDICATE(type) \
571257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    virtual bool Is##type() const { return false; }
572257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    HYDROGEN_ABSTRACT_INSTRUCTION_LIST(DECLARE_PREDICATE)
573257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  #undef DECLARE_PREDICATE
574b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
575b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HValue() : block_(NULL),
576b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch             id_(kNoNumber),
577b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch             type_(HType::Tagged()),
578257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch             use_list_(NULL),
579b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch             range_(NULL),
580b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch             flags_(0) {}
581b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual ~HValue() {}
582b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
583b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HBasicBlock* block() const { return block_; }
584b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void SetBlock(HBasicBlock* block);
5853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  int LoopWeight() const;
586b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
587b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int id() const { return id_; }
588b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void set_id(int id) { id_ = id; }
589b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
590257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HUseIterator uses() const { return HUseIterator(use_list_); }
591b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
59244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual bool EmitAtUses() { return false; }
593b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Representation representation() const { return representation_; }
594b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void ChangeRepresentation(Representation r) {
595b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // Representation was already set and is allowed to be changed.
596b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(!r.IsNone());
597b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(CheckFlag(kFlexibleRepresentation));
598b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    RepresentationChanged(r);
599b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    representation_ = r;
600b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
601257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  void AssumeRepresentation(Representation r);
602257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
603257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  virtual bool IsConvertibleToInteger() const { return true; }
604b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
605b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HType type() const { return type_; }
60669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  void set_type(HType new_type) {
60769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    ASSERT(new_type.IsSubtypeOf(type_));
60869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    type_ = new_type;
609b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
610b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
611b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // An operation needs to override this function iff:
612b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  //   1) it can produce an int32 output.
613b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  //   2) the true value of its output can potentially be minus zero.
614b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // The implementation must set a flag so that it bails out in the case where
615b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // it would otherwise output what should be a minus zero as an int32 zero.
616b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // If the operation also exists in a form that takes int32 and outputs int32
617b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // then the operation should return its input value so that we can propagate
6183fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  // back.  There are three operations that need to propagate back to more than
6193fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  // one input.  They are phi and binary div and mul.  They always return NULL
6203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  // and expect the caller to take care of things.
621b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited) {
622b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    visited->Add(id());
623b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return NULL;
624b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
625b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
626b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool IsDefinedAfter(HBasicBlock* other) const;
627b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
628b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Operands.
629e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual int OperandCount() = 0;
630e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual HValue* OperandAt(int index) = 0;
631b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void SetOperandAt(int index, HValue* value);
632b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
633257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  void DeleteAndReplaceWith(HValue* other);
634257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  void ReplaceAllUsesWith(HValue* other);
635257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  bool HasNoUses() const { return use_list_ == NULL; }
636257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  bool HasMultipleUses() const {
637257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return use_list_ != NULL && use_list_->tail() != NULL;
638257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
639257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  int UseCount() const;
6403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
6413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Mark this HValue as dead and to be removed from other HValues' use lists.
6423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  void Kill();
643b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
644b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int flags() const { return flags_; }
6451e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  void SetFlag(Flag f) { flags_ |= (1 << f); }
6461e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  void ClearFlag(Flag f) { flags_ &= ~(1 << f); }
6471e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  bool CheckFlag(Flag f) const { return (flags_ & (1 << f)) != 0; }
6481e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
6493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Returns true if the flag specified is set for all uses, false otherwise.
6503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool CheckUsesForFlag(Flag f);
6515d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch
6523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  GVNFlagSet gvn_flags() const { return gvn_flags_; }
6533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  void SetGVNFlag(GVNFlag f) { gvn_flags_.Add(f); }
6543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  void ClearGVNFlag(GVNFlag f) { gvn_flags_.Remove(f); }
6553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool CheckGVNFlag(GVNFlag f) const { return gvn_flags_.Contains(f); }
6563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  void SetAllSideEffects() { gvn_flags_.Add(AllSideEffectsFlagSet()); }
6573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  void ClearAllSideEffects() {
6583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    gvn_flags_.Remove(AllSideEffectsFlagSet());
6593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
6603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool HasSideEffects() const {
6613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return gvn_flags_.ContainsAnyOf(AllSideEffectsFlagSet());
6623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
6633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool HasObservableSideEffects() const {
6643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return gvn_flags_.ContainsAnyOf(AllObservableSideEffectsFlagSet());
6653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
6663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
6673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  GVNFlagSet DependsOnFlags() const {
6683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    GVNFlagSet result = gvn_flags_;
6693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    result.Intersect(AllDependsOnFlagSet());
6703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return result;
6713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
6723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
6733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  GVNFlagSet SideEffectFlags() const {
6743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    GVNFlagSet result = gvn_flags_;
6753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    result.Intersect(AllSideEffectsFlagSet());
6763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return result;
6773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
6783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
6793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  GVNFlagSet ChangesFlags() const {
6803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    GVNFlagSet result = gvn_flags_;
6813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    result.Intersect(AllChangesFlagSet());
6823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return result;
6833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
6843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
6853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  GVNFlagSet ObservableChangesFlags() const {
6863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    GVNFlagSet result = gvn_flags_;
6873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    result.Intersect(AllChangesFlagSet());
6883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    result.Intersect(AllObservableSideEffectsFlagSet());
6893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return result;
6903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
691589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
692b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Range* range() const { return range_; }
693b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool HasRange() const { return range_ != NULL; }
6943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  void AddNewRange(Range* r, Zone* zone);
695b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void RemoveLastAddedRange();
6963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  void ComputeInitialRange(Zone* zone);
697b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
698b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Representation helpers.
6993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) = 0;
700e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
701e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual Representation InferredRepresentation() {
702b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return representation();
703b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
704b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
705b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // This gives the instruction an opportunity to replace itself with an
706b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // instruction that does the same in some better way.  To replace an
707b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // instruction with a new one, first add the new instruction to the graph,
708b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // then return it.  Return NULL to have the instruction deleted.
709b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual HValue* Canonicalize() { return this; }
710b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
711e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  bool Equals(HValue* other);
712e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual intptr_t Hashcode();
713b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
714b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Printing support.
715e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintTo(StringStream* stream) = 0;
716b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void PrintNameTo(StringStream* stream);
717257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  void PrintTypeTo(StringStream* stream);
718257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  void PrintRangeTo(StringStream* stream);
719257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  void PrintChangesTo(StringStream* stream);
720b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
721257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  const char* Mnemonic() const;
722b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
723b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Updated the inferred type of this instruction and returns true if
724b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // it has changed.
725b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool UpdateInferredType();
726b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
727e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual HType CalculateInferredType();
728b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
729b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG
7301e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  virtual void Verify() = 0;
731b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif
732b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
733b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
7341e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  // This function must be overridden for instructions with flag kUseGVN, to
7351e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  // compare the non-Operand parts of the instruction.
736e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) {
7371e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    UNREACHABLE();
7381e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return false;
7391e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
740b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual void RepresentationChanged(Representation to) { }
7413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Range* InferRange(Zone* zone);
742b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual void DeleteFromGraph() = 0;
743e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void InternalSetOperandAt(int index, HValue* value) = 0;
744b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void clear_block() {
745b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(block_ != NULL);
746b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    block_ = NULL;
747b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
748b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
749b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void set_representation(Representation r) {
750b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // Representation is set-once.
751b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(representation_.IsNone() && !r.IsNone());
752b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    representation_ = r;
753b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
754b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
7553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  static GVNFlagSet AllDependsOnFlagSet() {
7563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    GVNFlagSet result;
757589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    // Create changes mask.
7583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#define ADD_FLAG(type) result.Add(kDependsOn##type);
7593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  GVN_FLAG_LIST(ADD_FLAG)
7603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#undef ADD_FLAG
7613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return result;
7623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
7633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  static GVNFlagSet AllChangesFlagSet() {
7653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    GVNFlagSet result;
7663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // Create changes mask.
7673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#define ADD_FLAG(type) result.Add(kChanges##type);
768589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  GVN_FLAG_LIST(ADD_FLAG)
769589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch#undef ADD_FLAG
770589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    return result;
771589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  }
772589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
7731e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  // A flag mask to mark an instruction as having arbitrary side effects.
7743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  static GVNFlagSet AllSideEffectsFlagSet() {
7753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    GVNFlagSet result = AllChangesFlagSet();
7763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    result.Remove(kChangesOsrEntries);
7773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return result;
7783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
7793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // A flag mask of all side effects that can make observable changes in
7813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // an executing program (i.e. are not safe to repeat, move or remove);
7823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  static GVNFlagSet AllObservableSideEffectsFlagSet() {
7833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    GVNFlagSet result = AllChangesFlagSet();
7843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    result.Remove(kChangesElementsKind);
7853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    result.Remove(kChangesElementsPointer);
7863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    result.Remove(kChangesMaps);
7873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return result;
788592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  }
789592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
790257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // Remove the matching use from the use list if present.  Returns the
791257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // removed list node or NULL.
792257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HUseListNode* RemoveUse(HValue* value, int index);
793257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
794b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void RegisterUse(int index, HValue* new_value);
795b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
796b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HBasicBlock* block_;
797b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
798b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // The id of this instruction in the hydrogen graph, assigned when first
799b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // added to the graph. Reflects creation order.
800b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int id_;
801b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
802b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Representation representation_;
803b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HType type_;
804257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HUseListNode* use_list_;
805b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Range* range_;
806b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int flags_;
8073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  GVNFlagSet gvn_flags_;
808b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
8093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private:
810b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(HValue);
811b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
812b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
813b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
814b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HInstruction: public HValue {
815b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
816b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HInstruction* next() const { return next_; }
817b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HInstruction* previous() const { return previous_; }
818b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
819e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintTo(StringStream* stream);
820e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream) { }
821b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
822b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool IsLinked() const { return block() != NULL; }
823b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void Unlink();
824b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void InsertBefore(HInstruction* next);
825b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void InsertAfter(HInstruction* previous);
826b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
827b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int position() const { return position_; }
828b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool has_position() const { return position_ != RelocInfo::kNoPosition; }
829b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void set_position(int position) { position_ = position; }
830b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
8313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool CanTruncateToInt32() const { return CheckFlag(kTruncatingToInt32); }
8323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
833b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual LInstruction* CompileToLithium(LChunkBuilder* builder) = 0;
834b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
835b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG
8361e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  virtual void Verify();
837b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif
838b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
839e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool IsCall() { return false; }
840e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
841257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_ABSTRACT_INSTRUCTION(Instruction)
842b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
843b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
844b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HInstruction()
845b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      : next_(NULL),
846b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        previous_(NULL),
847b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        position_(RelocInfo::kNoPosition) {
8483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    SetGVNFlag(kDependsOnOsrEntries);
849b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
850b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
851b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual void DeleteFromGraph() { Unlink(); }
852b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
853b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
854b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void InitializeAsFirst(HBasicBlock* block) {
855b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(!IsLinked());
856b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetBlock(block);
857b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
858b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
859257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  void PrintMnemonicTo(StringStream* stream);
860257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
861b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HInstruction* next_;
862b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HInstruction* previous_;
863b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int position_;
864b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
865b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  friend class HBasicBlock;
866b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
867b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
868b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
8693fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochtemplate<int V>
8703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HTemplateInstruction : public HInstruction {
871b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
8723fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  int OperandCount() { return V; }
8733fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* OperandAt(int i) { return inputs_[i]; }
874b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
8753fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch protected:
8763fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  void InternalSetOperandAt(int i, HValue* value) { inputs_[i] = value; }
8771e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
8781e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block private:
8793fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  EmbeddedContainer<HValue*, V> inputs_;
880b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
881b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
882b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
8833fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HControlInstruction: public HInstruction {
884b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
8853fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  virtual HBasicBlock* SuccessorAt(int i) = 0;
8863fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  virtual int SuccessorCount() = 0;
8873fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  virtual void SetSuccessorAt(int i, HBasicBlock* block) = 0;
888e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
8893fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  virtual void PrintDataTo(StringStream* stream);
8903fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
8913fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HBasicBlock* FirstSuccessor() {
8923fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return SuccessorCount() > 0 ? SuccessorAt(0) : NULL;
8933fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
8943fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HBasicBlock* SecondSuccessor() {
8953fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return SuccessorCount() > 1 ? SuccessorAt(1) : NULL;
896e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
897e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
8983fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_ABSTRACT_INSTRUCTION(ControlInstruction)
899e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch};
900e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
901e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
9023fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HSuccessorIterator BASE_EMBEDDED {
903e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch public:
9043fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  explicit HSuccessorIterator(HControlInstruction* instr)
9053fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : instr_(instr), current_(0) { }
906e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
9073fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  bool Done() { return current_ >= instr_->SuccessorCount(); }
9083fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HBasicBlock* Current() { return instr_->SuccessorAt(current_); }
9093fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  void Advance() { current_++; }
910e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
911e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch private:
9123fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HControlInstruction* instr_;
9133fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  int current_;
914e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch};
915e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
916e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
9173fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochtemplate<int S, int V>
9183fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HTemplateControlInstruction: public HControlInstruction {
919e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch public:
9203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  int SuccessorCount() { return S; }
9213fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HBasicBlock* SuccessorAt(int i) { return successors_[i]; }
9223fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  void SetSuccessorAt(int i, HBasicBlock* block) { successors_[i] = block; }
9233fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
924e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  int OperandCount() { return V; }
925e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* OperandAt(int i) { return inputs_[i]; }
926e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
9273fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
928e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch protected:
929e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  void InternalSetOperandAt(int i, HValue* value) { inputs_[i] = value; }
930e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
931e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch private:
9323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  EmbeddedContainer<HBasicBlock*, S> successors_;
9333fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  EmbeddedContainer<HValue*, V> inputs_;
934e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch};
935e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
936e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
937e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HBlockEntry: public HTemplateInstruction<0> {
938e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch public:
9393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
940e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
941e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
942e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
943257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(BlockEntry)
944e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch};
945e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
946e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
9473fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// We insert soft-deoptimize when we hit code with unknown typefeedback,
9483fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// so that we get a chance of re-optimizing with useful typefeedback.
9493fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// HSoftDeoptimize does not end a basic block as opposed to HDeoptimize.
9503fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HSoftDeoptimize: public HTemplateInstruction<0> {
9513fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch public:
9523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
9533fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return Representation::None();
9543fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
9553fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
9563fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(SoftDeoptimize)
9573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch};
9583fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
9593fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
96044f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass HDeoptimize: public HControlInstruction {
961e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch public:
9623fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  explicit HDeoptimize(int environment_length) : values_(environment_length) { }
963e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
9643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
965e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
966e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
9671e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
96844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual int OperandCount() { return values_.length(); }
96944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual HValue* OperandAt(int index) { return values_[index]; }
9703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  virtual void PrintDataTo(StringStream* stream);
9713fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
9723fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  virtual int SuccessorCount() { return 0; }
9733fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  virtual HBasicBlock* SuccessorAt(int i) {
9743fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    UNREACHABLE();
9753fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return NULL;
9763fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
9773fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  virtual void SetSuccessorAt(int i, HBasicBlock* block) {
9783fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    UNREACHABLE();
9793fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
98044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
98144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void AddEnvironmentValue(HValue* value) {
98244f0eee88ff00398ff7f715fab053374d808c90dSteve Block    values_.Add(NULL);
98344f0eee88ff00398ff7f715fab053374d808c90dSteve Block    SetOperandAt(values_.length() - 1, value);
98444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
98544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
986257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Deoptimize)
987257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
988257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  enum UseEnvironment {
989257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    kNoUses,
990257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    kUseAll
991257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  };
99244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
99344f0eee88ff00398ff7f715fab053374d808c90dSteve Block protected:
99444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual void InternalSetOperandAt(int index, HValue* value) {
99544f0eee88ff00398ff7f715fab053374d808c90dSteve Block    values_[index] = value;
99644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
99744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
99844f0eee88ff00398ff7f715fab053374d808c90dSteve Block private:
99944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ZoneList<HValue*> values_;
1000b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1001b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1002b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
10033fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HGoto: public HTemplateControlInstruction<1, 0> {
1004b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
10053fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  explicit HGoto(HBasicBlock* target) {
10063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    SetSuccessorAt(0, target);
10073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
1008b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
10093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
1010e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
1011e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1012e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1013589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  virtual void PrintDataTo(StringStream* stream);
1014589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
1015257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Goto)
1016b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1017b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1018b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
10193fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HUnaryControlInstruction: public HTemplateControlInstruction<2, 1> {
1020b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
10213fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HUnaryControlInstruction(HValue* value,
10223fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch                           HBasicBlock* true_target,
10233fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch                           HBasicBlock* false_target) {
1024b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetOperandAt(0, value);
10253fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetSuccessorAt(0, true_target);
10263fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetSuccessorAt(1, false_target);
1027b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1028b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1029e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
1030b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1031e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* value() { return OperandAt(0); }
1032b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1033b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1034b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
10353fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HBranch: public HUnaryControlInstruction {
1036b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
103769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  HBranch(HValue* value,
103869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch          HBasicBlock* true_target,
103969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch          HBasicBlock* false_target,
104069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch          ToBooleanStub::Types expected_input_types = ToBooleanStub::no_types())
104169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch      : HUnaryControlInstruction(value, true_target, false_target),
104269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch        expected_input_types_(expected_input_types) {
10431e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    ASSERT(true_target != NULL && false_target != NULL);
1044b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
10453fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  explicit HBranch(HValue* value)
10463fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : HUnaryControlInstruction(value, NULL, NULL) { }
10473fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1048b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
10493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
1050b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return Representation::None();
1051b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1052b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
105369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  ToBooleanStub::Types expected_input_types() const {
105469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    return expected_input_types_;
105569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  }
105669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
10573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Branch)
105869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
105969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch private:
106069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  ToBooleanStub::Types expected_input_types_;
1061b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1062b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1063b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
10641e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HCompareMap: public HUnaryControlInstruction {
1065b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
10661e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HCompareMap(HValue* value,
10671e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block              Handle<Map> map,
10681e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block              HBasicBlock* true_target,
10691e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block              HBasicBlock* false_target)
10701e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      : HUnaryControlInstruction(value, true_target, false_target),
10711e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block        map_(map) {
10721e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    ASSERT(true_target != NULL);
10731e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    ASSERT(false_target != NULL);
1074b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(!map.is_null());
1075b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1076b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1077e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
1078b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1079b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<Map> map() const { return map_; }
1080b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
10813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
1082e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::Tagged();
1083e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1084e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1085257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CompareMap)
1086b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1087b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
1088b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<Map> map_;
1089b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1090b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1091b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
10923fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HReturn: public HTemplateControlInstruction<0, 1> {
1093b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
10943fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  explicit HReturn(HValue* value) {
10953fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(0, value);
10961e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
1097b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
10983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
1099e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::Tagged();
1100e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1101e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
11023fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  virtual void PrintDataTo(StringStream* stream);
11033fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
11043fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* value() { return OperandAt(0); }
11053fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1106257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Return)
1107b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1108b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1109b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
11103fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HAbnormalExit: public HTemplateControlInstruction<0, 0> {
1111b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
11123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
1113e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
1114e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1115b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1116257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(AbnormalExit)
1117b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1118b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1119b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1120e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HUnaryOperation: public HTemplateInstruction<1> {
1121b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
1122b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  explicit HUnaryOperation(HValue* value) {
1123b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetOperandAt(0, value);
1124b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1125b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
11263fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  static HUnaryOperation* cast(HValue* value) {
11273fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return reinterpret_cast<HUnaryOperation*>(value);
11283fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
11293fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1130e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* value() { return OperandAt(0); }
1131e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
1132b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1133b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1134b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
11353fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HThrow: public HTemplateInstruction<2> {
11361e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public:
11373fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HThrow(HValue* context, HValue* value) {
11383fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(0, context);
11393fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(1, value);
11401e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetAllSideEffects();
11411e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
11421e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
11433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
11441e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return Representation::Tagged();
11451e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
11461e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
11473fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* context() { return OperandAt(0); }
11483fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* value() { return OperandAt(1); }
11493fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1150257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Throw)
1151257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
1152257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1153257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
11543fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HUseConst: public HUnaryOperation {
11553fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch public:
11563fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  explicit HUseConst(HValue* old_value) : HUnaryOperation(old_value) { }
11573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
11583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
11593fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return Representation::None();
11603fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
11613fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
11623fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(UseConst)
11633fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch};
11643fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
11653fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1166257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochclass HForceRepresentation: public HTemplateInstruction<1> {
1167257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public:
1168257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HForceRepresentation(HValue* value, Representation required_representation) {
1169257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    SetOperandAt(0, value);
1170257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    set_representation(required_representation);
1171257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
1172257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1173257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HValue* value() { return OperandAt(0); }
1174257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1175257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited);
1176257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
11773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
1178257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return representation();  // Same as the output representation.
1179257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
1180257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1181257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(ForceRepresentation)
11821e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block};
11831e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
11841e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1185b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HChange: public HUnaryOperation {
1186b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
1187b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HChange(HValue* value,
1188e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch          Representation to,
11897d3e7fc4b65010eabe860313ee0c64f50843f6e3Ben Murdoch          bool is_truncating,
11907d3e7fc4b65010eabe860313ee0c64f50843f6e3Ben Murdoch          bool deoptimize_on_undefined)
11913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      : HUnaryOperation(value) {
11923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    ASSERT(!value->representation().IsNone() && !to.IsNone());
11933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    ASSERT(!value->representation().Equals(to));
1194b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(to);
11953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    set_type(HType::TaggedNumber());
1196b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kUseGVN);
11973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (deoptimize_on_undefined) SetFlag(kDeoptimizeOnUndefined);
1198e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    if (is_truncating) SetFlag(kTruncatingToInt32);
1199b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1200b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1201b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited);
12023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual HType CalculateInferredType();
12033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual HValue* Canonicalize();
1204b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
12053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Representation from() { return value()->representation(); }
12063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Representation to() { return representation(); }
12073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool deoptimize_on_undefined() const {
12083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return CheckFlag(kDeoptimizeOnUndefined);
12093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
12103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool deoptimize_on_minus_zero() const {
12113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return CheckFlag(kBailoutOnMinusZero);
12123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
12133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
12143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return from();
1215b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1216b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
12173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Range* InferRange(Zone* zone);
121869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
1219e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
1220b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1221257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Change)
1222b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1223b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
12243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
1225b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1226b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1227b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1228257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochclass HClampToUint8: public HUnaryOperation {
1229257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public:
1230257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  explicit HClampToUint8(HValue* value)
12313fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : HUnaryOperation(value) {
12323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    set_representation(Representation::Integer32());
1233257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    SetFlag(kUseGVN);
1234257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
1235257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
12363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
12373fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return Representation::None();
1238257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
1239257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
12403fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(ClampToUint8)
12413fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
12423fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch protected:
12433fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  virtual bool DataEquals(HValue* other) { return true; }
12443fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch};
12453fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
12463fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1247b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HSimulate: public HInstruction {
1248b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
12498b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  HSimulate(int ast_id, int pop_count)
1250b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      : ast_id_(ast_id),
1251b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        pop_count_(pop_count),
1252b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        values_(2),
1253b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        assigned_indexes_(2) {}
1254b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual ~HSimulate() {}
1255b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1256e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
1257b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1258b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool HasAstId() const { return ast_id_ != AstNode::kNoNumber; }
1259b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int ast_id() const { return ast_id_; }
1260b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void set_ast_id(int id) {
1261b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(!HasAstId());
1262b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ast_id_ = id;
1263b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1264b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1265b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int pop_count() const { return pop_count_; }
1266b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  const ZoneList<HValue*>* values() const { return &values_; }
1267b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int GetAssignedIndexAt(int index) const {
1268b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(HasAssignedIndexAt(index));
1269b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return assigned_indexes_[index];
1270b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1271b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool HasAssignedIndexAt(int index) const {
1272b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return assigned_indexes_[index] != kNoIndex;
1273b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1274b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void AddAssignedValue(int index, HValue* value) {
1275b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    AddValue(index, value);
1276b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1277b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void AddPushedValue(HValue* value) {
1278b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    AddValue(kNoIndex, value);
1279b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1280e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual int OperandCount() { return values_.length(); }
1281e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual HValue* OperandAt(int index) { return values_[index]; }
1282e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
12833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
1284e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
1285e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1286b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1287257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Simulate)
1288b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1289b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG
12901e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  virtual void Verify();
1291b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif
1292b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1293b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
1294b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual void InternalSetOperandAt(int index, HValue* value) {
1295b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    values_[index] = value;
1296b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1297b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1298b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
1299b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static const int kNoIndex = -1;
1300b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void AddValue(int index, HValue* value) {
1301b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    assigned_indexes_.Add(index);
1302b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // Resize the list of pushed values.
1303b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    values_.Add(NULL);
1304b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // Set the operand through the base method in HValue to make sure that the
1305b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // use lists are correctly updated.
1306b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetOperandAt(values_.length() - 1, value);
1307b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1308b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int ast_id_;
1309b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int pop_count_;
1310b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ZoneList<HValue*> values_;
1311b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ZoneList<int> assigned_indexes_;
1312b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1313b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1314b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
13153fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HStackCheck: public HTemplateInstruction<1> {
1316b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
13173fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  enum Type {
13183fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    kFunctionEntry,
13193fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    kBackwardsBranch
13203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  };
13213fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
13223fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HStackCheck(HValue* context, Type type) : type_(type) {
13233fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(0, context);
13243fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
13253fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
13263fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* context() { return OperandAt(0); }
1327b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
13283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
13293fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return Representation::Tagged();
1330e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1331e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
13323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  void Eliminate() {
13333fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    // The stack check eliminator might try to eliminate the same stack
13343fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    // check instruction multiple times.
13353fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    if (IsLinked()) {
13363fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      DeleteFromGraph();
13373fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    }
13383fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
13393fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
13403fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  bool is_function_entry() { return type_ == kFunctionEntry; }
13413fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  bool is_backwards_branch() { return type_ == kBackwardsBranch; }
13423fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1343257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(StackCheck)
13443fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
13453fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch private:
13463fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  Type type_;
1347b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1348b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1349b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1350e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HEnterInlined: public HTemplateInstruction<0> {
1351b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
1352257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HEnterInlined(Handle<JSFunction> closure,
13533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                int arguments_count,
1354257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch                FunctionLiteral* function,
13553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                CallKind call_kind,
13563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                bool is_construct,
13573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                Variable* arguments)
1358257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      : closure_(closure),
13593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        arguments_count_(arguments_count),
1360257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        function_(function),
13613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        call_kind_(call_kind),
13623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        is_construct_(is_construct),
13633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        arguments_(arguments) {
1364b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1365b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1366e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
1367b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1368b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<JSFunction> closure() const { return closure_; }
13693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  int arguments_count() const { return arguments_count_; }
1370b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  FunctionLiteral* function() const { return function_; }
1371257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  CallKind call_kind() const { return call_kind_; }
13723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool is_construct() const { return is_construct_; }
1373b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
13743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
1375e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
1376e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1377e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
13783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Variable* arguments() { return arguments_; }
13793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1380257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(EnterInlined)
1381b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1382b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
1383b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<JSFunction> closure_;
13843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  int arguments_count_;
1385b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  FunctionLiteral* function_;
1386257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  CallKind call_kind_;
13873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool is_construct_;
13883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Variable* arguments_;
1389b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1390b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1391b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1392e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HLeaveInlined: public HTemplateInstruction<0> {
1393b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
1394b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HLeaveInlined() {}
1395b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
13963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
1397e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
1398e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1399e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1400257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(LeaveInlined)
1401b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1402b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1403b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1404b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HPushArgument: public HUnaryOperation {
1405b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
1406e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  explicit HPushArgument(HValue* value) : HUnaryOperation(value) {
1407e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    set_representation(Representation::Tagged());
1408e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1409b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
14103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
1411b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return Representation::Tagged();
1412b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1413b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1414e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* argument() { return OperandAt(0); }
1415b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1416257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(PushArgument)
14171e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block};
1418b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
14191e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
14203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HThisFunction: public HTemplateInstruction<0> {
14213fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch public:
14223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  explicit HThisFunction(Handle<JSFunction> closure) : closure_(closure) {
14233fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    set_representation(Representation::Tagged());
14243fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetFlag(kUseGVN);
14253fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
14263fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
14273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
14283fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return Representation::None();
14293fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
14303fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
14313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Handle<JSFunction> closure() const { return closure_; }
14323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
14333fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(ThisFunction)
14343fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
14353fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch protected:
14363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual bool DataEquals(HValue* other) {
14373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HThisFunction* b = HThisFunction::cast(other);
14383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return *closure() == *b->closure();
14393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
14403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
14413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private:
14423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Handle<JSFunction> closure_;
14433fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch};
14443fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
14453fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1446e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HContext: public HTemplateInstruction<0> {
14471e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public:
14481e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HContext() {
14491e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    set_representation(Representation::Tagged());
14501e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetFlag(kUseGVN);
14511e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
14521e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
14533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
1454e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
1455e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1456e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
14573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Context)
14581e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
14591e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
1460e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
1461b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1462b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1463b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
14641e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HOuterContext: public HUnaryOperation {
1465b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
14661e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  explicit HOuterContext(HValue* inner) : HUnaryOperation(inner) {
14671e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    set_representation(Representation::Tagged());
14681e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetFlag(kUseGVN);
14691e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
14701e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1471257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(OuterContext);
14721e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
14733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
1474e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::Tagged();
1475e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1476e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
14771e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
1478e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
14791e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block};
14801e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
14811e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
14823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass HDeclareGlobals: public HUnaryOperation {
14833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
14843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HDeclareGlobals(HValue* context,
14853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                  Handle<FixedArray> pairs,
14863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                  int flags)
14873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      : HUnaryOperation(context),
14883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        pairs_(pairs),
14893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        flags_(flags) {
14903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    set_representation(Representation::Tagged());
14913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    SetAllSideEffects();
14923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
14933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
14943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HValue* context() { return OperandAt(0); }
14953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Handle<FixedArray> pairs() const { return pairs_; }
14963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  int flags() const { return flags_; }
14973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
14983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(DeclareGlobals)
14993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
15003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
15013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return Representation::Tagged();
15023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
15033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private:
15043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Handle<FixedArray> pairs_;
15053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  int flags_;
15063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
15073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
15083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
15091e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HGlobalObject: public HUnaryOperation {
15101e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public:
15111e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  explicit HGlobalObject(HValue* context) : HUnaryOperation(context) {
1512b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
1513b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kUseGVN);
1514b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1515b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1516257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(GlobalObject)
15171e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
15183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
1519e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::Tagged();
1520e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1521e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
15221e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
1523e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
1524b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1525b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1526b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
15271e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HGlobalReceiver: public HUnaryOperation {
1528b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
15291e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  explicit HGlobalReceiver(HValue* global_object)
15301e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      : HUnaryOperation(global_object) {
1531b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
1532b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kUseGVN);
1533b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1534b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1535257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(GlobalReceiver)
15361e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
15373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
1538e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::Tagged();
1539e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1540e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
15411e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
1542e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
1543b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1544b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1545b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1546e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochtemplate <int V>
1547e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HCall: public HTemplateInstruction<V> {
1548b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
15491e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  // The argument count includes the receiver.
1550e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  explicit HCall<V>(int argument_count) : argument_count_(argument_count) {
1551e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    this->set_representation(Representation::Tagged());
1552e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    this->SetAllSideEffects();
15531e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
1554b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1555e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual HType CalculateInferredType() { return HType::Tagged(); }
1556b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
15571e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  virtual int argument_count() const { return argument_count_; }
15581e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1559e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool IsCall() { return true; }
15601e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
15611e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block private:
15621e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  int argument_count_;
15631e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block};
15641e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
15651e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1566e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HUnaryCall: public HCall<1> {
15671e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public:
15681e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HUnaryCall(HValue* value, int argument_count)
1569e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      : HCall<1>(argument_count) {
15701e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetOperandAt(0, value);
15711e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
15721e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
15733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
1574e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::Tagged();
1575b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
15761e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1577e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
15781e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1579e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* value() { return OperandAt(0); }
15801e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block};
15811e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
15821e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1583e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HBinaryCall: public HCall<2> {
15841e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public:
15851e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HBinaryCall(HValue* first, HValue* second, int argument_count)
1586e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      : HCall<2>(argument_count) {
15871e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetOperandAt(0, first);
15881e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetOperandAt(1, second);
1589b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1590b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1591e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
1592b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
15933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
1594e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::Tagged();
1595e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
15961e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1597e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* first() { return OperandAt(0); }
1598e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* second() { return OperandAt(1); }
1599257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
1600257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
16011e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1602257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochclass HInvokeFunction: public HBinaryCall {
1603257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public:
1604257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HInvokeFunction(HValue* context, HValue* function, int argument_count)
1605257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      : HBinaryCall(context, function, argument_count) {
1606257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
1607257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
16083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
1609257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return Representation::Tagged();
1610257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
1611257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1612257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HValue* context() { return first(); }
1613257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HValue* function() { return second(); }
1614257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1615257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(InvokeFunction)
1616b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1617b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1618b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1619e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HCallConstantFunction: public HCall<0> {
1620b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
1621b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HCallConstantFunction(Handle<JSFunction> function, int argument_count)
1622e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      : HCall<0>(argument_count), function_(function) { }
1623b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1624b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<JSFunction> function() const { return function_; }
16251e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1626b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool IsApplyFunction() const {
162744f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return function_->code() ==
162844f0eee88ff00398ff7f715fab053374d808c90dSteve Block        Isolate::Current()->builtins()->builtin(Builtins::kFunctionApply);
1629b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1630b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1631e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
1632e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
16333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
1634e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
1635e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1636b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1637257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CallConstantFunction)
1638b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1639b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
1640b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<JSFunction> function_;
1641b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1642b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1643b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
16441e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HCallKeyed: public HBinaryCall {
1645b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
16461e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HCallKeyed(HValue* context, HValue* key, int argument_count)
16471e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      : HBinaryCall(context, key, argument_count) {
1648b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1649b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
16503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
1651b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return Representation::Tagged();
1652b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1653b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1654e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* context() { return first(); }
1655e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* key() { return second(); }
1656b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1657257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CallKeyed)
1658b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1659b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1660b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
16611e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HCallNamed: public HUnaryCall {
1662b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
16631e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HCallNamed(HValue* context, Handle<String> name, int argument_count)
16641e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      : HUnaryCall(context, argument_count), name_(name) {
16651e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
16661e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1667e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
1668b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1669e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* context() { return value(); }
1670b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<String> name() const { return name_; }
1671b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1672257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CallNamed)
1673b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
16743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
1675e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::Tagged();
1676e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1677e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1678b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
1679b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<String> name_;
1680b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1681b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1682b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
16833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass HCallFunction: public HBinaryCall {
1684b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
16853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HCallFunction(HValue* context, HValue* function, int argument_count)
16863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      : HBinaryCall(context, function, argument_count) {
16871e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
16881e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
16893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HValue* context() { return first(); }
16903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HValue* function() { return second(); }
1691e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
16923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
1693e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::Tagged();
1694e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1695b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1696257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CallFunction)
1697b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1698b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1699b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
17001e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HCallGlobal: public HUnaryCall {
1701b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
17021e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HCallGlobal(HValue* context, Handle<String> name, int argument_count)
17031e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      : HUnaryCall(context, argument_count), name_(name) {
17041e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
1705b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1706e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
1707b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1708e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* context() { return value(); }
1709b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<String> name() const { return name_; }
1710b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
17113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
1712e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::Tagged();
1713e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1714e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1715257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CallGlobal)
1716b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1717b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
1718b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<String> name_;
1719b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1720b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1721b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1722e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HCallKnownGlobal: public HCall<0> {
1723b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
17241e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HCallKnownGlobal(Handle<JSFunction> target, int argument_count)
1725e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      : HCall<0>(argument_count), target_(target) { }
1726b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1727e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
17281e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1729b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<JSFunction> target() const { return target_; }
1730b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
17313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
1732e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
1733e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1734e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1735257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CallKnownGlobal)
1736b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1737b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
1738b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<JSFunction> target_;
1739b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1740b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1741b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
17421e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HCallNew: public HBinaryCall {
1743b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
17441e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HCallNew(HValue* context, HValue* constructor, int argument_count)
17451e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      : HBinaryCall(context, constructor, argument_count) {
17461e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
1747b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
17483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
1749b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return Representation::Tagged();
1750b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1751b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1752e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* context() { return first(); }
1753e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* constructor() { return second(); }
1754b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1755257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CallNew)
1756b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1757b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1758b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
17593fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HCallRuntime: public HCall<1> {
1760b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
17613fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HCallRuntime(HValue* context,
17623fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch               Handle<String> name,
176344f0eee88ff00398ff7f715fab053374d808c90dSteve Block               const Runtime::Function* c_function,
1764b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch               int argument_count)
17653fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : HCall<1>(argument_count), c_function_(c_function), name_(name) {
17663fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(0, context);
17673fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
17683fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1769e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
1770b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
17713fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* context() { return OperandAt(0); }
177244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  const Runtime::Function* function() const { return c_function_; }
1773b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<String> name() const { return name_; }
1774b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
17753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
17763fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return Representation::Tagged();
1777e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1778e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1779257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CallRuntime)
1780b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1781b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
178244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  const Runtime::Function* c_function_;
1783b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<String> name_;
1784b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1785b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1786b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
178769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochclass HJSArrayLength: public HTemplateInstruction<2> {
1788b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
178969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  HJSArrayLength(HValue* value, HValue* typecheck) {
1790b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // The length of an array is stored as a tagged value in the array
1791b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // object. It is guaranteed to be 32 bit integer, but it can be
1792b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // represented as either a smi or heap number.
179369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    SetOperandAt(0, value);
179469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    SetOperandAt(1, typecheck);
1795b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
1796b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kUseGVN);
17973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    SetGVNFlag(kDependsOnArrayLengths);
17983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    SetGVNFlag(kDependsOnMaps);
1799b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1800b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
18013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
1802b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return Representation::Tagged();
1803b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1804b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1805589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  virtual void PrintDataTo(StringStream* stream);
1806589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
180769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  HValue* value() { return OperandAt(0); }
1808589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  HValue* typecheck() { return OperandAt(1); }
180969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
1810257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(JSArrayLength)
18111e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
18121e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
1813e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
18149fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block};
18159fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block
18169fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block
181769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochclass HFixedArrayBaseLength: public HUnaryOperation {
18189fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block public:
181969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  explicit HFixedArrayBaseLength(HValue* value) : HUnaryOperation(value) {
18209fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block    set_representation(Representation::Tagged());
18219fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block    SetFlag(kUseGVN);
18223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    SetGVNFlag(kDependsOnArrayLengths);
18239fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block  }
18249fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block
18253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
18269fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block    return Representation::Tagged();
18279fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block  }
18289fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block
182969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(FixedArrayBaseLength)
18301e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
18311e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
1832e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
1833b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1834b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1835b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
18363fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HElementsKind: public HUnaryOperation {
18373fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch public:
18383fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  explicit HElementsKind(HValue* value) : HUnaryOperation(value) {
18393fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    set_representation(Representation::Integer32());
18403fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetFlag(kUseGVN);
18413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    SetGVNFlag(kDependsOnElementsKind);
18423fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
18433fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
18443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
18453fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return Representation::Tagged();
18463fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
18473fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
18483fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(ElementsKind)
18493fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
18503fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch protected:
18513fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  virtual bool DataEquals(HValue* other) { return true; }
18523fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch};
18533fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
18543fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1855b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HBitNot: public HUnaryOperation {
1856b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
1857b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  explicit HBitNot(HValue* value) : HUnaryOperation(value) {
1858b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Integer32());
1859b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kUseGVN);
1860b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kTruncatingToInt32);
1861b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1862b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
18633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
1864b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return Representation::Integer32();
1865b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1866e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual HType CalculateInferredType();
1867b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1868257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(BitNot)
18691e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
18701e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
1871e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
1872b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1873b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1874b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
18753fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HUnaryMathOperation: public HTemplateInstruction<2> {
1876b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
18773fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HUnaryMathOperation(HValue* context, HValue* value, BuiltinFunctionId op)
18783fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : op_(op) {
18793fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(0, context);
18803fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(1, value);
1881b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    switch (op) {
1882b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      case kMathFloor:
1883b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      case kMathRound:
1884b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      case kMathCeil:
1885b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        set_representation(Representation::Integer32());
1886b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        break;
1887b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      case kMathAbs:
1888b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        set_representation(Representation::Tagged());
1889b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        SetFlag(kFlexibleRepresentation);
1890b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        break;
1891b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      case kMathSqrt:
1892b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      case kMathPowHalf:
1893b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      case kMathLog:
1894b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      case kMathSin:
1895b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      case kMathCos:
18963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      case kMathTan:
1897b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        set_representation(Representation::Double());
1898b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        break;
1899b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      default:
1900b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        UNREACHABLE();
1901b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
1902b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kUseGVN);
1903b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1904b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
19053fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* context() { return OperandAt(0); }
19063fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* value() { return OperandAt(1); }
19073fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1908e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
1909b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1910e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual HType CalculateInferredType();
1911b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1912b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited);
1913b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
19143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
19153fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    if (index == 0) {
19163fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      return Representation::Tagged();
19173fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    } else {
19183fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      switch (op_) {
19193fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        case kMathFloor:
19203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        case kMathRound:
19213fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        case kMathCeil:
19223fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        case kMathSqrt:
19233fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        case kMathPowHalf:
19243fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        case kMathLog:
19253fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        case kMathSin:
19263fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        case kMathCos:
19273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        case kMathTan:
19283fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch          return Representation::Double();
19293fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        case kMathAbs:
19303fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch          return representation();
19313fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        default:
19323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch          UNREACHABLE();
19333fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch          return Representation::None();
19343fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      }
1935b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
1936b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1937b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1938b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual HValue* Canonicalize() {
1939b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // If the input is integer32 then we replace the floor instruction
1940b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // with its inputs.  This happens before the representation changes are
1941b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // introduced.
1942b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (op() == kMathFloor) {
1943b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      if (value()->representation().IsInteger32()) return value();
1944b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
1945b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return this;
1946b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1947b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1948b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  BuiltinFunctionId op() const { return op_; }
1949b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  const char* OpName() const;
1950b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1951257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(UnaryMathOperation)
1952b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1953b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
1954e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) {
1955b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    HUnaryMathOperation* b = HUnaryMathOperation::cast(other);
1956b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return op_ == b->op();
1957b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1958b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1959b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
1960b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  BuiltinFunctionId op_;
1961b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1962b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1963b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1964b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HLoadElements: public HUnaryOperation {
1965b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
1966b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  explicit HLoadElements(HValue* value) : HUnaryOperation(value) {
1967b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
1968b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kUseGVN);
19693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    SetGVNFlag(kDependsOnElementsPointer);
1970b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1971b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
19723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
1973b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return Representation::Tagged();
1974b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1975b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1976257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(LoadElements)
19771e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
19781e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
1979e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
19801e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block};
19811e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
19821e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
198344f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass HLoadExternalArrayPointer: public HUnaryOperation {
19841e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public:
198544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  explicit HLoadExternalArrayPointer(HValue* value)
19861e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      : HUnaryOperation(value) {
19871e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    set_representation(Representation::External());
19881e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    // The result of this instruction is idempotent as long as its inputs don't
198944f0eee88ff00398ff7f715fab053374d808c90dSteve Block    // change.  The external array of a specialized array elements object cannot
19901e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    // change once set, so it's no necessary to introduce any additional
19911e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    // dependencies on top of the inputs.
19921e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetFlag(kUseGVN);
19931e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
19941e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
19953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
19961e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return Representation::Tagged();
19971e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
19981e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1999257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(LoadExternalArrayPointer)
20001e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
20011e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
2002e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
2003b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2004b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2005b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
200669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochclass HCheckMap: public HTemplateInstruction<2> {
2007b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
20083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HCheckMap(HValue* value,
20093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch            Handle<Map> map,
20103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch            HValue* typecheck = NULL,
20113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch            CompareMapMode mode = REQUIRE_EXACT_MAP)
20123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      : map_(map),
20133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        mode_(mode) {
201469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    SetOperandAt(0, value);
201569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    // If callers don't depend on a typecheck, they can pass in NULL. In that
201669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    // case we use a copy of the |value| argument as a dummy value.
201769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    SetOperandAt(1, typecheck != NULL ? typecheck : value);
2018b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
2019b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kUseGVN);
20203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    SetGVNFlag(kDependsOnMaps);
20213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // If the map to check doesn't have the untransitioned elements, it must not
20223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // be hoisted above TransitionElements instructions.
20233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (mode == REQUIRE_EXACT_MAP || !map->has_fast_smi_only_elements()) {
20243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      SetGVNFlag(kDependsOnElementsKind);
20253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
20263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    has_element_transitions_ =
20273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        map->LookupElementsTransitionMap(FAST_DOUBLE_ELEMENTS, NULL) != NULL ||
20283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        map->LookupElementsTransitionMap(FAST_ELEMENTS, NULL) != NULL;
2029b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2030b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
20313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
2032b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return Representation::Tagged();
2033b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2034e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
2035e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual HType CalculateInferredType();
2036b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
203769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  HValue* value() { return OperandAt(0); }
2038b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<Map> map() const { return map_; }
20393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CompareMapMode mode() const { return mode_; }
2040b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2041257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CheckMap)
2042b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2043b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
2044e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) {
2045b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    HCheckMap* b = HCheckMap::cast(other);
20463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // Two CheckMaps instructions are DataEqual if their maps are identical and
20473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // they have the same mode. The mode comparison can be ignored if the map
20483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // has no elements transitions.
20493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return map_.is_identical_to(b->map()) &&
20503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        (b->mode() == mode() || !has_element_transitions_);
2051b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2052b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2053b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
20543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool has_element_transitions_;
2055b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<Map> map_;
20563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CompareMapMode mode_;
2057b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2058b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2059b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2060b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HCheckFunction: public HUnaryOperation {
2061b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
2062b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HCheckFunction(HValue* value, Handle<JSFunction> function)
2063b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      : HUnaryOperation(value), target_(function) {
2064b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
2065b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kUseGVN);
2066b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2067b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
20683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
2069b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return Representation::Tagged();
2070b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2071e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
2072e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual HType CalculateInferredType();
2073b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2074b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG
20751e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  virtual void Verify();
2076b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif
2077b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2078b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<JSFunction> target() const { return target_; }
2079b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2080257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CheckFunction)
2081b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2082b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
2083e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) {
2084b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    HCheckFunction* b = HCheckFunction::cast(other);
2085b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return target_.is_identical_to(b->target());
2086b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2087b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2088b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
2089b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<JSFunction> target_;
2090b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2091b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2092b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2093b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HCheckInstanceType: public HUnaryOperation {
2094b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
20953fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  static HCheckInstanceType* NewIsSpecObject(HValue* value) {
20963fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return new HCheckInstanceType(value, IS_SPEC_OBJECT);
2097257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
2098257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  static HCheckInstanceType* NewIsJSArray(HValue* value) {
2099257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return new HCheckInstanceType(value, IS_JS_ARRAY);
2100257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
2101257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  static HCheckInstanceType* NewIsString(HValue* value) {
2102257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return new HCheckInstanceType(value, IS_STRING);
2103257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
2104257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  static HCheckInstanceType* NewIsSymbol(HValue* value) {
2105257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return new HCheckInstanceType(value, IS_SYMBOL);
2106b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2107b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
21083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual void PrintDataTo(StringStream* stream);
21093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
2111b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return Representation::Tagged();
2112b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2113b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
21143fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  virtual HValue* Canonicalize();
2115b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2116257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  bool is_interval_check() const { return check_ <= LAST_INTERVAL_CHECK; }
2117257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  void GetCheckInterval(InstanceType* first, InstanceType* last);
2118257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  void GetCheckMaskAndTag(uint8_t* mask, uint8_t* tag);
2119b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2120257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CheckInstanceType)
2121b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2122b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
2123b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // TODO(ager): It could be nice to allow the ommision of instance
2124b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // type checks if we have already performed an instance type check
2125b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // with a larger range.
2126e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) {
2127b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    HCheckInstanceType* b = HCheckInstanceType::cast(other);
2128257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return check_ == b->check_;
2129b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2130b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2131b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
2132257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  enum Check {
21333fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    IS_SPEC_OBJECT,
2134257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    IS_JS_ARRAY,
2135257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    IS_STRING,
2136257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    IS_SYMBOL,
2137257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    LAST_INTERVAL_CHECK = IS_JS_ARRAY
2138257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  };
2139257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
21403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  const char* GetCheckName();
21413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2142257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HCheckInstanceType(HValue* value, Check check)
2143257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      : HUnaryOperation(value), check_(check) {
2144257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    set_representation(Representation::Tagged());
2145257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    SetFlag(kUseGVN);
2146257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
2147257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2148257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  const Check check_;
2149b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2150b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2151b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2152b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HCheckNonSmi: public HUnaryOperation {
2153b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
2154b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  explicit HCheckNonSmi(HValue* value) : HUnaryOperation(value) {
2155b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
2156b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kUseGVN);
2157b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2158b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
21593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
2160b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return Representation::Tagged();
2161b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2162b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2163e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual HType CalculateInferredType();
2164b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2165b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG
21661e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  virtual void Verify();
2167b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif
2168b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2169257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  virtual HValue* Canonicalize() {
2170257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    HType value_type = value()->type();
2171257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    if (!value_type.IsUninitialized() &&
2172257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        (value_type.IsHeapNumber() ||
2173257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch         value_type.IsString() ||
2174257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch         value_type.IsBoolean() ||
2175257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch         value_type.IsNonPrimitive())) {
2176257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      return NULL;
2177257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    }
2178257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return this;
2179257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
2180257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2181257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CheckNonSmi)
21821e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
21831e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
2184e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
2185b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2186b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2187b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2188e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HCheckPrototypeMaps: public HTemplateInstruction<0> {
2189b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
2190b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  HCheckPrototypeMaps(Handle<JSObject> prototype, Handle<JSObject> holder)
2191b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      : prototype_(prototype), holder_(holder) {
2192b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kUseGVN);
21933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    SetGVNFlag(kDependsOnMaps);
2194b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2195b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2196b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG
21971e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  virtual void Verify();
2198b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif
2199b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2200b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  Handle<JSObject> prototype() const { return prototype_; }
2201b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<JSObject> holder() const { return holder_; }
2202b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2203257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CheckPrototypeMaps)
2204b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
22053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
2206e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
2207e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
2208e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
2209e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual intptr_t Hashcode() {
221044f0eee88ff00398ff7f715fab053374d808c90dSteve Block    ASSERT(!HEAP->IsAllocationAllowed());
2211b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    intptr_t hash = reinterpret_cast<intptr_t>(*prototype());
2212b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    hash = 17 * hash + reinterpret_cast<intptr_t>(*holder());
2213b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    return hash;
2214b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
2215b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2216b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
2217e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) {
2218b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    HCheckPrototypeMaps* b = HCheckPrototypeMaps::cast(other);
2219b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    return prototype_.is_identical_to(b->prototype()) &&
2220b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch        holder_.is_identical_to(b->holder());
2221b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2222b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2223b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
2224b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  Handle<JSObject> prototype_;
2225b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<JSObject> holder_;
2226b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2227b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2228b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2229b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HCheckSmi: public HUnaryOperation {
2230b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
2231b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  explicit HCheckSmi(HValue* value) : HUnaryOperation(value) {
2232b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
2233b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kUseGVN);
2234b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2235b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
22363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
2237b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return Representation::Tagged();
2238b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2239e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual HType CalculateInferredType();
2240b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2241b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG
22421e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  virtual void Verify();
2243b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif
2244b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2245257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CheckSmi)
22461e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
22471e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
2248e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
2249b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2250b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2251b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2252b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HPhi: public HValue {
2253b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
2254b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  explicit HPhi(int merged_index)
2255b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      : inputs_(2),
2256b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        merged_index_(merged_index),
225744f0eee88ff00398ff7f715fab053374d808c90dSteve Block        phi_id_(-1),
2258257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        is_live_(false),
2259257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        is_convertible_to_integer_(true) {
2260b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    for (int i = 0; i < Representation::kNumRepresentations; i++) {
2261b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      non_phi_uses_[i] = 0;
2262b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      indirect_uses_[i] = 0;
2263b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
2264b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(merged_index >= 0);
2265b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
2266b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kFlexibleRepresentation);
2267b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2268b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
22693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation InferredRepresentation();
2270b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
22713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Range* InferRange(Zone* zone);
22723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
2273b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return representation();
2274b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2275e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual HType CalculateInferredType();
2276e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual int OperandCount() { return inputs_.length(); }
2277e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual HValue* OperandAt(int index) { return inputs_[index]; }
2278e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* GetRedundantReplacement();
2279b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void AddInput(HValue* value);
228044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  bool HasRealUses();
2281b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
22821e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  bool IsReceiver() { return merged_index_ == 0; }
2283b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2284b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int merged_index() const { return merged_index_; }
2285b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2286e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintTo(StringStream* stream);
2287b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2288b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG
22891e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  virtual void Verify();
2290b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif
2291b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2292b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void InitRealUses(int id);
2293b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void AddNonPhiUsesFrom(HPhi* other);
2294b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void AddIndirectUsesTo(int* use_count);
2295b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2296b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int tagged_non_phi_uses() const {
2297b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return non_phi_uses_[Representation::kTagged];
2298b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2299b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int int32_non_phi_uses() const {
2300b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return non_phi_uses_[Representation::kInteger32];
2301b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2302b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int double_non_phi_uses() const {
2303b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return non_phi_uses_[Representation::kDouble];
2304b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2305b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int tagged_indirect_uses() const {
2306b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return indirect_uses_[Representation::kTagged];
2307b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2308b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int int32_indirect_uses() const {
2309b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return indirect_uses_[Representation::kInteger32];
2310b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2311b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int double_indirect_uses() const {
2312b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return indirect_uses_[Representation::kDouble];
2313b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2314b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int phi_id() { return phi_id_; }
231544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  bool is_live() { return is_live_; }
231644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void set_is_live(bool b) { is_live_ = b; }
2317b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2318257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  static HPhi* cast(HValue* value) {
2319257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    ASSERT(value->IsPhi());
2320257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return reinterpret_cast<HPhi*>(value);
2321257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
2322257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  virtual Opcode opcode() const { return HValue::kPhi; }
2323257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2324257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  virtual bool IsConvertibleToInteger() const {
2325257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return is_convertible_to_integer_;
2326257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
2327257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2328257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  void set_is_convertible_to_integer(bool b) {
2329257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    is_convertible_to_integer_ = b;
2330257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
2331257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2332589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  bool AllOperandsConvertibleToInteger() {
2333589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    for (int i = 0; i < OperandCount(); ++i) {
2334589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch      if (!OperandAt(i)->IsConvertibleToInteger()) return false;
2335589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    }
2336589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    return true;
2337589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  }
2338589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
2339b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
2340b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual void DeleteFromGraph();
2341b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual void InternalSetOperandAt(int index, HValue* value) {
2342b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    inputs_[index] = value;
2343b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2344b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2345b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
2346b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ZoneList<HValue*> inputs_;
2347b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int merged_index_;
2348b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2349b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int non_phi_uses_[Representation::kNumRepresentations];
2350b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int indirect_uses_[Representation::kNumRepresentations];
2351b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int phi_id_;
235244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  bool is_live_;
2353257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  bool is_convertible_to_integer_;
2354b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2355b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2356b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2357e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HArgumentsObject: public HTemplateInstruction<0> {
2358b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
2359b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HArgumentsObject() {
2360b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
2361b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kIsArguments);
2362b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2363b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
23643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
2365e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
2366e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
2367e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
2368257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(ArgumentsObject)
2369b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2370b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2371b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2372e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HConstant: public HTemplateInstruction<0> {
2373b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
2374b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HConstant(Handle<Object> handle, Representation r);
2375b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2376b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<Object> handle() const { return handle_; }
2377b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
237844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  bool InOldSpace() const { return !HEAP->InNewSpace(*handle_); }
23799fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block
23803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool ImmortalImmovable() const {
23813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    Heap* heap = HEAP;
23823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (*handle_ == heap->undefined_value()) return true;
23833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (*handle_ == heap->null_value()) return true;
23843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (*handle_ == heap->true_value()) return true;
23853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (*handle_ == heap->false_value()) return true;
23863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (*handle_ == heap->the_hole_value()) return true;
23873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (*handle_ == heap->minus_zero_value()) return true;
23883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (*handle_ == heap->nan_value()) return true;
23893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (*handle_ == heap->empty_string()) return true;
23903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return false;
23913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
23923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
23933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
2394e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
2395e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
2396e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
2397257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  virtual bool IsConvertibleToInteger() const {
2398257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    if (handle_->IsSmi()) return true;
2399257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    if (handle_->IsHeapNumber() &&
2400257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        (HeapNumber::cast(*handle_)->value() ==
2401257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch         static_cast<double>(NumberToInt32(*handle_)))) return true;
2402257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return false;
2403257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
2404257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
240544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual bool EmitAtUses() { return !representation().IsDouble(); }
24063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual HValue* Canonicalize();
2407e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
2408e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual HType CalculateInferredType();
2409b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool IsInteger() const { return handle_->IsSmi(); }
2410b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HConstant* CopyToRepresentation(Representation r) const;
2411b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HConstant* CopyToTruncatedInt32() const;
2412b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool HasInteger32Value() const { return has_int32_value_; }
2413b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int32_t Integer32Value() const {
2414b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(HasInteger32Value());
2415b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return int32_value_;
2416b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2417b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool HasDoubleValue() const { return has_double_value_; }
2418b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  double DoubleValue() const {
2419b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(HasDoubleValue());
2420b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return double_value_;
2421b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
24223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool HasNumberValue() const { return has_int32_value_ || has_double_value_; }
24233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  int32_t NumberValueAsInteger32() const {
24243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    ASSERT(HasNumberValue());
24253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (has_int32_value_) return int32_value_;
24263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return DoubleToInt32(double_value_);
24273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
2428b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool HasStringValue() const { return handle_->IsString(); }
2429b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
24308b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  bool ToBoolean() const;
24318b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
2432e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual intptr_t Hashcode() {
243344f0eee88ff00398ff7f715fab053374d808c90dSteve Block    ASSERT(!HEAP->allow_allocation(false));
24343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    intptr_t hash = reinterpret_cast<intptr_t>(*handle());
24353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // Prevent smis from having fewer hash values when truncated to
24363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // the least significant bits.
24373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    const int kShiftSize = kSmiShiftSize + kSmiTagSize;
24383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    STATIC_ASSERT(kShiftSize != 0);
24393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return hash ^ (hash >> kShiftSize);
2440b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2441b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2442b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG
24431e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  virtual void Verify() { }
2444b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif
2445b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2446257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Constant)
2447b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2448b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
24493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Range* InferRange(Zone* zone);
2450b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2451e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) {
2452b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    HConstant* other_constant = HConstant::cast(other);
2453b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return handle().is_identical_to(other_constant->handle());
2454b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2455b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2456b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
2457b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<Object> handle_;
2458b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2459b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // The following two values represent the int32 and the double value of the
2460b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // given constant if there is a lossless conversion between the constant
2461b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // and the specific representation.
2462257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  bool has_int32_value_ : 1;
2463257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  bool has_double_value_ : 1;
2464b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int32_t int32_value_;
2465b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  double double_value_;
2466b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2467b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2468b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
24693fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HBinaryOperation: public HTemplateInstruction<3> {
2470b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
24713fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HBinaryOperation(HValue* context, HValue* left, HValue* right) {
2472b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(left != NULL && right != NULL);
24733fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(0, context);
24743fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(1, left);
24753fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(2, right);
2476b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2477b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
24783fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* context() { return OperandAt(0); }
24793fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* left() { return OperandAt(1); }
24803fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* right() { return OperandAt(2); }
2481b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2482b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // TODO(kasperl): Move these helpers to the IA-32 Lithium
2483b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // instruction sequence builder.
2484e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* LeastConstantOperand() {
2485b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (IsCommutative() && left()->IsConstant()) return right();
2486b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return left();
2487b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2488e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* MostConstantOperand() {
2489b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (IsCommutative() && left()->IsConstant()) return left();
2490b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return right();
2491b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2492b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2493b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual bool IsCommutative() const { return false; }
2494b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2495e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
2496b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2497b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2498b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
24993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass HWrapReceiver: public HTemplateInstruction<2> {
25003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
25013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HWrapReceiver(HValue* receiver, HValue* function) {
25023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    set_representation(Representation::Tagged());
25033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    SetOperandAt(0, receiver);
25043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    SetOperandAt(1, function);
25053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
25063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
25073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
25083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return Representation::Tagged();
25093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
25103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
25113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HValue* receiver() { return OperandAt(0); }
25123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HValue* function() { return OperandAt(1); }
25133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
25143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual HValue* Canonicalize();
25153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
25163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(WrapReceiver)
25173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
25183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
25193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2520e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HApplyArguments: public HTemplateInstruction<4> {
2521b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
2522b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HApplyArguments(HValue* function,
2523b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch                  HValue* receiver,
2524b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch                  HValue* length,
2525b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch                  HValue* elements) {
2526b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
2527b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetOperandAt(0, function);
2528b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetOperandAt(1, receiver);
2529b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetOperandAt(2, length);
2530b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetOperandAt(3, elements);
25311e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetAllSideEffects();
2532b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2533b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
25343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
2535b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // The length is untagged, all other inputs are tagged.
2536b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return (index == 2)
2537b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        ? Representation::Integer32()
2538b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        : Representation::Tagged();
2539b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2540b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2541e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* function() { return OperandAt(0); }
2542e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* receiver() { return OperandAt(1); }
2543e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* length() { return OperandAt(2); }
2544e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* elements() { return OperandAt(3); }
2545b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2546257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(ApplyArguments)
2547b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2548b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2549b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2550e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HArgumentsElements: public HTemplateInstruction<0> {
2551b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
2552b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HArgumentsElements() {
2553b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // The value produced by this instruction is a pointer into the stack
2554b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // that looks as if it was a smi because of alignment.
2555b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
2556b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kUseGVN);
2557b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2558b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2559257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(ArgumentsElements)
25601e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
25613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
2562e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
2563e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
2564e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
25651e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
2566e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
2567b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2568b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2569b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2570b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HArgumentsLength: public HUnaryOperation {
2571b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
2572b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  explicit HArgumentsLength(HValue* value) : HUnaryOperation(value) {
2573b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Integer32());
2574b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kUseGVN);
2575b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2576b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
25773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
2578e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::Tagged();
2579e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
2580e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
2581257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(ArgumentsLength)
25821e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
25831e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
2584e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
2585b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2586b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2587b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2588e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HAccessArgumentsAt: public HTemplateInstruction<3> {
2589b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
2590b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HAccessArgumentsAt(HValue* arguments, HValue* length, HValue* index) {
2591b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
2592b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kUseGVN);
2593b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetOperandAt(0, arguments);
2594b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetOperandAt(1, length);
2595b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetOperandAt(2, index);
2596b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2597b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2598e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
2599b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
26003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
2601b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // The arguments elements is considered tagged.
2602b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return index == 0
2603b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        ? Representation::Tagged()
2604b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        : Representation::Integer32();
2605b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2606b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2607e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* arguments() { return OperandAt(0); }
2608e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* length() { return OperandAt(1); }
2609e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* index() { return OperandAt(2); }
2610b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2611257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(AccessArgumentsAt)
2612b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2613e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
2614b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2615b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2616b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
26173fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HBoundsCheck: public HTemplateInstruction<2> {
2618b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
26193fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HBoundsCheck(HValue* index, HValue* length) {
26203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(0, index);
26213fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(1, length);
26227d3e7fc4b65010eabe860313ee0c64f50843f6e3Ben Murdoch    set_representation(Representation::Integer32());
2623b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kUseGVN);
2624b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2625b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
26263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
2627b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return Representation::Integer32();
2628b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2629b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
263069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  virtual void PrintDataTo(StringStream* stream);
2631b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
26323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* index() { return OperandAt(0); }
26333fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* length() { return OperandAt(1); }
2634b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2635257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(BoundsCheck)
26361e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
26371e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
2638e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
2639b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2640b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2641b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2642b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HBitwiseBinaryOperation: public HBinaryOperation {
2643b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
26443fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HBitwiseBinaryOperation(HValue* context, HValue* left, HValue* right)
26453fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : HBinaryOperation(context, left, right) {
26461e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    set_representation(Representation::Tagged());
26471e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetFlag(kFlexibleRepresentation);
26481e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetAllSideEffects();
2649b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2650b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
26513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
26523fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return index == 0
26533fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        ? Representation::Tagged()
26543fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        : representation();
2655b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2656b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
26571e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  virtual void RepresentationChanged(Representation to) {
26581e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    if (!to.IsTagged()) {
26591e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      ASSERT(to.IsInteger32());
26601e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      ClearAllSideEffects();
26611e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      SetFlag(kTruncatingToInt32);
26621e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      SetFlag(kUseGVN);
26631e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    }
26641e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
26651e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
2666e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual HType CalculateInferredType();
26671e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
2668257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_ABSTRACT_INSTRUCTION(BitwiseBinaryOperation)
2669b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2670b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2671b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2672b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HArithmeticBinaryOperation: public HBinaryOperation {
2673b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
26743fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HArithmeticBinaryOperation(HValue* context, HValue* left, HValue* right)
26753fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : HBinaryOperation(context, left, right) {
2676b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
2677b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kFlexibleRepresentation);
26781e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetAllSideEffects();
2679b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2680b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2681b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual void RepresentationChanged(Representation to) {
2682b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (!to.IsTagged()) {
26831e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      ClearAllSideEffects();
2684b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      SetFlag(kUseGVN);
2685b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
2686b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2687b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2688e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual HType CalculateInferredType();
26893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
26903fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return index == 0
26913fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        ? Representation::Tagged()
26923fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        : representation();
2693b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
26943fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
2695e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual Representation InferredRepresentation() {
2696b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (left()->representation().Equals(right()->representation())) {
2697b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      return left()->representation();
2698b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
2699b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return HValue::InferredRepresentation();
2700b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2701b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2702b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2703b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
27043fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HCompareGeneric: public HBinaryOperation {
2705b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
27063fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HCompareGeneric(HValue* context,
27073fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch                  HValue* left,
27083fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch                  HValue* right,
27093fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch                  Token::Value token)
27103fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : HBinaryOperation(context, left, right), token_(token) {
2711b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(Token::IsCompareOp(token));
2712b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
27131e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetAllSideEffects();
2714b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2715b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
27163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
27173fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return Representation::Tagged();
2718b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
27193fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
2720b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Representation GetInputRepresentation() const {
27213fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return Representation::Tagged();
2722b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
27233fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
2724b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Token::Value token() const { return token_; }
2725e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
2726b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2727e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual HType CalculateInferredType();
2728b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
27293fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CompareGeneric)
2730b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2731b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
2732b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Token::Value token_;
2733b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2734b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2735b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
27363fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HCompareIDAndBranch: public HTemplateControlInstruction<2, 2> {
2737b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
27383fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HCompareIDAndBranch(HValue* left, HValue* right, Token::Value token)
27393fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : token_(token) {
27403fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    ASSERT(Token::IsCompareOp(token));
27413fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(0, left);
27423fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(1, right);
2743b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2744b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
27453fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* left() { return OperandAt(0); }
27463fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* right() { return OperandAt(1); }
27473fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  Token::Value token() const { return token_; }
27483fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
27493fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  void SetInputRepresentation(Representation r);
27503fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  Representation GetInputRepresentation() const {
27513fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return input_representation_;
27521e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
27531e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
27543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
27553fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return input_representation_;
2756b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
27573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  virtual void PrintDataTo(StringStream* stream);
2758b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
27593fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CompareIDAndBranch)
27601e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
27613fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch private:
27623fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  Representation input_representation_;
27633fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  Token::Value token_;
2764b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2765b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2766b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
27673fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HCompareObjectEqAndBranch: public HTemplateControlInstruction<2, 2> {
2768257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public:
27693fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HCompareObjectEqAndBranch(HValue* left, HValue* right) {
27703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(0, left);
27713fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(1, right);
2772257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
2773257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
27743fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* left() { return OperandAt(0); }
27753fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* right() { return OperandAt(1); }
2776257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
27773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual void PrintDataTo(StringStream* stream);
27783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
27793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
2780257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return Representation::Tagged();
2781257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
2782257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
27833fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CompareObjectEqAndBranch)
2784257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
2785257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2786257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
27873fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HCompareConstantEqAndBranch: public HUnaryControlInstruction {
2788b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
27893fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HCompareConstantEqAndBranch(HValue* left, int right, Token::Value op)
27903fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : HUnaryControlInstruction(left, NULL, NULL), op_(op), right_(right) {
27913fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    ASSERT(op == Token::EQ_STRICT);
2792b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
27931e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
27943fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  Token::Value op() const { return op_; }
27953fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* left() { return value(); }
27963fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  int right() const { return right_; }
27971e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
27983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
27993fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return Representation::Integer32();
2800b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
28013fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
28023fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CompareConstantEqAndBranch);
28033fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
28043fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch private:
28053fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  const Token::Value op_;
28063fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  const int right_;
2807b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2808b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2809b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
28103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass HIsNilAndBranch: public HUnaryControlInstruction {
2811b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
28123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HIsNilAndBranch(HValue* value, EqualityKind kind, NilValue nil)
28133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      : HUnaryControlInstruction(value, NULL, NULL), kind_(kind), nil_(nil) { }
2814592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
28153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EqualityKind kind() const { return kind_; }
28163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  NilValue nil() const { return nil_; }
2817b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
28183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual void PrintDataTo(StringStream* stream);
28193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
28203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
28213fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return Representation::Tagged();
2822b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2823b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
28243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(IsNilAndBranch)
28253fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
2826b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
28273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EqualityKind kind_;
28283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  NilValue nil_;
2829b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2830b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2831b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
28323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HIsObjectAndBranch: public HUnaryControlInstruction {
2833b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
28343fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  explicit HIsObjectAndBranch(HValue* value)
28353fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    : HUnaryControlInstruction(value, NULL, NULL) { }
2836b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
28373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
28383fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return Representation::Tagged();
28393fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
28401e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
28413fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(IsObjectAndBranch)
2842b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2843b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
28443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass HIsStringAndBranch: public HUnaryControlInstruction {
28453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
28463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  explicit HIsStringAndBranch(HValue* value)
28473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    : HUnaryControlInstruction(value, NULL, NULL) { }
28483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
28493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
28503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return Representation::Tagged();
28513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
28523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
28533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(IsStringAndBranch)
28543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
28553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2856b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
28573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HIsSmiAndBranch: public HUnaryControlInstruction {
2858b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
28593fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  explicit HIsSmiAndBranch(HValue* value)
28603fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : HUnaryControlInstruction(value, NULL, NULL) { }
28613fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
28623fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(IsSmiAndBranch)
2863b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
28643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
28653fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return Representation::Tagged();
28663fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
2867257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2868257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch protected:
2869257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  virtual bool DataEquals(HValue* other) { return true; }
2870257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
2871257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2872257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
28733fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HIsUndetectableAndBranch: public HUnaryControlInstruction {
2874257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public:
28753fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  explicit HIsUndetectableAndBranch(HValue* value)
28763fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : HUnaryControlInstruction(value, NULL, NULL) { }
2877257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
28783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
28793fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return Representation::Tagged();
28803fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
28811e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
28823fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(IsUndetectableAndBranch)
28831e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block};
28841e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
28851e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
28863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass HStringCompareAndBranch: public HTemplateControlInstruction<2, 3> {
28873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
28883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HStringCompareAndBranch(HValue* context,
28893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                           HValue* left,
28903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                           HValue* right,
28913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                           Token::Value token)
28923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      : token_(token) {
28933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    ASSERT(Token::IsCompareOp(token));
28943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    SetOperandAt(0, context);
28953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    SetOperandAt(1, left);
28963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    SetOperandAt(2, right);
28973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    set_representation(Representation::Tagged());
28983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
28993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
29003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HValue* context() { return OperandAt(0); }
29013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HValue* left() { return OperandAt(1); }
29023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HValue* right() { return OperandAt(2); }
29033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Token::Value token() const { return token_; }
29043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
29053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual void PrintDataTo(StringStream* stream);
29063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
29073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
29083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return Representation::Tagged();
29093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
29103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
29113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Representation GetInputRepresentation() const {
29123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return Representation::Tagged();
29133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
29143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
29153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(StringCompareAndBranch)
29163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
29173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private:
29183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Token::Value token_;
29193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
29203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
29213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
29223fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HIsConstructCallAndBranch: public HTemplateControlInstruction<2, 0> {
29231e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public:
29243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
2925e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
2926e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
2927e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
29283fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(IsConstructCallAndBranch)
2929b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2930b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2931b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
29323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HHasInstanceTypeAndBranch: public HUnaryControlInstruction {
2933b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
29343fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HHasInstanceTypeAndBranch(HValue* value, InstanceType type)
29353fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : HUnaryControlInstruction(value, NULL, NULL), from_(type), to_(type) { }
29363fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HHasInstanceTypeAndBranch(HValue* value, InstanceType from, InstanceType to)
29373fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : HUnaryControlInstruction(value, NULL, NULL), from_(from), to_(to) {
2938b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(to == LAST_TYPE);  // Others not implemented yet in backend.
2939b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2940b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2941b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  InstanceType from() { return from_; }
2942b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  InstanceType to() { return to_; }
2943b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2944e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
2945b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
29463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
29473fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return Representation::Tagged();
2948b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2949b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
29503fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(HasInstanceTypeAndBranch)
29513fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
2952b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
2953b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  InstanceType from_;
2954b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  InstanceType to_;  // Inclusive range, not all combinations work.
2955b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2956b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2957b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
29583fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HHasCachedArrayIndexAndBranch: public HUnaryControlInstruction {
2959b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
29603fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  explicit HHasCachedArrayIndexAndBranch(HValue* value)
29613fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : HUnaryControlInstruction(value, NULL, NULL) { }
2962b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
29633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
29643fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return Representation::Tagged();
29653fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
29661e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
29673fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(HasCachedArrayIndexAndBranch)
2968e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch};
2969e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
2970e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
29713fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HGetCachedArrayIndex: public HUnaryOperation {
2972e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch public:
29733fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  explicit HGetCachedArrayIndex(HValue* value) : HUnaryOperation(value) {
29743fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    set_representation(Representation::Tagged());
29753fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetFlag(kUseGVN);
29763fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
29773fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
29783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
29793fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return Representation::Tagged();
29803fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
2981e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
2982257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(GetCachedArrayIndex)
2983e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
2984e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch protected:
2985e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
2986b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2987b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2988b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
29893fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HClassOfTestAndBranch: public HUnaryControlInstruction {
2990b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
29913fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HClassOfTestAndBranch(HValue* value, Handle<String> class_name)
29923fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : HUnaryControlInstruction(value, NULL, NULL),
29933fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        class_name_(class_name) { }
2994b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
29953fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(ClassOfTestAndBranch)
29963fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
29973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
29983fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return Representation::Tagged();
29993fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
3000b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3001e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
3002b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3003b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<String> class_name() const { return class_name_; }
3004b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3005b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
3006b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<String> class_name_;
3007b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3008b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3009b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
30103fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HTypeofIsAndBranch: public HUnaryControlInstruction {
3011b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
30123fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HTypeofIsAndBranch(HValue* value, Handle<String> type_literal)
30133fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : HUnaryControlInstruction(value, NULL, NULL),
30143fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        type_literal_(type_literal) { }
3015b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3016b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<String> type_literal() { return type_literal_; }
3017e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
3018b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
30193fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(TypeofIsAndBranch)
3020b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
30213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
30223fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return Representation::Tagged();
3023b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3024b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3025b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
3026b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<String> type_literal_;
3027b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3028b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3029b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
30303fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HInstanceOf: public HBinaryOperation {
3031b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
30323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HInstanceOf(HValue* context, HValue* left, HValue* right)
30333fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : HBinaryOperation(context, left, right) {
3034b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
30351e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetAllSideEffects();
3036b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3037b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
30383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
3039b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return Representation::Tagged();
3040b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3041b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
30423fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  virtual HType CalculateInferredType();
30433fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
3044e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
30451e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
3046257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(InstanceOf)
3047b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3048b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3049b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
30503fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HInstanceOfKnownGlobal: public HTemplateInstruction<2> {
3051086aeeaae12517475c22695a200be45495516549Ben Murdoch public:
30523fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HInstanceOfKnownGlobal(HValue* context,
30533fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch                         HValue* left,
30543fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch                         Handle<JSFunction> right)
30553fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : function_(right) {
30563fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(0, context);
30573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(1, left);
3058086aeeaae12517475c22695a200be45495516549Ben Murdoch    set_representation(Representation::Tagged());
30591e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetAllSideEffects();
3060086aeeaae12517475c22695a200be45495516549Ben Murdoch  }
3061086aeeaae12517475c22695a200be45495516549Ben Murdoch
30623fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* context() { return OperandAt(0); }
30633fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* left() { return OperandAt(1); }
3064086aeeaae12517475c22695a200be45495516549Ben Murdoch  Handle<JSFunction> function() { return function_; }
3065086aeeaae12517475c22695a200be45495516549Ben Murdoch
30663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
3067086aeeaae12517475c22695a200be45495516549Ben Murdoch    return Representation::Tagged();
3068086aeeaae12517475c22695a200be45495516549Ben Murdoch  }
3069086aeeaae12517475c22695a200be45495516549Ben Murdoch
30703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  virtual HType CalculateInferredType();
30713fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
3072257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(InstanceOfKnownGlobal)
3073086aeeaae12517475c22695a200be45495516549Ben Murdoch
3074086aeeaae12517475c22695a200be45495516549Ben Murdoch private:
3075086aeeaae12517475c22695a200be45495516549Ben Murdoch  Handle<JSFunction> function_;
3076086aeeaae12517475c22695a200be45495516549Ben Murdoch};
3077086aeeaae12517475c22695a200be45495516549Ben Murdoch
3078086aeeaae12517475c22695a200be45495516549Ben Murdoch
30793fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HPower: public HTemplateInstruction<2> {
3080b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
30813fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HPower(HValue* left, HValue* right) {
30823fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(0, left);
30833fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(1, right);
3084b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Double());
3085b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kUseGVN);
3086b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3087b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
30883fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* left() { return OperandAt(0); }
30893fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* right() { return OperandAt(1); }
30903fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
30913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
30923fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return index == 0
30933fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      ? Representation::Double()
30943fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : Representation::None();
3095b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3096b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3097257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Power)
30981e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
30991e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
3100e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
3101b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3102b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3103b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
31043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass HRandom: public HTemplateInstruction<1> {
31053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
31063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  explicit HRandom(HValue* global_object) {
31073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    SetOperandAt(0, global_object);
31083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    set_representation(Representation::Double());
31093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
31103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
31113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HValue* global_object() { return OperandAt(0); }
31123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
31133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
31143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return Representation::Tagged();
31153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
31163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
31173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(Random)
31183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
31193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
31203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3121b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HAdd: public HArithmeticBinaryOperation {
3122b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
31233fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HAdd(HValue* context, HValue* left, HValue* right)
31243fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : HArithmeticBinaryOperation(context, left, right) {
3125b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kCanOverflow);
3126b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3127b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3128b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Add is only commutative if two integer values are added and not if two
3129b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // tagged values are added (because it might be a String concatenation).
3130b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual bool IsCommutative() const {
3131b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return !representation().IsTagged();
3132b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3133b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3134b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited);
3135b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
31363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  static HInstruction* NewHAdd(Zone* zone,
31373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                               HValue* context,
31383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                               HValue* left,
31393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                               HValue* right);
31403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3141e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual HType CalculateInferredType();
3142b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
31433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual HValue* Canonicalize();
31443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3145257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Add)
3146b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3147b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
3148e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
31491e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
31503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Range* InferRange(Zone* zone);
3151b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3152b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3153b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3154b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HSub: public HArithmeticBinaryOperation {
3155b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
31563fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HSub(HValue* context, HValue* left, HValue* right)
31573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : HArithmeticBinaryOperation(context, left, right) {
3158b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kCanOverflow);
3159b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3160b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3161b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited);
3162b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
31633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual HValue* Canonicalize();
31643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
31653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  static HInstruction* NewHSub(Zone* zone,
31663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                              HValue* context,
31673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                              HValue* left,
31683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                              HValue* right);
31693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3170257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Sub)
3171b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3172b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
3173e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
31741e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
31753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Range* InferRange(Zone* zone);
3176b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3177b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3178b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3179b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HMul: public HArithmeticBinaryOperation {
3180b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
31813fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HMul(HValue* context, HValue* left, HValue* right)
31823fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : HArithmeticBinaryOperation(context, left, right) {
3183b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kCanOverflow);
3184b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3185b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3186b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited);
3187b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3188b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Only commutative if it is certain that not two objects are multiplicated.
3189b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual bool IsCommutative() const {
3190b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return !representation().IsTagged();
3191b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3192b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
31933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  static HInstruction* NewHMul(Zone* zone,
31943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                               HValue* context,
31953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                               HValue* left,
31963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                               HValue* right);
31973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3198257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Mul)
3199b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3200b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
3201e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
32021e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
32033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Range* InferRange(Zone* zone);
3204b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3205b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3206b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3207b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HMod: public HArithmeticBinaryOperation {
3208b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
32093fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HMod(HValue* context, HValue* left, HValue* right)
32103fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : HArithmeticBinaryOperation(context, left, right) {
3211b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kCanBeDivByZero);
3212b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3213b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
321444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  bool HasPowerOf2Divisor() {
321544f0eee88ff00398ff7f715fab053374d808c90dSteve Block    if (right()->IsConstant() &&
321644f0eee88ff00398ff7f715fab053374d808c90dSteve Block        HConstant::cast(right())->HasInteger32Value()) {
321744f0eee88ff00398ff7f715fab053374d808c90dSteve Block      int32_t value = HConstant::cast(right())->Integer32Value();
321844f0eee88ff00398ff7f715fab053374d808c90dSteve Block      return value != 0 && (IsPowerOf2(value) || IsPowerOf2(-value));
321944f0eee88ff00398ff7f715fab053374d808c90dSteve Block    }
322044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
322144f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return false;
322244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
322344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
3224b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited);
3225b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
32263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  static HInstruction* NewHMod(Zone* zone,
32273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                               HValue* context,
32283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                               HValue* left,
32293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                               HValue* right);
32303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3231257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Mod)
3232b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3233b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
3234e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
32351e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
32363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Range* InferRange(Zone* zone);
3237b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3238b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3239b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3240b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HDiv: public HArithmeticBinaryOperation {
3241b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
32423fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HDiv(HValue* context, HValue* left, HValue* right)
32433fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : HArithmeticBinaryOperation(context, left, right) {
3244b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kCanBeDivByZero);
3245b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kCanOverflow);
3246b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3247b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3248b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited);
3249b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
32503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  static HInstruction* NewHDiv(Zone* zone,
32513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                               HValue* context,
32523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                               HValue* left,
32533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                               HValue* right);
32543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3255592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(Div)
3256b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3257b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
3258e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
32591e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
32603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Range* InferRange(Zone* zone);
3261b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3262b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3263b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
32643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass HBitwise: public HBitwiseBinaryOperation {
3265b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
32663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HBitwise(Token::Value op, HValue* context, HValue* left, HValue* right)
32673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      : HBitwiseBinaryOperation(context, left, right), op_(op) {
32683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        ASSERT(op == Token::BIT_AND ||
32693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch               op == Token::BIT_OR ||
32703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch               op == Token::BIT_XOR);
32713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      }
3272c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch
32733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Token::Value op() const { return op_; }
327485b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch
327585b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch  virtual bool IsCommutative() const { return true; }
3276592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
32773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual HValue* Canonicalize();
327885b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch
32793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  static HInstruction* NewHBitwise(Zone* zone,
32803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                   Token::Value op,
32813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                   HValue* context,
32823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                   HValue* left,
32833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                   HValue* right);
328485b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch
32853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(Bitwise)
328685b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch
328785b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch protected:
32883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual bool DataEquals(HValue* other) {
32893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return op() == HBitwise::cast(other)->op();
32903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
329185b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch
32923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Range* InferRange(Zone* zone);
32933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
32943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private:
32953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Token::Value op_;
3296b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3297b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3298b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3299b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HShl: public HBitwiseBinaryOperation {
3300b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
33013fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HShl(HValue* context, HValue* left, HValue* right)
33023fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : HBitwiseBinaryOperation(context, left, right) { }
3303b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
33043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Range* InferRange(Zone* zone);
33053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
33063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  static HInstruction* NewHShl(Zone* zone,
33073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                               HValue* context,
33083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                               HValue* left,
33093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                               HValue* right);
3310b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3311257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Shl)
33121e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
33131e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
3314e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
3315b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3316b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3317b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3318b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HShr: public HBitwiseBinaryOperation {
3319b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
33203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HShr(HValue* context, HValue* left, HValue* right)
33213fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : HBitwiseBinaryOperation(context, left, right) { }
3322b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
33233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Range* InferRange(Zone* zone);
33243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
33253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  static HInstruction* NewHShr(Zone* zone,
33263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                               HValue* context,
33273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                               HValue* left,
33283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                               HValue* right);
3329b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3330257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Shr)
33311e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
33321e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
3333e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
3334b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3335b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3336b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3337b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HSar: public HBitwiseBinaryOperation {
3338b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
33393fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HSar(HValue* context, HValue* left, HValue* right)
33403fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : HBitwiseBinaryOperation(context, left, right) { }
3341b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
33423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Range* InferRange(Zone* zone);
33433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
33443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  static HInstruction* NewHSar(Zone* zone,
33453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                               HValue* context,
33463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                               HValue* left,
33473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                               HValue* right);
3348b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3349257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Sar)
33501e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
33511e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
3352e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
3353b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3354b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3355b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3356e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HOsrEntry: public HTemplateInstruction<0> {
3357b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
3358b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  explicit HOsrEntry(int ast_id) : ast_id_(ast_id) {
33593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    SetGVNFlag(kChangesOsrEntries);
3360b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3361b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3362b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int ast_id() const { return ast_id_; }
3363b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
33643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
3365e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
3366e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
3367e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
3368257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(OsrEntry)
3369b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3370b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
3371b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int ast_id_;
3372b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3373b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3374b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3375e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HParameter: public HTemplateInstruction<0> {
3376b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
3377b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  explicit HParameter(unsigned index) : index_(index) {
3378b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
3379b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3380b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3381b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  unsigned index() const { return index_; }
3382b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3383e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
3384e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
33853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
3386e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
3387e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
3388b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3389257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Parameter)
3390b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3391b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
3392b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  unsigned index_;
3393b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3394b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3395b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
33961e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HCallStub: public HUnaryCall {
3397b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
33981e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HCallStub(HValue* context, CodeStub::Major major_key, int argument_count)
33991e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      : HUnaryCall(context, argument_count),
34001e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block        major_key_(major_key),
3401b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        transcendental_type_(TranscendentalCache::kNumberOfCaches) {
3402b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3403b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3404b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  CodeStub::Major major_key() { return major_key_; }
34051e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
3406e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* context() { return value(); }
3407b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3408b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void set_transcendental_type(TranscendentalCache::Type transcendental_type) {
3409b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    transcendental_type_ = transcendental_type;
3410b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3411b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  TranscendentalCache::Type transcendental_type() {
3412b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return transcendental_type_;
3413b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
34141e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
3415e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
3416e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
34173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
3418e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::Tagged();
3419e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
3420b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3421257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CallStub)
3422b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3423b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
3424b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  CodeStub::Major major_key_;
3425b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  TranscendentalCache::Type transcendental_type_;
3426b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3427b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3428b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3429e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HUnknownOSRValue: public HTemplateInstruction<0> {
3430b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
34313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HUnknownOSRValue()
34323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      : incoming_value_(NULL) {
34333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    set_representation(Representation::Tagged());
34343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
3435b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
34363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
3437e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
3438e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
3439e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
34403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  void set_incoming_value(HPhi* value) {
34413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    incoming_value_ = value;
34423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
34433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
34443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HPhi* incoming_value() {
34453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return incoming_value_;
34463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
34473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3448257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(UnknownOSRValue)
34493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
34503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private:
34513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HPhi* incoming_value_;
3452b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3453b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3454b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
34558b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochclass HLoadGlobalCell: public HTemplateInstruction<0> {
3456b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
34573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HLoadGlobalCell(Handle<JSGlobalPropertyCell> cell, PropertyDetails details)
34583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      : cell_(cell), details_(details) {
3459b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
3460b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kUseGVN);
34613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    SetGVNFlag(kDependsOnGlobalVars);
3462b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3463b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3464b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<JSGlobalPropertyCell>  cell() const { return cell_; }
34653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool RequiresHoleCheck();
3466b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3467e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
3468b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3469e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual intptr_t Hashcode() {
347044f0eee88ff00398ff7f715fab053374d808c90dSteve Block    ASSERT(!HEAP->allow_allocation(false));
3471b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return reinterpret_cast<intptr_t>(*cell_);
3472b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3473b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
34743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
3475e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
3476e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
3477e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
3478257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(LoadGlobalCell)
3479b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3480b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
3481e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) {
34828b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    HLoadGlobalCell* b = HLoadGlobalCell::cast(other);
3483b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return cell_.is_identical_to(b->cell());
3484b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3485b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3486b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
3487b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<JSGlobalPropertyCell> cell_;
34883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  PropertyDetails details_;
3489b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3490b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3491b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
34923fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HLoadGlobalGeneric: public HTemplateInstruction<2> {
3493b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
34948b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  HLoadGlobalGeneric(HValue* context,
34958b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch                     HValue* global_object,
34968b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch                     Handle<Object> name,
34978b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch                     bool for_typeof)
34983fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : name_(name),
34998b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch        for_typeof_(for_typeof) {
35003fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(0, context);
35013fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(1, global_object);
35028b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    set_representation(Representation::Tagged());
35038b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    SetAllSideEffects();
35048b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  }
35058b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
35068b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  HValue* context() { return OperandAt(0); }
35078b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  HValue* global_object() { return OperandAt(1); }
35088b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  Handle<Object> name() const { return name_; }
35098b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  bool for_typeof() const { return for_typeof_; }
35108b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
35118b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  virtual void PrintDataTo(StringStream* stream);
35128b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
35133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
35148b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    return Representation::Tagged();
35158b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  }
35168b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
3517257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(LoadGlobalGeneric)
35188b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
35198b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch private:
35208b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  Handle<Object> name_;
35218b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  bool for_typeof_;
35228b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch};
35238b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
35248b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
35253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochinline bool StoringValueNeedsWriteBarrier(HValue* value) {
35263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return !value->type().IsBoolean()
35273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      && !value->type().IsSmi()
35283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      && !(value->IsConstant() && HConstant::cast(value)->ImmortalImmovable());
35293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
35303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
35313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
35328b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochclass HStoreGlobalCell: public HUnaryOperation {
35338b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch public:
35348b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  HStoreGlobalCell(HValue* value,
35358b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch                   Handle<JSGlobalPropertyCell> cell,
35363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                   PropertyDetails details)
35371e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      : HUnaryOperation(value),
35381e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block        cell_(cell),
35393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        details_(details) {
35403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    SetGVNFlag(kChangesGlobalVars);
3541b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3542b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3543b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<JSGlobalPropertyCell> cell() const { return cell_; }
35443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool RequiresHoleCheck() {
35453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return !details_.IsDontDelete() || details_.IsReadOnly();
35463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
35473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool NeedsWriteBarrier() {
35483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return StoringValueNeedsWriteBarrier(value());
35493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
3550b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
35513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
3552b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return Representation::Tagged();
3553b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3554e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
3555b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3556257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(StoreGlobalCell)
3557b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3558b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
3559b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<JSGlobalPropertyCell> cell_;
35603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  PropertyDetails details_;
3561b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3562b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3563b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
35648b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochclass HStoreGlobalGeneric: public HTemplateInstruction<3> {
35658b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch public:
35668b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  HStoreGlobalGeneric(HValue* context,
35678b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch                      HValue* global_object,
35688b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch                      Handle<Object> name,
35698b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch                      HValue* value,
35703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                      StrictModeFlag strict_mode_flag)
35718b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch      : name_(name),
35723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        strict_mode_flag_(strict_mode_flag) {
35738b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    SetOperandAt(0, context);
35748b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    SetOperandAt(1, global_object);
35758b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    SetOperandAt(2, value);
35768b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    set_representation(Representation::Tagged());
35778b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    SetAllSideEffects();
35788b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  }
35798b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
35808b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  HValue* context() { return OperandAt(0); }
35818b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  HValue* global_object() { return OperandAt(1); }
35828b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  Handle<Object> name() const { return name_; }
35838b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  HValue* value() { return OperandAt(2); }
35843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  StrictModeFlag strict_mode_flag() { return strict_mode_flag_; }
35858b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
35868b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  virtual void PrintDataTo(StringStream* stream);
35878b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
35883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
35898b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    return Representation::Tagged();
35908b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  }
35918b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
3592257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(StoreGlobalGeneric)
35938b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
35948b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch private:
35958b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  Handle<Object> name_;
35963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  StrictModeFlag strict_mode_flag_;
35978b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch};
35988b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
35998b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
36001e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HLoadContextSlot: public HUnaryOperation {
3601b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
36023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  enum Mode {
36033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // Perform a normal load of the context slot without checking its value.
36043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    kNoCheck,
36053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // Load and check the value of the context slot. Deoptimize if it's the
36063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // hole value. This is used for checking for loading of uninitialized
36073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // harmony bindings where we deoptimize into full-codegen generated code
36083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // which will subsequently throw a reference error.
36093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    kCheckDeoptimize,
36103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // Load and check the value of the context slot. Return undefined if it's
36113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // the hole value. This is used for non-harmony const assignments
36123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    kCheckReturnUndefined
36133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  };
36143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
36153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HLoadContextSlot(HValue* context, Variable* var)
36163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      : HUnaryOperation(context), slot_index_(var->index()) {
36173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    ASSERT(var->IsContextSlot());
36183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    switch (var->mode()) {
36193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      case LET:
36203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      case CONST_HARMONY:
36213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        mode_ = kCheckDeoptimize;
36223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        break;
36233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      case CONST:
36243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        mode_ = kCheckReturnUndefined;
36253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        break;
36263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      default:
36273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        mode_ = kNoCheck;
36283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
3629b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    set_representation(Representation::Tagged());
3630b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    SetFlag(kUseGVN);
36313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    SetGVNFlag(kDependsOnContextSlots);
3632b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
3633b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
3634b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  int slot_index() const { return slot_index_; }
36353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Mode mode() const { return mode_; }
36363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
36373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool DeoptimizesOnHole() {
36383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return mode_ == kCheckDeoptimize;
36393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
3640c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch
36413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool RequiresHoleCheck() {
36423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return mode_ != kNoCheck;
36433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
36443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
36453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
36461e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return Representation::Tagged();
3647b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
3648b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
3649e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
36501e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
3651257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(LoadContextSlot)
3652b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
3653b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch protected:
3654e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) {
3655b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    HLoadContextSlot* b = HLoadContextSlot::cast(other);
36561e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return (slot_index() == b->slot_index());
3657b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
3658b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
3659b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch private:
36601e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  int slot_index_;
36613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Mode mode_;
36621e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block};
36631e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
36641e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
36653fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HStoreContextSlot: public HTemplateInstruction<2> {
36661e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public:
36673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  enum Mode {
36683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // Perform a normal store to the context slot without checking its previous
36693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // value.
36703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    kNoCheck,
36713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // Check the previous value of the context slot and deoptimize if it's the
36723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // hole value. This is used for checking for assignments to uninitialized
36733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // harmony bindings where we deoptimize into full-codegen generated code
36743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // which will subsequently throw a reference error.
36753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    kCheckDeoptimize,
36763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // Check the previous value and ignore assignment if it isn't a hole value
36773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    kCheckIgnoreAssignment
36783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  };
36793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
36803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HStoreContextSlot(HValue* context, int slot_index, Mode mode, HValue* value)
36813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      : slot_index_(slot_index), mode_(mode) {
36823fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(0, context);
36833fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(1, value);
36843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    SetGVNFlag(kChangesContextSlots);
36851e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
36861e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
3687e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* context() { return OperandAt(0); }
3688e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* value() { return OperandAt(1); }
36891e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  int slot_index() const { return slot_index_; }
36903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Mode mode() const { return mode_; }
36911e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
3692e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  bool NeedsWriteBarrier() {
36931e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return StoringValueNeedsWriteBarrier(value());
36941e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
36951e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
36963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool DeoptimizesOnHole() {
36973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return mode_ == kCheckDeoptimize;
36983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
36993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
37003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool RequiresHoleCheck() {
37013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return mode_ != kNoCheck;
37023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
37033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
37043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
37051e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return Representation::Tagged();
37061e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
37071e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
3708e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
37091e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
3710257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(StoreContextSlot)
37111e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
37121e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block private:
3713b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  int slot_index_;
37143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Mode mode_;
3715b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
3716b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
3717b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
3718b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HLoadNamedField: public HUnaryOperation {
3719b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
3720b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HLoadNamedField(HValue* object, bool is_in_object, int offset)
3721b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      : HUnaryOperation(object),
3722b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        is_in_object_(is_in_object),
3723b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        offset_(offset) {
3724b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
3725b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kUseGVN);
37263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    SetGVNFlag(kDependsOnMaps);
3727b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (is_in_object) {
37283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      SetGVNFlag(kDependsOnInobjectFields);
3729b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    } else {
37303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      SetGVNFlag(kDependsOnBackingStoreFields);
3731b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
3732b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3733b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3734e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* object() { return OperandAt(0); }
3735b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool is_in_object() const { return is_in_object_; }
3736b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int offset() const { return offset_; }
3737b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
37383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
3739b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return Representation::Tagged();
3740b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3741e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
3742b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3743257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(LoadNamedField)
3744b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3745b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
3746e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) {
3747b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    HLoadNamedField* b = HLoadNamedField::cast(other);
3748b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return is_in_object_ == b->is_in_object_ && offset_ == b->offset_;
3749b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3750b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3751b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
3752b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool is_in_object_;
3753b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int offset_;
3754b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3755b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3756b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
37573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HLoadNamedFieldPolymorphic: public HTemplateInstruction<2> {
375844f0eee88ff00398ff7f715fab053374d808c90dSteve Block public:
37593fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HLoadNamedFieldPolymorphic(HValue* context,
37603fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch                             HValue* object,
376169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch                             SmallMapList* types,
376244f0eee88ff00398ff7f715fab053374d808c90dSteve Block                             Handle<String> name);
376344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
37643fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* context() { return OperandAt(0); }
37653fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* object() { return OperandAt(1); }
376669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  SmallMapList* types() { return &types_; }
376744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Handle<String> name() { return name_; }
376844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  bool need_generic() { return need_generic_; }
376944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
37703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
377144f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return Representation::Tagged();
377244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
377344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
377469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  virtual void PrintDataTo(StringStream* stream);
377569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
3776257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(LoadNamedFieldPolymorphic)
377744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
377844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static const int kMaxLoadPolymorphism = 4;
377944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
378044f0eee88ff00398ff7f715fab053374d808c90dSteve Block protected:
378144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual bool DataEquals(HValue* value);
378244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
378344f0eee88ff00398ff7f715fab053374d808c90dSteve Block private:
378469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  SmallMapList types_;
378544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Handle<String> name_;
378644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  bool need_generic_;
378744f0eee88ff00398ff7f715fab053374d808c90dSteve Block};
378844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
378944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
379044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
37913fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HLoadNamedGeneric: public HTemplateInstruction<2> {
3792b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
37931e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HLoadNamedGeneric(HValue* context, HValue* object, Handle<Object> name)
37943fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : name_(name) {
37953fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(0, context);
37963fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(1, object);
3797b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
37981e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetAllSideEffects();
3799b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3800b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3801e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* context() { return OperandAt(0); }
3802e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* object() { return OperandAt(1); }
3803b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<Object> name() const { return name_; }
3804b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
38053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
3806b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return Representation::Tagged();
3807b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3808b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
380969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  virtual void PrintDataTo(StringStream* stream);
381069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
3811257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(LoadNamedGeneric)
3812b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3813b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
3814b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<Object> name_;
3815b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3816b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3817b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
38189fac840a46e8b7e26894f4792ba26dde14c56b04Steve Blockclass HLoadFunctionPrototype: public HUnaryOperation {
38199fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block public:
38209fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block  explicit HLoadFunctionPrototype(HValue* function)
38219fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block      : HUnaryOperation(function) {
38229fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block    set_representation(Representation::Tagged());
38231e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetFlag(kUseGVN);
38243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    SetGVNFlag(kDependsOnCalls);
38259fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block  }
38269fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block
3827e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* function() { return OperandAt(0); }
38289fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block
38293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
38309fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block    return Representation::Tagged();
38319fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block  }
38329fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block
3833257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(LoadFunctionPrototype)
38349fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block
38359fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block protected:
3836e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
38379fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block};
38389fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block
38399fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block
38403fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HLoadKeyedFastElement: public HTemplateInstruction<2> {
3841b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
38423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  enum HoleCheckMode { PERFORM_HOLE_CHECK, OMIT_HOLE_CHECK };
38433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
38443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HLoadKeyedFastElement(HValue* obj,
38453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                        HValue* key,
38463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                        HoleCheckMode hole_check_mode = PERFORM_HOLE_CHECK)
38473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      : hole_check_mode_(hole_check_mode) {
38483fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(0, obj);
38493fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(1, key);
3850b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
38513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    SetGVNFlag(kDependsOnArrayElements);
3852b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kUseGVN);
3853b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3854b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3855e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* object() { return OperandAt(0); }
3856e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* key() { return OperandAt(1); }
3857e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
38583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
3859b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // The key is supposed to be Integer32.
38603fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return index == 0
38613fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      ? Representation::Tagged()
38623fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : Representation::Integer32();
3863b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3864b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3865e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
3866e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
38673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool RequiresHoleCheck();
3868257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
3869257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(LoadKeyedFastElement)
38701e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
38711e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
38723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual bool DataEquals(HValue* other) {
38733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (!other->IsLoadKeyedFastElement()) return false;
38743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HLoadKeyedFastElement* other_load = HLoadKeyedFastElement::cast(other);
38753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return hole_check_mode_ == other_load->hole_check_mode_;
38763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
38773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
38783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private:
38793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HoleCheckMode hole_check_mode_;
38801e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block};
38811e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
38821e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
38833fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HLoadKeyedFastDoubleElement: public HTemplateInstruction<2> {
38843fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch public:
38853fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HLoadKeyedFastDoubleElement(HValue* elements, HValue* key) {
38863fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(0, elements);
38873fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(1, key);
38883fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    set_representation(Representation::Double());
38893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    SetGVNFlag(kDependsOnDoubleArrayElements);
38903fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetFlag(kUseGVN);
38913fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
38923fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
38933fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* elements() { return OperandAt(0); }
38943fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* key() { return OperandAt(1); }
38953fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
38963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
38973fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    // The key is supposed to be Integer32.
38983fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return index == 0
38993fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      ? Representation::Tagged()
39003fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : Representation::Integer32();
39013fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
39023fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
39033fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  virtual void PrintDataTo(StringStream* stream);
39043fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
39053fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(LoadKeyedFastDoubleElement)
39063fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
39073fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch protected:
39083fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  virtual bool DataEquals(HValue* other) { return true; }
39093fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch};
39103fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
39113fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
39123fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HLoadKeyedSpecializedArrayElement: public HTemplateInstruction<2> {
39131e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public:
391444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  HLoadKeyedSpecializedArrayElement(HValue* external_elements,
391544f0eee88ff00398ff7f715fab053374d808c90dSteve Block                                    HValue* key,
3916589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch                                    ElementsKind elements_kind)
39173fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      :  elements_kind_(elements_kind) {
39183fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(0, external_elements);
39193fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(1, key);
3920589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    if (elements_kind == EXTERNAL_FLOAT_ELEMENTS ||
3921589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch        elements_kind == EXTERNAL_DOUBLE_ELEMENTS) {
392244f0eee88ff00398ff7f715fab053374d808c90dSteve Block      set_representation(Representation::Double());
392344f0eee88ff00398ff7f715fab053374d808c90dSteve Block    } else {
392444f0eee88ff00398ff7f715fab053374d808c90dSteve Block      set_representation(Representation::Integer32());
392544f0eee88ff00398ff7f715fab053374d808c90dSteve Block    }
39263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    SetGVNFlag(kDependsOnSpecializedArrayElements);
392744f0eee88ff00398ff7f715fab053374d808c90dSteve Block    // Native code could change the specialized array.
39283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    SetGVNFlag(kDependsOnCalls);
39291e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetFlag(kUseGVN);
39301e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
39311e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
3932e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
39331e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
39343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
39351e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    // The key is supposed to be Integer32, but the base pointer
39361e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    // for the element load is a naked pointer.
39373fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return index == 0
39383fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      ? Representation::External()
39393fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : Representation::Integer32();
39401e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
39411e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
3942e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* external_pointer() { return OperandAt(0); }
3943e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* key() { return OperandAt(1); }
3944589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  ElementsKind elements_kind() const { return elements_kind_; }
39451e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
39463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Range* InferRange(Zone* zone);
39473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3948257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(LoadKeyedSpecializedArrayElement)
39491e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
39501e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
395144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual bool DataEquals(HValue* other) {
395244f0eee88ff00398ff7f715fab053374d808c90dSteve Block    if (!other->IsLoadKeyedSpecializedArrayElement()) return false;
395344f0eee88ff00398ff7f715fab053374d808c90dSteve Block    HLoadKeyedSpecializedArrayElement* cast_other =
395444f0eee88ff00398ff7f715fab053374d808c90dSteve Block        HLoadKeyedSpecializedArrayElement::cast(other);
39553fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return elements_kind_ == cast_other->elements_kind();
395644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
395744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
395844f0eee88ff00398ff7f715fab053374d808c90dSteve Block private:
3959589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  ElementsKind elements_kind_;
3960b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3961b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3962b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3963e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HLoadKeyedGeneric: public HTemplateInstruction<3> {
3964b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
3965257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HLoadKeyedGeneric(HValue* context, HValue* obj, HValue* key) {
3966e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    set_representation(Representation::Tagged());
3967e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    SetOperandAt(0, obj);
3968e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    SetOperandAt(1, key);
39691e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetOperandAt(2, context);
39701e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetAllSideEffects();
39711e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
39721e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
3973e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* object() { return OperandAt(0); }
3974e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* key() { return OperandAt(1); }
3975e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* context() { return OperandAt(2); }
39769fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block
3977e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
3978b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
39793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
3980b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return Representation::Tagged();
3981b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3982b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
39833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual HValue* Canonicalize();
39843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3985257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(LoadKeyedGeneric)
3986b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3987b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3988b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
39893fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HStoreNamedField: public HTemplateInstruction<2> {
3990b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
3991b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HStoreNamedField(HValue* obj,
39921e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block                   Handle<String> name,
3993b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch                   HValue* val,
3994b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch                   bool in_object,
3995b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch                   int offset)
39963fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : name_(name),
3997b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        is_in_object_(in_object),
3998b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        offset_(offset) {
39993fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(0, obj);
40003fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(1, val);
4001b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (is_in_object_) {
40023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      SetGVNFlag(kChangesInobjectFields);
4003b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    } else {
40043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      SetGVNFlag(kChangesBackingStoreFields);
4005b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
4006b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
4007b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4008257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(StoreNamedField)
4009b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
40103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
40111e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return Representation::Tagged();
4012b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
4013e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
4014e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
4015e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* object() { return OperandAt(0); }
4016e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* value() { return OperandAt(1); }
4017b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4018e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  Handle<String> name() const { return name_; }
4019b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool is_in_object() const { return is_in_object_; }
4020b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int offset() const { return offset_; }
4021b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<Map> transition() const { return transition_; }
4022b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void set_transition(Handle<Map> map) { transition_ = map; }
4023b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4024e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  bool NeedsWriteBarrier() {
40251e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return StoringValueNeedsWriteBarrier(value());
40261e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
40271e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
4028b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
4029e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  Handle<String> name_;
4030b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool is_in_object_;
4031b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int offset_;
4032b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<Map> transition_;
4033b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
4034b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4035b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4036e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HStoreNamedGeneric: public HTemplateInstruction<3> {
4037b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
40381e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HStoreNamedGeneric(HValue* context,
40391e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block                     HValue* object,
40401e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block                     Handle<String> name,
40418b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch                     HValue* value,
40423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                     StrictModeFlag strict_mode_flag)
40438b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch      : name_(name),
40443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        strict_mode_flag_(strict_mode_flag) {
4045e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    SetOperandAt(0, object);
4046e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    SetOperandAt(1, value);
40471e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetOperandAt(2, context);
40481e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetAllSideEffects();
40491e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
40501e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
4051e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* object() { return OperandAt(0); }
4052e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* value() { return OperandAt(1); }
4053e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* context() { return OperandAt(2); }
4054e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  Handle<String> name() { return name_; }
40553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  StrictModeFlag strict_mode_flag() { return strict_mode_flag_; }
40561e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
4057e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
40581e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
40593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
4060e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::Tagged();
4061b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
4062b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4063257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(StoreNamedGeneric)
40641e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
40651e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block private:
4066e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  Handle<String> name_;
40673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  StrictModeFlag strict_mode_flag_;
4068b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
4069b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4070b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4071e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HStoreKeyedFastElement: public HTemplateInstruction<3> {
4072b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
40733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HStoreKeyedFastElement(HValue* obj, HValue* key, HValue* val,
40743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                         ElementsKind elements_kind = FAST_ELEMENTS)
40753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      : elements_kind_(elements_kind) {
4076b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetOperandAt(0, obj);
4077b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetOperandAt(1, key);
4078b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetOperandAt(2, val);
40793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    SetGVNFlag(kChangesArrayElements);
4080b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
4081b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
40823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
4083e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    // The key is supposed to be Integer32.
40843fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return index == 1
40853fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        ? Representation::Integer32()
4086e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        : Representation::Tagged();
4087b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
4088b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4089e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* object() { return OperandAt(0); }
4090e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* key() { return OperandAt(1); }
4091e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* value() { return OperandAt(2); }
40923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool value_is_smi() {
40933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return elements_kind_ == FAST_SMI_ONLY_ELEMENTS;
40943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
4095b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4096e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  bool NeedsWriteBarrier() {
40973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (value_is_smi()) {
40983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      return false;
40993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    } else {
41003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      return StoringValueNeedsWriteBarrier(value());
41013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
4102592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  }
4103592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
4104e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
4105b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4106257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(StoreKeyedFastElement)
41073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
41083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private:
41093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ElementsKind elements_kind_;
4110b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
4111b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4112b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
41133fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HStoreKeyedFastDoubleElement: public HTemplateInstruction<3> {
41143fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch public:
41153fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HStoreKeyedFastDoubleElement(HValue* elements,
41163fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch                               HValue* key,
41173fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch                               HValue* val) {
41183fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(0, elements);
41193fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(1, key);
41203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(2, val);
41213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    SetGVNFlag(kChangesDoubleArrayElements);
41223fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
41233fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
41243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
41253fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    if (index == 1) {
41263fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      return Representation::Integer32();
41273fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    } else if (index == 2) {
41283fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      return Representation::Double();
41293fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    } else {
41303fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      return Representation::Tagged();
41313fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    }
41323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
41333fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
41343fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* elements() { return OperandAt(0); }
41353fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* key() { return OperandAt(1); }
41363fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* value() { return OperandAt(2); }
41373fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
41383fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  bool NeedsWriteBarrier() {
41393fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return StoringValueNeedsWriteBarrier(value());
41403fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
41413fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
41423fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  virtual void PrintDataTo(StringStream* stream);
41433fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
41443fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(StoreKeyedFastDoubleElement)
41453fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch};
41463fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
41473fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
414844f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass HStoreKeyedSpecializedArrayElement: public HTemplateInstruction<3> {
4149b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
415044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  HStoreKeyedSpecializedArrayElement(HValue* external_elements,
415144f0eee88ff00398ff7f715fab053374d808c90dSteve Block                                     HValue* key,
415244f0eee88ff00398ff7f715fab053374d808c90dSteve Block                                     HValue* val,
4153589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch                                     ElementsKind elements_kind)
41543fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : elements_kind_(elements_kind) {
41553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    SetGVNFlag(kChangesSpecializedArrayElements);
4156e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    SetOperandAt(0, external_elements);
4157e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    SetOperandAt(1, key);
4158e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    SetOperandAt(2, val);
4159b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
4160b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4161e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
4162e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
41633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
4164e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    if (index == 0) {
4165e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      return Representation::External();
4166e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    } else {
41673fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      bool float_or_double_elements =
4168589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch          elements_kind() == EXTERNAL_FLOAT_ELEMENTS ||
4169589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch          elements_kind() == EXTERNAL_DOUBLE_ELEMENTS;
41703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      if (index == 2 && float_or_double_elements) {
417144f0eee88ff00398ff7f715fab053374d808c90dSteve Block        return Representation::Double();
417244f0eee88ff00398ff7f715fab053374d808c90dSteve Block      } else {
417344f0eee88ff00398ff7f715fab053374d808c90dSteve Block        return Representation::Integer32();
417444f0eee88ff00398ff7f715fab053374d808c90dSteve Block      }
4175e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    }
4176b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
4177b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4178e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* external_pointer() { return OperandAt(0); }
4179e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* key() { return OperandAt(1); }
4180e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* value() { return OperandAt(2); }
4181589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  ElementsKind elements_kind() const { return elements_kind_; }
4182e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
4183257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(StoreKeyedSpecializedArrayElement)
4184257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
418544f0eee88ff00398ff7f715fab053374d808c90dSteve Block private:
4186589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  ElementsKind elements_kind_;
4187b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
4188b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4189b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4190e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HStoreKeyedGeneric: public HTemplateInstruction<4> {
4191b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
41921e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HStoreKeyedGeneric(HValue* context,
41931e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block                     HValue* object,
41941e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block                     HValue* key,
41958b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch                     HValue* value,
41963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                     StrictModeFlag strict_mode_flag)
41973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      : strict_mode_flag_(strict_mode_flag) {
4198e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    SetOperandAt(0, object);
4199e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    SetOperandAt(1, key);
4200e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    SetOperandAt(2, value);
42011e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetOperandAt(3, context);
42021e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetAllSideEffects();
42031e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
42041e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
4205e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* object() { return OperandAt(0); }
4206e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* key() { return OperandAt(1); }
4207e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* value() { return OperandAt(2); }
4208e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* context() { return OperandAt(3); }
42093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  StrictModeFlag strict_mode_flag() { return strict_mode_flag_; }
42101e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
42113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
4212e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::Tagged();
4213b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
4214b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4215e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
42161e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
4217257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(StoreKeyedGeneric)
42188b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
42198b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch private:
42203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  StrictModeFlag strict_mode_flag_;
42213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
42223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
42233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
42243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass HTransitionElementsKind: public HTemplateInstruction<1> {
42253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
42263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HTransitionElementsKind(HValue* object,
42273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                          Handle<Map> original_map,
42283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                          Handle<Map> transitioned_map)
42293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      : original_map_(original_map),
42303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        transitioned_map_(transitioned_map) {
42313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    SetOperandAt(0, object);
42323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    SetFlag(kUseGVN);
42333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    SetGVNFlag(kChangesElementsKind);
42343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    SetGVNFlag(kChangesElementsPointer);
42353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    set_representation(Representation::Tagged());
42363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
42373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
42383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
42393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return Representation::Tagged();
42403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
42413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
42423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HValue* object() { return OperandAt(0); }
42433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Handle<Map> original_map() { return original_map_; }
42443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Handle<Map> transitioned_map() { return transitioned_map_; }
42453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
42463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual void PrintDataTo(StringStream* stream);
42473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
42483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(TransitionElementsKind)
42493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
42503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch protected:
42513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual bool DataEquals(HValue* other) {
42523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HTransitionElementsKind* instr = HTransitionElementsKind::cast(other);
42533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return original_map_.is_identical_to(instr->original_map()) &&
42543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        transitioned_map_.is_identical_to(instr->transitioned_map());
42553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
42563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
42573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private:
42583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Handle<Map> original_map_;
42593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Handle<Map> transitioned_map_;
42608b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch};
42618b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
42628b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
4263257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochclass HStringAdd: public HBinaryOperation {
4264257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public:
42653fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HStringAdd(HValue* context, HValue* left, HValue* right)
42663fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : HBinaryOperation(context, left, right) {
4267257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    set_representation(Representation::Tagged());
4268257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    SetFlag(kUseGVN);
42693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    SetGVNFlag(kDependsOnMaps);
4270257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
4271257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
42723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
4273257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return Representation::Tagged();
4274257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
4275257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
4276257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  virtual HType CalculateInferredType() {
4277257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return HType::String();
4278257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
4279257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
4280257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(StringAdd)
4281257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
4282257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch protected:
4283257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  virtual bool DataEquals(HValue* other) { return true; }
4284257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
4285257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
4286257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
42873fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HStringCharCodeAt: public HTemplateInstruction<3> {
42881e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public:
42893fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HStringCharCodeAt(HValue* context, HValue* string, HValue* index) {
42903fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(0, context);
42913fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(1, string);
42923fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(2, index);
42931e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    set_representation(Representation::Integer32());
42941e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetFlag(kUseGVN);
42953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    SetGVNFlag(kDependsOnMaps);
42961e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
42971e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
42983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
42991e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    // The index is supposed to be Integer32.
43003fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return index == 2
43013fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        ? Representation::Integer32()
43021e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block        : Representation::Tagged();
43031e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
43041e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
43053fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* context() { return OperandAt(0); }
43063fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* string() { return OperandAt(1); }
43073fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* index() { return OperandAt(2); }
43081e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
4309257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(StringCharCodeAt)
43101e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
43111e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
4312e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
43131e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
43143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Range* InferRange(Zone* zone) {
43153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return new(zone) Range(0, String::kMaxUtf16CodeUnit);
43161e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
43171e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block};
43181e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
43191e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
43203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HStringCharFromCode: public HTemplateInstruction<2> {
432144f0eee88ff00398ff7f715fab053374d808c90dSteve Block public:
43223fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HStringCharFromCode(HValue* context, HValue* char_code) {
43233fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(0, context);
43243fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(1, char_code);
43253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    set_representation(Representation::Tagged());
432644f0eee88ff00398ff7f715fab053374d808c90dSteve Block    SetFlag(kUseGVN);
432744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
432844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
43293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
43303fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return index == 0
43313fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        ? Representation::Tagged()
43323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        : Representation::Integer32();
433344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
43343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual HType CalculateInferredType();
433544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
43363fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* context() { return OperandAt(0); }
43373fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* value() { return OperandAt(1); }
43383fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
433944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual bool DataEquals(HValue* other) { return true; }
434044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
4341257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(StringCharFromCode)
434244f0eee88ff00398ff7f715fab053374d808c90dSteve Block};
434344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
434444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
43451e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HStringLength: public HUnaryOperation {
43461e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public:
43471e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  explicit HStringLength(HValue* string) : HUnaryOperation(string) {
43481e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    set_representation(Representation::Tagged());
43491e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetFlag(kUseGVN);
43503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    SetGVNFlag(kDependsOnMaps);
43511e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
43521e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
43533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
43541e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return Representation::Tagged();
43551e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
43561e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
4357e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual HType CalculateInferredType() {
43581e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    STATIC_ASSERT(String::kMaxLength <= Smi::kMaxValue);
43591e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return HType::Smi();
43601e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
43611e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
4362257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(StringLength)
43631e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
43641e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
4365e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
43661e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
43673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Range* InferRange(Zone* zone) {
43683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return new(zone) Range(0, String::kMaxLength);
43693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
43703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
43713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
43723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
43733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass HAllocateObject: public HTemplateInstruction<1> {
43743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
43753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HAllocateObject(HValue* context, Handle<JSFunction> constructor)
43763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      : constructor_(constructor) {
43773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    SetOperandAt(0, context);
43783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    set_representation(Representation::Tagged());
43793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
43803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
43813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HValue* context() { return OperandAt(0); }
43823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Handle<JSFunction> constructor() { return constructor_; }
43833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
43843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
43853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return Representation::Tagged();
43865d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch  }
43873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual HType CalculateInferredType();
43883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
43893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(AllocateObject)
43903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
43913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private:
43923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Handle<JSFunction> constructor_;
43935d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch};
43945d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch
43955d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch
4396e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochtemplate <int V>
4397e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HMaterializedLiteral: public HTemplateInstruction<V> {
4398b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
4399e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HMaterializedLiteral<V>(int index, int depth)
4400b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      : literal_index_(index), depth_(depth) {
4401e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    this->set_representation(Representation::Tagged());
4402b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
4403b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4404b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int literal_index() const { return literal_index_; }
4405b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int depth() const { return depth_; }
4406b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4407b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
4408b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int literal_index_;
4409b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int depth_;
4410b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
4411b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4412b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
44133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass HFastLiteral: public HMaterializedLiteral<1> {
44143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
44153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HFastLiteral(HValue* context,
44163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch               Handle<JSObject> boilerplate,
44173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch               int total_size,
44183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch               int literal_index,
44193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch               int depth)
44203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      : HMaterializedLiteral<1>(literal_index, depth),
44213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        boilerplate_(boilerplate),
44223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        total_size_(total_size) {
44233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    SetOperandAt(0, context);
44243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
44253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
44263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Maximum depth and total number of elements and properties for literal
44273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // graphs to be considered for fast deep-copying.
44283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  static const int kMaxLiteralDepth = 3;
44293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  static const int kMaxLiteralProperties = 8;
44303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
44313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HValue* context() { return OperandAt(0); }
44323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Handle<JSObject> boilerplate() const { return boilerplate_; }
44333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  int total_size() const { return total_size_; }
44343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
44353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
44363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return Representation::Tagged();
44373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
44383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual HType CalculateInferredType();
44393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
44403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(FastLiteral)
44413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
44423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private:
44433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Handle<JSObject> boilerplate_;
44443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  int total_size_;
44453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
44463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
44473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
44483fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HArrayLiteral: public HMaterializedLiteral<1> {
4449b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
44503fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HArrayLiteral(HValue* context,
44513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                Handle<HeapObject> boilerplate_object,
4452b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch                int length,
4453b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch                int literal_index,
4454b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch                int depth)
44553fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : HMaterializedLiteral<1>(literal_index, depth),
4456b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        length_(length),
44573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        boilerplate_object_(boilerplate_object) {
44583fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(0, context);
44593fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
4460b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
44613fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* context() { return OperandAt(0); }
44623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ElementsKind boilerplate_elements_kind() const {
44633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (!boilerplate_object_->IsJSObject()) {
44643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      return FAST_ELEMENTS;
44653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
44663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return Handle<JSObject>::cast(boilerplate_object_)->GetElementsKind();
44673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
44683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Handle<HeapObject> boilerplate_object() const { return boilerplate_object_; }
4469b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int length() const { return length_; }
4470b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4471b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool IsCopyOnWrite() const;
4472b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
44733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
44743fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return Representation::Tagged();
4475e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
44763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual HType CalculateInferredType();
4477e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
4478257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(ArrayLiteral)
4479b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4480b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
4481b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int length_;
44823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Handle<HeapObject> boilerplate_object_;
4483b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
4484b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4485b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
44865d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdochclass HObjectLiteral: public HMaterializedLiteral<1> {
4487592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch public:
44885d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch  HObjectLiteral(HValue* context,
44895d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch                 Handle<FixedArray> constant_properties,
44905d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch                 bool fast_elements,
44915d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch                 int literal_index,
44925d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch                 int depth,
44935d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch                 bool has_function)
4494e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      : HMaterializedLiteral<1>(literal_index, depth),
4495b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        constant_properties_(constant_properties),
449644f0eee88ff00398ff7f715fab053374d808c90dSteve Block        fast_elements_(fast_elements),
449744f0eee88ff00398ff7f715fab053374d808c90dSteve Block        has_function_(has_function) {
44981e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetOperandAt(0, context);
44991e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
4500b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4501e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* context() { return OperandAt(0); }
4502b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<FixedArray> constant_properties() const {
4503b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return constant_properties_;
4504b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
4505b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool fast_elements() const { return fast_elements_; }
450644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  bool has_function() const { return has_function_; }
4507b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
45083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
4509e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::Tagged();
4510e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
45113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual HType CalculateInferredType();
45121e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
45135d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(ObjectLiteral)
4514b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4515b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
4516b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<FixedArray> constant_properties_;
4517b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool fast_elements_;
451844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  bool has_function_;
4519b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
4520b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4521b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
45223fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HRegExpLiteral: public HMaterializedLiteral<1> {
4523b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
45243fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HRegExpLiteral(HValue* context,
45253fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch                 Handle<String> pattern,
4526b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch                 Handle<String> flags,
4527b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch                 int literal_index)
45283fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : HMaterializedLiteral<1>(literal_index, 0),
4529b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        pattern_(pattern),
45303fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        flags_(flags) {
45313fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(0, context);
45322b4ba1175df6a5a6b9b5cda034189197bf6565ecBen Murdoch    SetAllSideEffects();
45333fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
4534b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
45353fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* context() { return OperandAt(0); }
4536b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<String> pattern() { return pattern_; }
4537b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<String> flags() { return flags_; }
4538b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
45393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
45403fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return Representation::Tagged();
4541e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
45423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual HType CalculateInferredType();
4543e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
4544257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(RegExpLiteral)
4545b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4546b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
4547b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<String> pattern_;
4548b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<String> flags_;
4549b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
4550b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4551b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
45523fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HFunctionLiteral: public HTemplateInstruction<1> {
4553b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
45543fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HFunctionLiteral(HValue* context,
45553fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch                   Handle<SharedFunctionInfo> shared,
45563fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch                   bool pretenure)
4557b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      : shared_info_(shared), pretenure_(pretenure) {
45583fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(0, context);
4559b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
4560b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
4561b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
45623fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* context() { return OperandAt(0); }
45633fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
45643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
45653fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return Representation::Tagged();
4566e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
45673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual HType CalculateInferredType();
4568e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
4569257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(FunctionLiteral)
4570b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4571b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<SharedFunctionInfo> shared_info() const { return shared_info_; }
4572b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool pretenure() const { return pretenure_; }
4573b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4574b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
4575b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<SharedFunctionInfo> shared_info_;
4576b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool pretenure_;
4577b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
4578b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4579b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
45803fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HTypeof: public HTemplateInstruction<2> {
4581b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
45823fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  explicit HTypeof(HValue* context, HValue* value) {
45833fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(0, context);
45843fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(1, value);
4585b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
4586b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
4587b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
45883fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* context() { return OperandAt(0); }
45893fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* value() { return OperandAt(1); }
45903fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
45913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual HValue* Canonicalize();
45923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual void PrintDataTo(StringStream* stream);
45933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
45943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
45951e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return Representation::Tagged();
45961e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
45971e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
4598257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Typeof)
4599b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
4600b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4601b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
460244f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass HToFastProperties: public HUnaryOperation {
460344f0eee88ff00398ff7f715fab053374d808c90dSteve Block public:
460444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  explicit HToFastProperties(HValue* value) : HUnaryOperation(value) {
460544f0eee88ff00398ff7f715fab053374d808c90dSteve Block    // This instruction is not marked as having side effects, but
460644f0eee88ff00398ff7f715fab053374d808c90dSteve Block    // changes the map of the input operand. Use it only when creating
460744f0eee88ff00398ff7f715fab053374d808c90dSteve Block    // object literals.
46083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    ASSERT(value->IsObjectLiteral() || value->IsFastLiteral());
460944f0eee88ff00398ff7f715fab053374d808c90dSteve Block    set_representation(Representation::Tagged());
461044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
461144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
46123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
461344f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return Representation::Tagged();
461444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
461544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
4616257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(ToFastProperties)
461744f0eee88ff00398ff7f715fab053374d808c90dSteve Block};
461844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
461944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
4620b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HValueOf: public HUnaryOperation {
4621b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
4622b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  explicit HValueOf(HValue* value) : HUnaryOperation(value) {
4623b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
4624b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
4625b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
46263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
4627e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::Tagged();
4628e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
4629e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
4630257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(ValueOf)
4631b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
4632b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4633b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
46343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass HDateField: public HUnaryOperation {
46353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
46363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HDateField(HValue* date, Smi* index)
46373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      : HUnaryOperation(date), index_(index) {
46383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    set_representation(Representation::Tagged());
46393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
46403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
46413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Smi* index() const { return index_; }
46423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
46433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
46443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return Representation::Tagged();
46453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
46463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
46473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(DateField)
46483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
46493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private:
46503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Smi* index_;
46513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
46523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
46533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4654b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HDeleteProperty: public HBinaryOperation {
4655b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
46563fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HDeleteProperty(HValue* context, HValue* obj, HValue* key)
46573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : HBinaryOperation(context, obj, key) {
4658b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
46591e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetAllSideEffects();
4660b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
4661b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
46623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
4663b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return Representation::Tagged();
4664b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
4665b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
46663fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  virtual HType CalculateInferredType();
46673fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
4668257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(DeleteProperty)
4669b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4670e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* object() { return left(); }
4671e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* key() { return right(); }
4672b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
4673b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4674257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
46753fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HIn: public HTemplateInstruction<3> {
4676257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public:
46773fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HIn(HValue* context, HValue* key, HValue* object) {
46783fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(0, context);
46793fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(1, key);
46803fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(2, object);
4681257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    set_representation(Representation::Tagged());
4682257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    SetAllSideEffects();
4683257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
4684257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
46853fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* context() { return OperandAt(0); }
46863fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* key() { return OperandAt(1); }
46873fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* object() { return OperandAt(2); }
4688257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
46893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
4690257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return Representation::Tagged();
4691257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
4692257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
4693257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  virtual HType CalculateInferredType() {
4694257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return HType::Boolean();
4695257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
4696257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
4697257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  virtual void PrintDataTo(StringStream* stream);
4698257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
4699257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(In)
4700257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
4701257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
47023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
47033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass HCheckMapValue: public HTemplateInstruction<2> {
47043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
47053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HCheckMapValue(HValue* value,
47063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                 HValue* map) {
47073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    SetOperandAt(0, value);
47083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    SetOperandAt(1, map);
47093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    set_representation(Representation::Tagged());
47103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    SetFlag(kUseGVN);
47113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    SetGVNFlag(kDependsOnMaps);
47123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    SetGVNFlag(kDependsOnElementsKind);
47133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
47143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
47153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
47163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return Representation::Tagged();
47173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
47183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
47193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual void PrintDataTo(StringStream* stream);
47203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
47213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual HType CalculateInferredType() {
47223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return HType::Tagged();
47233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
47243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
47253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HValue* value() { return OperandAt(0); }
47263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HValue* map() { return OperandAt(1); }
47273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
47283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(CheckMapValue)
47293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
47303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch protected:
47313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual bool DataEquals(HValue* other) {
47323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return true;
47333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
47343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
47353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
47363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
47373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass HForInPrepareMap : public HTemplateInstruction<2> {
47383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
47393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HForInPrepareMap(HValue* context,
47403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                   HValue* object) {
47413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    SetOperandAt(0, context);
47423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    SetOperandAt(1, object);
47433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    set_representation(Representation::Tagged());
47443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    SetAllSideEffects();
47453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
47463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
47473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
47483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return Representation::Tagged();
47493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
47503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
47513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HValue* context() { return OperandAt(0); }
47523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HValue* enumerable() { return OperandAt(1); }
47533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
47543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual void PrintDataTo(StringStream* stream);
47553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
47563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual HType CalculateInferredType() {
47573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return HType::Tagged();
47583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
47593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
47603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(ForInPrepareMap);
47613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
47623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
47633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
47643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass HForInCacheArray : public HTemplateInstruction<2> {
47653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
47663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HForInCacheArray(HValue* enumerable,
47673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                   HValue* keys,
47683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                   int idx) : idx_(idx) {
47693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    SetOperandAt(0, enumerable);
47703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    SetOperandAt(1, keys);
47713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    set_representation(Representation::Tagged());
47723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
47733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
47743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
47753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return Representation::Tagged();
47763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
47773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
47783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HValue* enumerable() { return OperandAt(0); }
47793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HValue* map() { return OperandAt(1); }
47803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  int idx() { return idx_; }
47813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
47823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HForInCacheArray* index_cache() {
47833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return index_cache_;
47843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
47853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
47863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  void set_index_cache(HForInCacheArray* index_cache) {
47873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    index_cache_ = index_cache;
47883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
47893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
47903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual void PrintDataTo(StringStream* stream);
47913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
47923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual HType CalculateInferredType() {
47933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return HType::Tagged();
47943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
47953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
47963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(ForInCacheArray);
47973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
47983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private:
47993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  int idx_;
48003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HForInCacheArray* index_cache_;
48013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
48023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
48033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
48043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass HLoadFieldByIndex : public HTemplateInstruction<2> {
48053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
48063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HLoadFieldByIndex(HValue* object,
48073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                    HValue* index) {
48083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    SetOperandAt(0, object);
48093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    SetOperandAt(1, index);
48103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    set_representation(Representation::Tagged());
48113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
48123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
48133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
48143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return Representation::Tagged();
48153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
48163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
48173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HValue* object() { return OperandAt(0); }
48183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HValue* index() { return OperandAt(1); }
48193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
48203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual void PrintDataTo(StringStream* stream);
48213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
48223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual HType CalculateInferredType() {
48233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return HType::Tagged();
48243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
48253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
48263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(LoadFieldByIndex);
48273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
48283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
48293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4830b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#undef DECLARE_INSTRUCTION
4831b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#undef DECLARE_CONCRETE_INSTRUCTION
4832b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4833b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} }  // namespace v8::internal
4834b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4835b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif  // V8_HYDROGEN_INSTRUCTIONS_H_
4836