hydrogen-instructions.h revision 257744e915dfc84d6d07a6b2accf8402d9ffc708
11e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// Copyright 2011 the V8 project authors. All rights reserved.
2b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// Redistribution and use in source and binary forms, with or without
3b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// modification, are permitted provided that the following conditions are
4b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// met:
5b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch//
6b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch//     * Redistributions of source code must retain the above copyright
7b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch//       notice, this list of conditions and the following disclaimer.
8b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch//     * Redistributions in binary form must reproduce the above
9b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch//       copyright notice, this list of conditions and the following
10b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch//       disclaimer in the documentation and/or other materials provided
11b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch//       with the distribution.
12b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch//     * Neither the name of Google Inc. nor the names of its
13b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch//       contributors may be used to endorse or promote products derived
14b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch//       from this software without specific prior written permission.
15b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch//
16b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
28b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifndef V8_HYDROGEN_INSTRUCTIONS_H_
29b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#define V8_HYDROGEN_INSTRUCTIONS_H_
30b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
31b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#include "v8.h"
3244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
33257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#include "allocation.h"
34b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#include "code-stubs.h"
35257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#include "data-flow.h"
3644f0eee88ff00398ff7f715fab053374d808c90dSteve Block#include "small-pointer-list.h"
37b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#include "string-stream.h"
38b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#include "zone.h"
39b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
40b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochnamespace v8 {
41b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochnamespace internal {
42b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
43b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// Forward declarations.
44b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HBasicBlock;
45b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HEnvironment;
46b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HInstruction;
47b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HLoopInformation;
48b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HValue;
49b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass LInstruction;
50b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass LChunkBuilder;
51b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
52b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
53257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#define HYDROGEN_ABSTRACT_INSTRUCTION_LIST(V)  \
54b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(BitwiseBinaryOperation)                    \
55b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(ControlInstruction)                        \
56b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(Instruction)                               \
57b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
58b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
59b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#define HYDROGEN_CONCRETE_INSTRUCTION_LIST(V)  \
601e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  V(AbnormalExit)                              \
61b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(AccessArgumentsAt)                         \
62b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(Add)                                       \
63b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(ApplyArguments)                            \
64b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(ArgumentsElements)                         \
65b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(ArgumentsLength)                           \
66b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(ArgumentsObject)                           \
67b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(ArrayLiteral)                              \
68b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(BitAnd)                                    \
69b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(BitNot)                                    \
70b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(BitOr)                                     \
71b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(BitXor)                                    \
72b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(BlockEntry)                                \
73b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(BoundsCheck)                               \
74b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(CallConstantFunction)                      \
75b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(CallFunction)                              \
76b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(CallGlobal)                                \
77b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(CallKeyed)                                 \
78b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(CallKnownGlobal)                           \
79b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(CallNamed)                                 \
80b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(CallNew)                                   \
81b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(CallRuntime)                               \
82b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(CallStub)                                  \
83b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(Change)                                    \
84b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(CheckFunction)                             \
85b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(CheckInstanceType)                         \
86b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(CheckMap)                                  \
87b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(CheckNonSmi)                               \
88b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(CheckPrototypeMaps)                        \
89b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(CheckSmi)                                  \
90257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(ClampToUint8)                              \
9144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(ClassOfTest)                               \
92b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(Compare)                                   \
93b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(CompareJSObjectEq)                         \
941e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  V(CompareMap)                                \
95257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(CompareSymbolEq)                           \
96b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(Constant)                                  \
971e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  V(Context)                                   \
98b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(DeleteProperty)                            \
99b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(Deoptimize)                                \
100b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(Div)                                       \
101b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(EnterInlined)                              \
10244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(ExternalArrayLength)                       \
1039fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block  V(FixedArrayLength)                          \
104257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(ForceRepresentation)                       \
105b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(FunctionLiteral)                           \
106e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  V(GetCachedArrayIndex)                       \
107b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(GlobalObject)                              \
108b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(GlobalReceiver)                            \
109b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(Goto)                                      \
11044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(HasInstanceType)                           \
11144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(HasCachedArrayIndex)                       \
112257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(In)                                        \
113b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(InstanceOf)                                \
114086aeeaae12517475c22695a200be45495516549Ben Murdoch  V(InstanceOfKnownGlobal)                     \
115257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(InvokeFunction)                            \
116257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(IsConstructCall)                           \
117b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(IsNull)                                    \
118b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(IsObject)                                  \
119b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(IsSmi)                                     \
120257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(IsUndetectable)                            \
1219fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block  V(JSArrayLength)                             \
122b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(LeaveInlined)                              \
123b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  V(LoadContextSlot)                           \
124b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(LoadElements)                              \
12544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(LoadExternalArrayPointer)                  \
1261e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  V(LoadFunctionPrototype)                     \
1278b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  V(LoadGlobalCell)                            \
1288b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  V(LoadGlobalGeneric)                         \
129b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(LoadKeyedFastElement)                      \
130b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(LoadKeyedGeneric)                          \
13144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(LoadKeyedSpecializedArrayElement)          \
132b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(LoadNamedField)                            \
13344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(LoadNamedFieldPolymorphic)                 \
134b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(LoadNamedGeneric)                          \
135b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(Mod)                                       \
136b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(Mul)                                       \
137b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(ObjectLiteral)                             \
138b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(OsrEntry)                                  \
1391e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  V(OuterContext)                              \
140b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(Parameter)                                 \
141b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(Power)                                     \
142b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(PushArgument)                              \
143b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(RegExpLiteral)                             \
144b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(Return)                                    \
145b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(Sar)                                       \
146b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(Shl)                                       \
147b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(Shr)                                       \
148b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(Simulate)                                  \
149b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(StackCheck)                                \
1501e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  V(StoreContextSlot)                          \
1518b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  V(StoreGlobalCell)                           \
1528b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  V(StoreGlobalGeneric)                        \
153b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(StoreKeyedFastElement)                     \
15444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(StoreKeyedSpecializedArrayElement)         \
155b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(StoreKeyedGeneric)                         \
156b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(StoreNamedField)                           \
157b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(StoreNamedGeneric)                         \
158257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(StringAdd)                                 \
1591e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  V(StringCharCodeAt)                          \
16044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(StringCharFromCode)                        \
1611e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  V(StringLength)                              \
162b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(Sub)                                       \
1631e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  V(Test)                                      \
164b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(Throw)                                     \
16544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(ToFastProperties)                          \
166b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(Typeof)                                    \
167b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(TypeofIs)                                  \
168b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(UnaryMathOperation)                        \
169b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(UnknownOSRValue)                           \
170b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(ValueOf)
171b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
172b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#define GVN_FLAG_LIST(V)                       \
173b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(Calls)                                     \
174b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(InobjectFields)                            \
175b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(BackingStoreFields)                        \
176b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(ArrayElements)                             \
17744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(SpecializedArrayElements)                  \
178b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(GlobalVars)                                \
179b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(Maps)                                      \
180b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(ArrayLengths)                              \
1811e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  V(ContextSlots)                              \
182b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(OsrEntries)
183b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
184257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#define DECLARE_ABSTRACT_INSTRUCTION(type)          \
185b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual bool Is##type() const { return true; }    \
186b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static H##type* cast(HValue* value) {             \
187b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(value->Is##type());                      \
188b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return reinterpret_cast<H##type*>(value);       \
189257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
190b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
191b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
192257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#define DECLARE_CONCRETE_INSTRUCTION(type)                        \
193b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual LInstruction* CompileToLithium(LChunkBuilder* builder); \
194257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  static H##type* cast(HValue* value) {                           \
195257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    ASSERT(value->Is##type());                                    \
196257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return reinterpret_cast<H##type*>(value);                     \
197257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }                                                               \
198257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  virtual Opcode opcode() const { return HValue::k##type; }
199b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
200b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
201b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass Range: public ZoneObject {
202b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
203e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  Range()
204e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      : lower_(kMinInt),
205e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        upper_(kMaxInt),
206e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        next_(NULL),
207e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        can_be_minus_zero_(false) { }
208b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
209b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Range(int32_t lower, int32_t upper)
210e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      : lower_(lower),
211e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        upper_(upper),
212e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        next_(NULL),
213e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        can_be_minus_zero_(false) { }
214b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
215b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int32_t upper() const { return upper_; }
216b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int32_t lower() const { return lower_; }
217b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Range* next() const { return next_; }
218b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Range* CopyClearLower() const { return new Range(kMinInt, upper_); }
219b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Range* CopyClearUpper() const { return new Range(lower_, kMaxInt); }
220b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Range* Copy() const { return new Range(lower_, upper_); }
221b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int32_t Mask() const;
222b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void set_can_be_minus_zero(bool b) { can_be_minus_zero_ = b; }
223b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool CanBeMinusZero() const { return CanBeZero() && can_be_minus_zero_; }
224b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool CanBeZero() const { return upper_ >= 0 && lower_ <= 0; }
225b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool CanBeNegative() const { return lower_ < 0; }
226e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  bool Includes(int value) const { return lower_ <= value && upper_ >= value; }
227e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  bool IsMostGeneric() const { return lower_ == kMinInt && upper_ == kMaxInt; }
228e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  bool IsInSmiRange() const {
229e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return lower_ >= Smi::kMinValue && upper_ <= Smi::kMaxValue;
230b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
231e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  void KeepOrder();
232e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  void Verify() const;
233b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
234b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void StackUpon(Range* other) {
235b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    Intersect(other);
236b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    next_ = other;
237b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
238b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
239e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  void Intersect(Range* other);
240e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  void Union(Range* other);
241b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
242e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  void AddConstant(int32_t value);
243e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  void Sar(int32_t value);
244e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  void Shl(int32_t value);
245b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool AddAndCheckOverflow(Range* other);
246b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool SubAndCheckOverflow(Range* other);
247b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool MulAndCheckOverflow(Range* other);
248b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
249b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
250b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int32_t lower_;
251b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int32_t upper_;
252b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Range* next_;
253b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool can_be_minus_zero_;
254b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
255b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
256b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
257b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass Representation {
258b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
259b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  enum Kind {
260b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kNone,
261b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kTagged,
262b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kDouble,
263b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kInteger32,
2641e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    kExternal,
265b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kNumRepresentations
266b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  };
267b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
268b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Representation() : kind_(kNone) { }
269b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
270b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static Representation None() { return Representation(kNone); }
271b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static Representation Tagged() { return Representation(kTagged); }
272b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static Representation Integer32() { return Representation(kInteger32); }
273b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static Representation Double() { return Representation(kDouble); }
2741e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  static Representation External() { return Representation(kExternal); }
275b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
276e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  bool Equals(const Representation& other) {
277b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return kind_ == other.kind_;
278b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
279b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2808b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  Kind kind() const { return static_cast<Kind>(kind_); }
281b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool IsNone() const { return kind_ == kNone; }
282b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool IsTagged() const { return kind_ == kTagged; }
283b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool IsInteger32() const { return kind_ == kInteger32; }
284b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool IsDouble() const { return kind_ == kDouble; }
2851e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  bool IsExternal() const { return kind_ == kExternal; }
286b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool IsSpecialization() const {
287b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return kind_ == kInteger32 || kind_ == kDouble;
288b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
289b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  const char* Mnemonic() const;
290b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
291b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
292b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  explicit Representation(Kind k) : kind_(k) { }
293b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2948b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  // Make sure kind fits in int8.
2958b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  STATIC_ASSERT(kNumRepresentations <= (1 << kBitsPerByte));
2968b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
2978b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  int8_t kind_;
298b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
299b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
300b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
301b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HType {
302b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
303b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HType() : type_(kUninitialized) { }
304b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
305b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static HType Tagged() { return HType(kTagged); }
306b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static HType TaggedPrimitive() { return HType(kTaggedPrimitive); }
307b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static HType TaggedNumber() { return HType(kTaggedNumber); }
308b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static HType Smi() { return HType(kSmi); }
309b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static HType HeapNumber() { return HType(kHeapNumber); }
310b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static HType String() { return HType(kString); }
311b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static HType Boolean() { return HType(kBoolean); }
312b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static HType NonPrimitive() { return HType(kNonPrimitive); }
313b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static HType JSArray() { return HType(kJSArray); }
314b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static HType JSObject() { return HType(kJSObject); }
315b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static HType Uninitialized() { return HType(kUninitialized); }
316b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
317b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Return the weakest (least precise) common type.
318b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HType Combine(HType other) {
319b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return HType(static_cast<Type>(type_ & other.type_));
320b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
321b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
322b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool Equals(const HType& other) {
323b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return type_ == other.type_;
324b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
325b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
326b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool IsSubtypeOf(const HType& other) {
327b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return Combine(other).Equals(other);
328b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
329b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
330b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool IsTagged() {
331b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(type_ != kUninitialized);
332b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return ((type_ & kTagged) == kTagged);
333b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
334b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
335b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool IsTaggedPrimitive() {
336b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(type_ != kUninitialized);
337b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return ((type_ & kTaggedPrimitive) == kTaggedPrimitive);
338b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
339b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
340b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool IsTaggedNumber() {
341b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(type_ != kUninitialized);
342b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return ((type_ & kTaggedNumber) == kTaggedNumber);
343b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
344b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
345b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool IsSmi() {
346b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(type_ != kUninitialized);
347b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return ((type_ & kSmi) == kSmi);
348b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
349b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
350b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool IsHeapNumber() {
351b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(type_ != kUninitialized);
352b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return ((type_ & kHeapNumber) == kHeapNumber);
353b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
354b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
355b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool IsString() {
356b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(type_ != kUninitialized);
357b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return ((type_ & kString) == kString);
358b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
359b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
360b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool IsBoolean() {
361b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(type_ != kUninitialized);
362b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return ((type_ & kBoolean) == kBoolean);
363b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
364b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
365b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool IsNonPrimitive() {
366b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(type_ != kUninitialized);
367b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return ((type_ & kNonPrimitive) == kNonPrimitive);
368b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
369b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
370b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool IsJSArray() {
371b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(type_ != kUninitialized);
372b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return ((type_ & kJSArray) == kJSArray);
373b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
374b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
375b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool IsJSObject() {
376b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(type_ != kUninitialized);
377b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return ((type_ & kJSObject) == kJSObject);
378b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
379b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
380b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool IsUninitialized() {
381b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return type_ == kUninitialized;
382b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
383b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
384b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static HType TypeFromValue(Handle<Object> value);
385b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
386b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  const char* ToString();
387b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  const char* ToShortString();
388b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
389b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
390b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  enum Type {
391b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kTagged = 0x1,           // 0000 0000 0000 0001
392b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kTaggedPrimitive = 0x5,  // 0000 0000 0000 0101
393b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kTaggedNumber = 0xd,     // 0000 0000 0000 1101
394b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kSmi = 0x1d,             // 0000 0000 0001 1101
395b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kHeapNumber = 0x2d,      // 0000 0000 0010 1101
396b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kString = 0x45,          // 0000 0000 0100 0101
397b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kBoolean = 0x85,         // 0000 0000 1000 0101
398b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kNonPrimitive = 0x101,   // 0000 0001 0000 0001
399b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kJSObject = 0x301,       // 0000 0011 0000 0001
400b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kJSArray = 0x701,        // 0000 0111 1000 0001
401b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kUninitialized = 0x1fff  // 0001 1111 1111 1111
402b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  };
403b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4048b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  // Make sure type fits in int16.
4058b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  STATIC_ASSERT(kUninitialized < (1 << (2 * kBitsPerByte)));
4068b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
407b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  explicit HType(Type t) : type_(t) { }
408b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4098b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  int16_t type_;
410b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
411b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
412b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
413257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochclass HUseListNode: public ZoneObject {
414257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public:
415257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HUseListNode(HValue* value, int index, HUseListNode* tail)
416257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      : tail_(tail), value_(value), index_(index) {
417257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
418257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
419257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HUseListNode* tail() const { return tail_; }
420257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HValue* value() const { return value_; }
421257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  int index() const { return index_; }
422257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
423257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  void set_tail(HUseListNode* list) { tail_ = list; }
424257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
425257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#ifdef DEBUG
426257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  void Zap() {
427257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    tail_ = reinterpret_cast<HUseListNode*>(1);
428257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    value_ = NULL;
429257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    index_ = -1;
430257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
431257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#endif
432257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
433257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch private:
434257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HUseListNode* tail_;
435257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HValue* value_;
436257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  int index_;
437257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
438257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
439257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
440257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// We reuse use list nodes behind the scenes as uses are added and deleted.
441257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// This class is the safe way to iterate uses while deleting them.
442257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochclass HUseIterator BASE_EMBEDDED {
443257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public:
444257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  bool Done() { return current_ == NULL; }
445257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  void Advance();
446257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
447257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HValue* value() {
448257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    ASSERT(!Done());
449257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return value_;
450257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
451257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
452257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  int index() {
453257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    ASSERT(!Done());
454257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return index_;
455257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
456257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
457257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch private:
458257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  explicit HUseIterator(HUseListNode* head);
459257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
460257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HUseListNode* current_;
461257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HUseListNode* next_;
462257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HValue* value_;
463257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  int index_;
464257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
465257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  friend class HValue;
466257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
467257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
468257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
469b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HValue: public ZoneObject {
470b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
471b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static const int kNoNumber = -1;
472b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
473b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // There must be one corresponding kDepends flag for every kChanges flag and
474b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // the order of the kChanges flags must be exactly the same as of the kDepends
475b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // flags.
476b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  enum Flag {
477b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // Declare global value numbering flags.
478b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  #define DECLARE_DO(type) kChanges##type, kDependsOn##type,
479b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    GVN_FLAG_LIST(DECLARE_DO)
480b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  #undef DECLARE_DO
481b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kFlexibleRepresentation,
482b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kUseGVN,
483b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kCanOverflow,
484b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kBailoutOnMinusZero,
485b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kCanBeDivByZero,
4867d3e7fc4b65010eabe860313ee0c64f50843f6e3Ben Murdoch    kDeoptimizeOnUndefined,
487b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kIsArguments,
488b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kTruncatingToInt32,
489b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kLastFlag = kTruncatingToInt32
490b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  };
491b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
492b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  STATIC_ASSERT(kLastFlag < kBitsPerInt);
493b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
494b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static const int kChangesToDependsFlagsLeftShift = 1;
495b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
496b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static int ChangesFlagsMask() {
497b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    int result = 0;
498b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // Create changes mask.
499b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#define DECLARE_DO(type) result |= (1 << kChanges##type);
500b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  GVN_FLAG_LIST(DECLARE_DO)
501b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#undef DECLARE_DO
502b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return result;
503b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
504b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
505b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static int DependsFlagsMask() {
506b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return ConvertChangesToDependsFlags(ChangesFlagsMask());
507b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
508b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
509b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static int ConvertChangesToDependsFlags(int flags) {
510b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return flags << kChangesToDependsFlagsLeftShift;
511b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
512b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
513b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static HValue* cast(HValue* value) { return value; }
514b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
515b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  enum Opcode {
516b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // Declare a unique enum value for each hydrogen instruction.
517257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  #define DECLARE_OPCODE(type) k##type,
518257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    HYDROGEN_CONCRETE_INSTRUCTION_LIST(DECLARE_OPCODE)
519257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    kPhi
520257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  #undef DECLARE_OPCODE
521b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  };
522257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  virtual Opcode opcode() const = 0;
523257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
524257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // Declare a non-virtual predicates for each concrete HInstruction or HValue.
525257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  #define DECLARE_PREDICATE(type) \
526257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    bool Is##type() const { return opcode() == k##type; }
527257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    HYDROGEN_CONCRETE_INSTRUCTION_LIST(DECLARE_PREDICATE)
528257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  #undef DECLARE_PREDICATE
529257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    bool IsPhi() const { return opcode() == kPhi; }
530257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
531257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // Declare virtual predicates for abstract HInstruction or HValue
532257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  #define DECLARE_PREDICATE(type) \
533257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    virtual bool Is##type() const { return false; }
534257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    HYDROGEN_ABSTRACT_INSTRUCTION_LIST(DECLARE_PREDICATE)
535257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  #undef DECLARE_PREDICATE
536b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
537b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HValue() : block_(NULL),
538b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch             id_(kNoNumber),
539b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch             type_(HType::Tagged()),
540257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch             use_list_(NULL),
541b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch             range_(NULL),
542b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch             flags_(0) {}
543b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual ~HValue() {}
544b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
545b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HBasicBlock* block() const { return block_; }
546b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void SetBlock(HBasicBlock* block);
547b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
548b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int id() const { return id_; }
549b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void set_id(int id) { id_ = id; }
550b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
551257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HUseIterator uses() const { return HUseIterator(use_list_); }
552b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
55344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual bool EmitAtUses() { return false; }
554b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Representation representation() const { return representation_; }
555b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void ChangeRepresentation(Representation r) {
556b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // Representation was already set and is allowed to be changed.
557b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(!r.IsNone());
558b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(CheckFlag(kFlexibleRepresentation));
559b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    RepresentationChanged(r);
560b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    representation_ = r;
561b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
562257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  void AssumeRepresentation(Representation r);
563257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
564257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  virtual bool IsConvertibleToInteger() const { return true; }
565b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
566b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HType type() const { return type_; }
567b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void set_type(HType type) {
568257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    ASSERT(HasNoUses());
569b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    type_ = type;
570b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
571b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
572b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // An operation needs to override this function iff:
573b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  //   1) it can produce an int32 output.
574b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  //   2) the true value of its output can potentially be minus zero.
575b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // The implementation must set a flag so that it bails out in the case where
576b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // it would otherwise output what should be a minus zero as an int32 zero.
577b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // If the operation also exists in a form that takes int32 and outputs int32
578b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // then the operation should return its input value so that we can propagate
579b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // back.  There are two operations that need to propagate back to more than
580b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // one input.  They are phi and binary add.  They always return NULL and
581b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // expect the caller to take care of things.
582b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited) {
583b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    visited->Add(id());
584b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return NULL;
585b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
586b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
587b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool IsDefinedAfter(HBasicBlock* other) const;
588b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
589b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Operands.
590e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual int OperandCount() = 0;
591e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual HValue* OperandAt(int index) = 0;
592b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void SetOperandAt(int index, HValue* value);
593b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
594257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  void DeleteAndReplaceWith(HValue* other);
595257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  void ReplaceAllUsesWith(HValue* other);
596257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  bool HasNoUses() const { return use_list_ == NULL; }
597257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  bool HasMultipleUses() const {
598257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return use_list_ != NULL && use_list_->tail() != NULL;
599257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
600257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  int UseCount() const;
601b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void ClearOperands();
602b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
603b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int flags() const { return flags_; }
6041e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  void SetFlag(Flag f) { flags_ |= (1 << f); }
6051e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  void ClearFlag(Flag f) { flags_ &= ~(1 << f); }
6061e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  bool CheckFlag(Flag f) const { return (flags_ & (1 << f)) != 0; }
6071e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
6081e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  void SetAllSideEffects() { flags_ |= AllSideEffects(); }
6091e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  void ClearAllSideEffects() { flags_ &= ~AllSideEffects(); }
6101e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  bool HasSideEffects() const { return (flags_ & AllSideEffects()) != 0; }
611b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
612b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Range* range() const { return range_; }
613b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool HasRange() const { return range_ != NULL; }
614b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void AddNewRange(Range* r);
615b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void RemoveLastAddedRange();
616b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void ComputeInitialRange();
617b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
618b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Representation helpers.
619e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual Representation RequiredInputRepresentation(int index) const = 0;
620e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
621e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual Representation InferredRepresentation() {
622b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return representation();
623b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
624b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
625b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // This gives the instruction an opportunity to replace itself with an
626b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // instruction that does the same in some better way.  To replace an
627b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // instruction with a new one, first add the new instruction to the graph,
628b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // then return it.  Return NULL to have the instruction deleted.
629b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual HValue* Canonicalize() { return this; }
630b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
631e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  bool Equals(HValue* other);
632e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual intptr_t Hashcode();
633b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
634b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Printing support.
635e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintTo(StringStream* stream) = 0;
636b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void PrintNameTo(StringStream* stream);
637257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  void PrintTypeTo(StringStream* stream);
638257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  void PrintRangeTo(StringStream* stream);
639257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  void PrintChangesTo(StringStream* stream);
640b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
641257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  const char* Mnemonic() const;
642b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
643b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Updated the inferred type of this instruction and returns true if
644b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // it has changed.
645b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool UpdateInferredType();
646b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
647e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual HType CalculateInferredType();
648b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
649b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG
6501e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  virtual void Verify() = 0;
651b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif
652b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
653b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
6541e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  // This function must be overridden for instructions with flag kUseGVN, to
6551e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  // compare the non-Operand parts of the instruction.
656e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) {
6571e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    UNREACHABLE();
6581e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return false;
6591e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
660b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual void RepresentationChanged(Representation to) { }
661b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual Range* InferRange();
662b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual void DeleteFromGraph() = 0;
663e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void InternalSetOperandAt(int index, HValue* value) = 0;
664b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void clear_block() {
665b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(block_ != NULL);
666b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    block_ = NULL;
667b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
668b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
669b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void set_representation(Representation r) {
670b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // Representation is set-once.
671b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(representation_.IsNone() && !r.IsNone());
672b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    representation_ = r;
673b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
674b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
675b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
6761e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  // A flag mask to mark an instruction as having arbitrary side effects.
6771e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  static int AllSideEffects() {
6781e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return ChangesFlagsMask() & ~(1 << kChangesOsrEntries);
6791e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
6801e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
681257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // Remove the matching use from the use list if present.  Returns the
682257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // removed list node or NULL.
683257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HUseListNode* RemoveUse(HValue* value, int index);
684257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
685b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void RegisterUse(int index, HValue* new_value);
686b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
687b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HBasicBlock* block_;
688b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
689b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // The id of this instruction in the hydrogen graph, assigned when first
690b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // added to the graph. Reflects creation order.
691b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int id_;
692b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
693b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Representation representation_;
694b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HType type_;
695257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HUseListNode* use_list_;
696b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Range* range_;
697b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int flags_;
698b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
699b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(HValue);
700b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
701b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
702b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
703b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HInstruction: public HValue {
704b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
705b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HInstruction* next() const { return next_; }
706b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HInstruction* previous() const { return previous_; }
707b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
708e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintTo(StringStream* stream);
709e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream) { }
710b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
711b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool IsLinked() const { return block() != NULL; }
712b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void Unlink();
713b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void InsertBefore(HInstruction* next);
714b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void InsertAfter(HInstruction* previous);
715b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
716b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int position() const { return position_; }
717b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool has_position() const { return position_ != RelocInfo::kNoPosition; }
718b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void set_position(int position) { position_ = position; }
719b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
720b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual LInstruction* CompileToLithium(LChunkBuilder* builder) = 0;
721b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
722b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG
7231e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  virtual void Verify();
724b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif
725b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
726b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  // Returns whether this is some kind of deoptimizing check
727b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  // instruction.
728b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  virtual bool IsCheckInstruction() const { return false; }
729b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
730e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool IsCall() { return false; }
731e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
732257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_ABSTRACT_INSTRUCTION(Instruction)
733b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
734b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
735b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HInstruction()
736b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      : next_(NULL),
737b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        previous_(NULL),
738b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        position_(RelocInfo::kNoPosition) {
739b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kDependsOnOsrEntries);
740b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
741b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
742b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual void DeleteFromGraph() { Unlink(); }
743b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
744b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
745b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void InitializeAsFirst(HBasicBlock* block) {
746b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(!IsLinked());
747b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetBlock(block);
748b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
749b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
750257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  void PrintMnemonicTo(StringStream* stream);
751257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
752b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HInstruction* next_;
753b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HInstruction* previous_;
754b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int position_;
755b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
756b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  friend class HBasicBlock;
757b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
758b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
759b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
760b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HControlInstruction: public HInstruction {
761b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
7621e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HControlInstruction(HBasicBlock* first, HBasicBlock* second)
7631e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      : first_successor_(first), second_successor_(second) {
7641e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
7651e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
7661e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HBasicBlock* FirstSuccessor() const { return first_successor_; }
7671e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HBasicBlock* SecondSuccessor() const { return second_successor_; }
7681e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
769e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
770b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
771257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_ABSTRACT_INSTRUCTION(ControlInstruction)
7721e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
7731e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block private:
7741e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HBasicBlock* first_successor_;
7751e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HBasicBlock* second_successor_;
776b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
777b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
778b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
779e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochtemplate<int NumElements>
780e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HOperandContainer {
781b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
782e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HOperandContainer() : elems_() { }
783e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
784e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  int length() { return NumElements; }
785e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue*& operator[](int i) {
786e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    ASSERT(i < length());
787e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return elems_[i];
788e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
789e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
790e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch private:
791e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* elems_[NumElements];
792e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch};
793e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
794e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
795e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochtemplate<>
796e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HOperandContainer<0> {
797e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch public:
798e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  int length() { return 0; }
799e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue*& operator[](int i) {
800e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    UNREACHABLE();
801e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    static HValue* t = 0;
802e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return t;
803e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
804e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch};
805e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
806e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
807e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochtemplate<int V>
808e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HTemplateInstruction : public HInstruction {
809e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch public:
810e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  int OperandCount() { return V; }
811e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* OperandAt(int i) { return inputs_[i]; }
812e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
813e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch protected:
814e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  void InternalSetOperandAt(int i, HValue* value) { inputs_[i] = value; }
815e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
816e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch private:
817e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HOperandContainer<V> inputs_;
818e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch};
819e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
820e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
821e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochtemplate<int V>
822e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HTemplateControlInstruction : public HControlInstruction {
823e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch public:
824e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HTemplateControlInstruction<V>(HBasicBlock* first, HBasicBlock* second)
825e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    : HControlInstruction(first, second) { }
826e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  int OperandCount() { return V; }
827e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* OperandAt(int i) { return inputs_[i]; }
828e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
829e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch protected:
830e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  void InternalSetOperandAt(int i, HValue* value) { inputs_[i] = value; }
831e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
832e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch private:
833e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HOperandContainer<V> inputs_;
834e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch};
835e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
836e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
837e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HBlockEntry: public HTemplateInstruction<0> {
838e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch public:
839e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
840e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
841e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
842e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
843257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(BlockEntry)
844e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch};
845e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
846e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
84744f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass HDeoptimize: public HControlInstruction {
848e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch public:
84944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  explicit HDeoptimize(int environment_length)
85044f0eee88ff00398ff7f715fab053374d808c90dSteve Block      : HControlInstruction(NULL, NULL),
85144f0eee88ff00398ff7f715fab053374d808c90dSteve Block        values_(environment_length) { }
852e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
853e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
854e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
855e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
8561e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
85744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual int OperandCount() { return values_.length(); }
85844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual HValue* OperandAt(int index) { return values_[index]; }
85944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
86044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void AddEnvironmentValue(HValue* value) {
86144f0eee88ff00398ff7f715fab053374d808c90dSteve Block    values_.Add(NULL);
86244f0eee88ff00398ff7f715fab053374d808c90dSteve Block    SetOperandAt(values_.length() - 1, value);
86344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
86444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
865257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Deoptimize)
866257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
867257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  enum UseEnvironment {
868257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    kNoUses,
869257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    kUseAll
870257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  };
87144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
87244f0eee88ff00398ff7f715fab053374d808c90dSteve Block protected:
87344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual void InternalSetOperandAt(int index, HValue* value) {
87444f0eee88ff00398ff7f715fab053374d808c90dSteve Block    values_[index] = value;
87544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
87644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
87744f0eee88ff00398ff7f715fab053374d808c90dSteve Block private:
87844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ZoneList<HValue*> values_;
879b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
880b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
881b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
882e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HGoto: public HTemplateControlInstruction<0> {
883b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
8841e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  explicit HGoto(HBasicBlock* target)
885e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      : HTemplateControlInstruction<0>(target, NULL),
886e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        include_stack_check_(false) { }
887b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
888b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void set_include_stack_check(bool include_stack_check) {
889b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    include_stack_check_ = include_stack_check;
890b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
891b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool include_stack_check() const { return include_stack_check_; }
892b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
893e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
894e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
895e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
896e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
897257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Goto)
898b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
899b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
900b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool include_stack_check_;
901b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
902b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
903b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
904e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HUnaryControlInstruction: public HTemplateControlInstruction<1> {
905b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
9061e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  explicit HUnaryControlInstruction(HValue* value,
9071e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block                                    HBasicBlock* true_target,
9081e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block                                    HBasicBlock* false_target)
909e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      : HTemplateControlInstruction<1>(true_target, false_target) {
910b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetOperandAt(0, value);
911b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
912b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
913e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
914b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
915e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* value() { return OperandAt(0); }
916b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
917b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
918b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
9191e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HTest: public HUnaryControlInstruction {
920b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
9211e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HTest(HValue* value, HBasicBlock* true_target, HBasicBlock* false_target)
9221e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      : HUnaryControlInstruction(value, true_target, false_target) {
9231e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    ASSERT(true_target != NULL && false_target != NULL);
924b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
925b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
926b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
927b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return Representation::None();
928b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
929b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
930257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Test)
931b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
932b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
933b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
9341e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HCompareMap: public HUnaryControlInstruction {
935b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
9361e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HCompareMap(HValue* value,
9371e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block              Handle<Map> map,
9381e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block              HBasicBlock* true_target,
9391e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block              HBasicBlock* false_target)
9401e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      : HUnaryControlInstruction(value, true_target, false_target),
9411e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block        map_(map) {
9421e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    ASSERT(true_target != NULL);
9431e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    ASSERT(false_target != NULL);
944b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(!map.is_null());
945b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
946b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
947e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
948b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
949b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<Map> map() const { return map_; }
950b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
951e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
952e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::Tagged();
953e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
954e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
955257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CompareMap)
956b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
957b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
958b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<Map> map_;
959b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
960b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
961b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
962b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HReturn: public HUnaryControlInstruction {
963b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
9641e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  explicit HReturn(HValue* value)
9651e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      : HUnaryControlInstruction(value, NULL, NULL) {
9661e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
967b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
968e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
969e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::Tagged();
970e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
971e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
972257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Return)
973b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
974b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
975b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
976e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HAbnormalExit: public HTemplateControlInstruction<0> {
977b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
978e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HAbnormalExit() : HTemplateControlInstruction<0>(NULL, NULL) { }
979e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
980e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
981e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
982e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
983b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
984257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(AbnormalExit)
985b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
986b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
987b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
988e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HUnaryOperation: public HTemplateInstruction<1> {
989b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
990b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  explicit HUnaryOperation(HValue* value) {
991b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetOperandAt(0, value);
992b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
993b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
994e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* value() { return OperandAt(0); }
995e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
996b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
997b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
998b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
9991e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HThrow: public HUnaryOperation {
10001e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public:
10011e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  explicit HThrow(HValue* value) : HUnaryOperation(value) {
10021e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetAllSideEffects();
10031e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
10041e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
10051e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  virtual Representation RequiredInputRepresentation(int index) const {
10061e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return Representation::Tagged();
10071e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
10081e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1009257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Throw)
1010257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
1011257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1012257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1013257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochclass HForceRepresentation: public HTemplateInstruction<1> {
1014257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public:
1015257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HForceRepresentation(HValue* value, Representation required_representation) {
1016257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    SetOperandAt(0, value);
1017257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    set_representation(required_representation);
1018257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
1019257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1020257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HValue* value() { return OperandAt(0); }
1021257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1022257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited);
1023257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1024257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
1025257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return representation();  // Same as the output representation.
1026257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
1027257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1028257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(ForceRepresentation)
10291e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block};
10301e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
10311e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1032b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HChange: public HUnaryOperation {
1033b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
1034b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HChange(HValue* value,
1035b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch          Representation from,
1036e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch          Representation to,
10377d3e7fc4b65010eabe860313ee0c64f50843f6e3Ben Murdoch          bool is_truncating,
10387d3e7fc4b65010eabe860313ee0c64f50843f6e3Ben Murdoch          bool deoptimize_on_undefined)
10397d3e7fc4b65010eabe860313ee0c64f50843f6e3Ben Murdoch      : HUnaryOperation(value),
10407d3e7fc4b65010eabe860313ee0c64f50843f6e3Ben Murdoch        from_(from),
10417d3e7fc4b65010eabe860313ee0c64f50843f6e3Ben Murdoch        deoptimize_on_undefined_(deoptimize_on_undefined) {
1042b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(!from.IsNone() && !to.IsNone());
1043b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(!from.Equals(to));
1044b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(to);
1045b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kUseGVN);
1046e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    if (is_truncating) SetFlag(kTruncatingToInt32);
1047b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (from.IsInteger32() && to.IsTagged() && value->range() != NULL &&
1048b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        value->range()->IsInSmiRange()) {
1049b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      set_type(HType::Smi());
1050b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
1051b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1052b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1053b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited);
1054b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1055b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Representation from() const { return from_; }
10568b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  Representation to() const { return representation(); }
10577d3e7fc4b65010eabe860313ee0c64f50843f6e3Ben Murdoch  bool deoptimize_on_undefined() const { return deoptimize_on_undefined_; }
1058b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
1059b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return from_;
1060b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1061b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1062e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  bool CanTruncateToInt32() const { return CheckFlag(kTruncatingToInt32); }
1063b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1064e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
1065b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1066257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Change)
1067b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1068b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
1069e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) {
1070b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (!other->IsChange()) return false;
1071b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    HChange* change = HChange::cast(other);
1072b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return value() == change->value()
10737d3e7fc4b65010eabe860313ee0c64f50843f6e3Ben Murdoch        && to().Equals(change->to())
10747d3e7fc4b65010eabe860313ee0c64f50843f6e3Ben Murdoch        && deoptimize_on_undefined() == change->deoptimize_on_undefined();
1075b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1076b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1077b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
1078b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Representation from_;
10797d3e7fc4b65010eabe860313ee0c64f50843f6e3Ben Murdoch  bool deoptimize_on_undefined_;
1080b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1081b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1082b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1083257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochclass HClampToUint8: public HUnaryOperation {
1084257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public:
1085257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  explicit HClampToUint8(HValue* value)
1086257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      : HUnaryOperation(value),
1087257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        input_rep_(Representation::None()) {
1088257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    SetFlag(kFlexibleRepresentation);
1089257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    set_representation(Representation::Tagged());
1090257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    SetFlag(kUseGVN);
1091257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
1092257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1093257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
1094257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return input_rep_;
1095257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
1096257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1097257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  virtual Representation InferredRepresentation() {
1098257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    // TODO(danno): Inference on input types should happen separately from
1099257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    // return representation.
1100257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    Representation new_rep = value()->representation();
1101257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    if (input_rep_.IsNone()) {
1102257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      if (!new_rep.IsNone()) {
1103257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        input_rep_ = new_rep;
1104257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        return Representation::Integer32();
1105257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      } else {
1106257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        return Representation::None();
1107257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      }
1108257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    } else {
1109257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      return Representation::Integer32();
1110257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    }
1111257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
1112257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1113257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(ClampToUint8)
1114257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1115257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch protected:
1116257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  virtual bool DataEquals(HValue* other) { return true; }
1117257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1118257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch private:
1119257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  Representation input_rep_;
1120257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
1121257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1122257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1123b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HSimulate: public HInstruction {
1124b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
11258b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  HSimulate(int ast_id, int pop_count)
1126b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      : ast_id_(ast_id),
1127b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        pop_count_(pop_count),
1128b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        values_(2),
1129b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        assigned_indexes_(2) {}
1130b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual ~HSimulate() {}
1131b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1132e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
1133b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1134b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool HasAstId() const { return ast_id_ != AstNode::kNoNumber; }
1135b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int ast_id() const { return ast_id_; }
1136b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void set_ast_id(int id) {
1137b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(!HasAstId());
1138b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ast_id_ = id;
1139b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1140b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1141b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int pop_count() const { return pop_count_; }
1142b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  const ZoneList<HValue*>* values() const { return &values_; }
1143b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int GetAssignedIndexAt(int index) const {
1144b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(HasAssignedIndexAt(index));
1145b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return assigned_indexes_[index];
1146b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1147b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool HasAssignedIndexAt(int index) const {
1148b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return assigned_indexes_[index] != kNoIndex;
1149b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1150b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void AddAssignedValue(int index, HValue* value) {
1151b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    AddValue(index, value);
1152b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1153b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void AddPushedValue(HValue* value) {
1154b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    AddValue(kNoIndex, value);
1155b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1156e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual int OperandCount() { return values_.length(); }
1157e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual HValue* OperandAt(int index) { return values_[index]; }
1158e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1159e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
1160e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
1161e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1162b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1163257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Simulate)
1164b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1165b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG
11661e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  virtual void Verify();
1167b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif
1168b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1169b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
1170b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual void InternalSetOperandAt(int index, HValue* value) {
1171b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    values_[index] = value;
1172b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1173b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1174b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
1175b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static const int kNoIndex = -1;
1176b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void AddValue(int index, HValue* value) {
1177b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    assigned_indexes_.Add(index);
1178b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // Resize the list of pushed values.
1179b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    values_.Add(NULL);
1180b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // Set the operand through the base method in HValue to make sure that the
1181b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // use lists are correctly updated.
1182b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetOperandAt(values_.length() - 1, value);
1183b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1184b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int ast_id_;
1185b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int pop_count_;
1186b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ZoneList<HValue*> values_;
1187b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ZoneList<int> assigned_indexes_;
1188b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1189b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1190b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1191e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HStackCheck: public HTemplateInstruction<0> {
1192b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
1193b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HStackCheck() { }
1194b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1195e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
1196e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
1197e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1198e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1199257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(StackCheck)
1200b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1201b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1202b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1203e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HEnterInlined: public HTemplateInstruction<0> {
1204b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
1205257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HEnterInlined(Handle<JSFunction> closure,
1206257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch                FunctionLiteral* function,
1207257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch                CallKind call_kind)
1208257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      : closure_(closure),
1209257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        function_(function),
1210257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        call_kind_(call_kind) {
1211b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1212b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1213e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
1214b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1215b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<JSFunction> closure() const { return closure_; }
1216b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  FunctionLiteral* function() const { return function_; }
1217257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  CallKind call_kind() const { return call_kind_; }
1218b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1219e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
1220e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
1221e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1222e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1223257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(EnterInlined)
1224b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1225b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
1226b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<JSFunction> closure_;
1227b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  FunctionLiteral* function_;
1228257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  CallKind call_kind_;
1229b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1230b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1231b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1232e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HLeaveInlined: public HTemplateInstruction<0> {
1233b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
1234b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HLeaveInlined() {}
1235b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1236e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
1237e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
1238e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1239e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1240257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(LeaveInlined)
1241b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1242b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1243b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1244b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HPushArgument: public HUnaryOperation {
1245b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
1246e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  explicit HPushArgument(HValue* value) : HUnaryOperation(value) {
1247e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    set_representation(Representation::Tagged());
1248e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1249b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1250b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
1251b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return Representation::Tagged();
1252b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1253b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1254e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* argument() { return OperandAt(0); }
1255b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1256257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(PushArgument)
12571e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block};
1258b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
12591e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1260e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HContext: public HTemplateInstruction<0> {
12611e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public:
12621e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HContext() {
12631e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    set_representation(Representation::Tagged());
12641e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetFlag(kUseGVN);
12651e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
12661e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1267e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
1268e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
1269e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1270e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1271257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Context);
12721e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
12731e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
1274e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
1275b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1276b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1277b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
12781e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HOuterContext: public HUnaryOperation {
1279b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
12801e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  explicit HOuterContext(HValue* inner) : HUnaryOperation(inner) {
12811e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    set_representation(Representation::Tagged());
12821e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetFlag(kUseGVN);
12831e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
12841e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1285257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(OuterContext);
12861e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1287e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
1288e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::Tagged();
1289e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1290e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
12911e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
1292e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
12931e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block};
12941e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
12951e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
12961e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HGlobalObject: public HUnaryOperation {
12971e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public:
12981e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  explicit HGlobalObject(HValue* context) : HUnaryOperation(context) {
1299b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
1300b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kUseGVN);
1301b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1302b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1303257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(GlobalObject)
13041e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1305e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
1306e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::Tagged();
1307e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1308e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
13091e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
1310e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
1311b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1312b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1313b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
13141e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HGlobalReceiver: public HUnaryOperation {
1315b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
13161e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  explicit HGlobalReceiver(HValue* global_object)
13171e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      : HUnaryOperation(global_object) {
1318b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
1319b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kUseGVN);
1320b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1321b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1322257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(GlobalReceiver)
13231e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1324e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
1325e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::Tagged();
1326e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1327e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
13281e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
1329e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
1330b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1331b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1332b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1333e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochtemplate <int V>
1334e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HCall: public HTemplateInstruction<V> {
1335b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
13361e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  // The argument count includes the receiver.
1337e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  explicit HCall<V>(int argument_count) : argument_count_(argument_count) {
1338e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    this->set_representation(Representation::Tagged());
1339e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    this->SetAllSideEffects();
13401e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
1341b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1342e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual HType CalculateInferredType() { return HType::Tagged(); }
1343b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
13441e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  virtual int argument_count() const { return argument_count_; }
13451e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1346e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool IsCall() { return true; }
13471e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
13481e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block private:
13491e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  int argument_count_;
13501e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block};
13511e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
13521e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1353e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HUnaryCall: public HCall<1> {
13541e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public:
13551e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HUnaryCall(HValue* value, int argument_count)
1356e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      : HCall<1>(argument_count) {
13571e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetOperandAt(0, value);
13581e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
13591e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1360e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
1361e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::Tagged();
1362b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
13631e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1364e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
13651e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1366e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* value() { return OperandAt(0); }
13671e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block};
13681e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
13691e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1370e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HBinaryCall: public HCall<2> {
13711e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public:
13721e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HBinaryCall(HValue* first, HValue* second, int argument_count)
1373e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      : HCall<2>(argument_count) {
13741e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetOperandAt(0, first);
13751e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetOperandAt(1, second);
1376b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1377b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1378e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
1379b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1380e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
1381e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::Tagged();
1382e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
13831e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1384e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* first() { return OperandAt(0); }
1385e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* second() { return OperandAt(1); }
1386257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
1387257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
13881e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1389257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochclass HInvokeFunction: public HBinaryCall {
1390257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public:
1391257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HInvokeFunction(HValue* context, HValue* function, int argument_count)
1392257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      : HBinaryCall(context, function, argument_count) {
1393257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
1394257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1395257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
1396257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return Representation::Tagged();
1397257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
1398257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1399257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HValue* context() { return first(); }
1400257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HValue* function() { return second(); }
1401257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1402257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(InvokeFunction)
1403b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1404b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1405b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1406e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HCallConstantFunction: public HCall<0> {
1407b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
1408b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HCallConstantFunction(Handle<JSFunction> function, int argument_count)
1409e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      : HCall<0>(argument_count), function_(function) { }
1410b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1411b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<JSFunction> function() const { return function_; }
14121e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1413b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool IsApplyFunction() const {
141444f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return function_->code() ==
141544f0eee88ff00398ff7f715fab053374d808c90dSteve Block        Isolate::Current()->builtins()->builtin(Builtins::kFunctionApply);
1416b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1417b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1418e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
1419e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1420e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
1421e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
1422e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1423b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1424257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CallConstantFunction)
1425b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1426b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
1427b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<JSFunction> function_;
1428b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1429b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1430b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
14311e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HCallKeyed: public HBinaryCall {
1432b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
14331e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HCallKeyed(HValue* context, HValue* key, int argument_count)
14341e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      : HBinaryCall(context, key, argument_count) {
1435b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1436b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1437b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
1438b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return Representation::Tagged();
1439b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1440b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1441e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* context() { return first(); }
1442e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* key() { return second(); }
1443b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1444257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CallKeyed)
1445b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1446b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1447b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
14481e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HCallNamed: public HUnaryCall {
1449b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
14501e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HCallNamed(HValue* context, Handle<String> name, int argument_count)
14511e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      : HUnaryCall(context, argument_count), name_(name) {
14521e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
14531e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1454e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
1455b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1456e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* context() { return value(); }
1457b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<String> name() const { return name_; }
1458b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1459257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CallNamed)
1460b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1461e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
1462e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::Tagged();
1463e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1464e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1465b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
1466b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<String> name_;
1467b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1468b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1469b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
14701e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HCallFunction: public HUnaryCall {
1471b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
14721e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HCallFunction(HValue* context, int argument_count)
14731e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      : HUnaryCall(context, argument_count) {
14741e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
14751e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1476e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* context() { return value(); }
1477e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1478e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
1479e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::Tagged();
1480e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1481b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1482257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CallFunction)
1483b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1484b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1485b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
14861e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HCallGlobal: public HUnaryCall {
1487b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
14881e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HCallGlobal(HValue* context, Handle<String> name, int argument_count)
14891e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      : HUnaryCall(context, argument_count), name_(name) {
14901e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
1491b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1492e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
1493b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1494e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* context() { return value(); }
1495b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<String> name() const { return name_; }
1496b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1497e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
1498e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::Tagged();
1499e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1500e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1501257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CallGlobal)
1502b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1503b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
1504b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<String> name_;
1505b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1506b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1507b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1508e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HCallKnownGlobal: public HCall<0> {
1509b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
15101e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HCallKnownGlobal(Handle<JSFunction> target, int argument_count)
1511e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      : HCall<0>(argument_count), target_(target) { }
1512b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1513e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
15141e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1515b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<JSFunction> target() const { return target_; }
1516b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1517e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
1518e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
1519e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1520e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1521257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CallKnownGlobal)
1522b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1523b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
1524b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<JSFunction> target_;
1525b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1526b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1527b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
15281e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HCallNew: public HBinaryCall {
1529b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
15301e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HCallNew(HValue* context, HValue* constructor, int argument_count)
15311e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      : HBinaryCall(context, constructor, argument_count) {
15321e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
1533b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1534b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
1535b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return Representation::Tagged();
1536b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1537b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1538e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* context() { return first(); }
1539e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* constructor() { return second(); }
1540b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1541257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CallNew)
1542b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1543b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1544b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1545e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HCallRuntime: public HCall<0> {
1546b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
1547b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HCallRuntime(Handle<String> name,
154844f0eee88ff00398ff7f715fab053374d808c90dSteve Block               const Runtime::Function* c_function,
1549b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch               int argument_count)
1550e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      : HCall<0>(argument_count), c_function_(c_function), name_(name) { }
1551e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
1552b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
155344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  const Runtime::Function* function() const { return c_function_; }
1554b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<String> name() const { return name_; }
1555b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1556e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
1557e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
1558e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1559e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1560257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CallRuntime)
1561b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1562b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
156344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  const Runtime::Function* c_function_;
1564b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<String> name_;
1565b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1566b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1567b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
15689fac840a46e8b7e26894f4792ba26dde14c56b04Steve Blockclass HJSArrayLength: public HUnaryOperation {
1569b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
15709fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block  explicit HJSArrayLength(HValue* value) : HUnaryOperation(value) {
1571b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // The length of an array is stored as a tagged value in the array
1572b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // object. It is guaranteed to be 32 bit integer, but it can be
1573b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // represented as either a smi or heap number.
1574b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
1575b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kUseGVN);
157644f0eee88ff00398ff7f715fab053374d808c90dSteve Block    SetFlag(kDependsOnArrayLengths);
157744f0eee88ff00398ff7f715fab053374d808c90dSteve Block    SetFlag(kDependsOnMaps);
1578b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1579b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1580b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
1581b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return Representation::Tagged();
1582b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1583b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1584257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(JSArrayLength)
15851e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
15861e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
1587e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
15889fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block};
15899fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block
15909fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block
15919fac840a46e8b7e26894f4792ba26dde14c56b04Steve Blockclass HFixedArrayLength: public HUnaryOperation {
15929fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block public:
15939fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block  explicit HFixedArrayLength(HValue* value) : HUnaryOperation(value) {
15949fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block    set_representation(Representation::Tagged());
15959fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block    SetFlag(kUseGVN);
159644f0eee88ff00398ff7f715fab053374d808c90dSteve Block    SetFlag(kDependsOnArrayLengths);
15979fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block  }
15989fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block
15999fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block  virtual Representation RequiredInputRepresentation(int index) const {
16009fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block    return Representation::Tagged();
16019fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block  }
16029fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block
1603257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(FixedArrayLength)
16041e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
16051e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
1606e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
16071e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block};
16081e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
16091e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
161044f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass HExternalArrayLength: public HUnaryOperation {
16111e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public:
161244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  explicit HExternalArrayLength(HValue* value) : HUnaryOperation(value) {
16131e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    set_representation(Representation::Integer32());
16141e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    // The result of this instruction is idempotent as long as its inputs don't
16151e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    // change.  The length of a pixel array cannot change once set, so it's not
16161e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    // necessary to introduce a kDependsOnArrayLengths or any other dependency.
16171e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetFlag(kUseGVN);
16181e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
16191e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
16201e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  virtual Representation RequiredInputRepresentation(int index) const {
16211e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return Representation::Tagged();
16221e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
16231e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1624257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(ExternalArrayLength)
16251e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
16261e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
1627e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
1628b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1629b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1630b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1631b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HBitNot: public HUnaryOperation {
1632b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
1633b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  explicit HBitNot(HValue* value) : HUnaryOperation(value) {
1634b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Integer32());
1635b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kUseGVN);
1636b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kTruncatingToInt32);
1637b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1638b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1639b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
1640b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return Representation::Integer32();
1641b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1642e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual HType CalculateInferredType();
1643b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1644257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(BitNot)
16451e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
16461e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
1647e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
1648b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1649b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1650b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1651b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HUnaryMathOperation: public HUnaryOperation {
1652b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
1653b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HUnaryMathOperation(HValue* value, BuiltinFunctionId op)
1654b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      : HUnaryOperation(value), op_(op) {
1655b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    switch (op) {
1656b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      case kMathFloor:
1657b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      case kMathRound:
1658b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      case kMathCeil:
1659b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        set_representation(Representation::Integer32());
1660b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        break;
1661b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      case kMathAbs:
1662b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        set_representation(Representation::Tagged());
1663b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        SetFlag(kFlexibleRepresentation);
1664b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        break;
1665b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      case kMathSqrt:
1666b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      case kMathPowHalf:
1667b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      case kMathLog:
1668b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      case kMathSin:
1669b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      case kMathCos:
1670b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        set_representation(Representation::Double());
1671b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        break;
1672b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      default:
1673b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        UNREACHABLE();
1674b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
1675b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kUseGVN);
1676b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1677b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1678e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
1679b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1680e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual HType CalculateInferredType();
1681b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1682b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited);
1683b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1684b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
1685b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    switch (op_) {
1686b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      case kMathFloor:
1687b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      case kMathRound:
1688b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      case kMathCeil:
1689b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      case kMathSqrt:
1690b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      case kMathPowHalf:
1691b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      case kMathLog:
1692b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      case kMathSin:
1693b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      case kMathCos:
1694b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        return Representation::Double();
1695b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      case kMathAbs:
1696b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        return representation();
1697b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      default:
1698e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        UNREACHABLE();
1699b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        return Representation::None();
1700b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
1701b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1702b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1703b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual HValue* Canonicalize() {
1704b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // If the input is integer32 then we replace the floor instruction
1705b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // with its inputs.  This happens before the representation changes are
1706b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // introduced.
1707b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (op() == kMathFloor) {
1708b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      if (value()->representation().IsInteger32()) return value();
1709b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
1710b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return this;
1711b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1712b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1713b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  BuiltinFunctionId op() const { return op_; }
1714b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  const char* OpName() const;
1715b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1716257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(UnaryMathOperation)
1717b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1718b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
1719e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) {
1720b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    HUnaryMathOperation* b = HUnaryMathOperation::cast(other);
1721b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return op_ == b->op();
1722b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1723b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1724b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
1725b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  BuiltinFunctionId op_;
1726b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1727b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1728b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1729b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HLoadElements: public HUnaryOperation {
1730b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
1731b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  explicit HLoadElements(HValue* value) : HUnaryOperation(value) {
1732b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
1733b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kUseGVN);
1734b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kDependsOnMaps);
1735b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1736b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1737b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
1738b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return Representation::Tagged();
1739b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1740b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1741257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(LoadElements)
17421e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
17431e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
1744e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
17451e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block};
17461e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
17471e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
174844f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass HLoadExternalArrayPointer: public HUnaryOperation {
17491e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public:
175044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  explicit HLoadExternalArrayPointer(HValue* value)
17511e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      : HUnaryOperation(value) {
17521e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    set_representation(Representation::External());
17531e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    // The result of this instruction is idempotent as long as its inputs don't
175444f0eee88ff00398ff7f715fab053374d808c90dSteve Block    // change.  The external array of a specialized array elements object cannot
17551e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    // change once set, so it's no necessary to introduce any additional
17561e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    // dependencies on top of the inputs.
17571e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetFlag(kUseGVN);
17581e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
17591e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
17601e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  virtual Representation RequiredInputRepresentation(int index) const {
17611e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return Representation::Tagged();
17621e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
17631e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1764257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(LoadExternalArrayPointer)
17651e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
17661e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
1767e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
1768b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1769b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1770b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1771b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HCheckMap: public HUnaryOperation {
1772b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
1773b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HCheckMap(HValue* value, Handle<Map> map)
1774b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      : HUnaryOperation(value), map_(map) {
1775b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
1776b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kUseGVN);
1777b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kDependsOnMaps);
1778b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1779b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1780b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  virtual bool IsCheckInstruction() const { return true; }
1781b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1782b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
1783b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return Representation::Tagged();
1784b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1785e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
1786e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual HType CalculateInferredType();
1787b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1788b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG
17891e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  virtual void Verify();
1790b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif
1791b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1792b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<Map> map() const { return map_; }
1793b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1794257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CheckMap)
1795b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1796b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
1797e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) {
1798b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    HCheckMap* b = HCheckMap::cast(other);
1799b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return map_.is_identical_to(b->map());
1800b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1801b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1802b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
1803b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<Map> map_;
1804b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1805b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1806b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1807b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HCheckFunction: public HUnaryOperation {
1808b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
1809b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HCheckFunction(HValue* value, Handle<JSFunction> function)
1810b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      : HUnaryOperation(value), target_(function) {
1811b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
1812b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kUseGVN);
1813b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1814b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1815b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  virtual bool IsCheckInstruction() const { return true; }
1816b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1817b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
1818b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return Representation::Tagged();
1819b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1820e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
1821e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual HType CalculateInferredType();
1822b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1823b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG
18241e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  virtual void Verify();
1825b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif
1826b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1827b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<JSFunction> target() const { return target_; }
1828b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1829257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CheckFunction)
1830b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1831b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
1832e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) {
1833b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    HCheckFunction* b = HCheckFunction::cast(other);
1834b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return target_.is_identical_to(b->target());
1835b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1836b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1837b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
1838b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<JSFunction> target_;
1839b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1840b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1841b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1842b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HCheckInstanceType: public HUnaryOperation {
1843b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
1844257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  static HCheckInstanceType* NewIsJSObjectOrJSFunction(HValue* value) {
1845257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return new HCheckInstanceType(value, IS_JS_OBJECT_OR_JS_FUNCTION);
1846257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
1847257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  static HCheckInstanceType* NewIsJSArray(HValue* value) {
1848257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return new HCheckInstanceType(value, IS_JS_ARRAY);
1849257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
1850257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  static HCheckInstanceType* NewIsString(HValue* value) {
1851257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return new HCheckInstanceType(value, IS_STRING);
1852257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
1853257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  static HCheckInstanceType* NewIsSymbol(HValue* value) {
1854257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return new HCheckInstanceType(value, IS_SYMBOL);
1855b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1856b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1857b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  virtual bool IsCheckInstruction() const { return true; }
1858b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1859b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
1860b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return Representation::Tagged();
1861b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1862b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1863b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG
18641e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  virtual void Verify();
1865b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif
1866b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1867257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  virtual HValue* Canonicalize() {
1868257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    if (!value()->type().IsUninitialized() &&
1869257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        value()->type().IsString() &&
1870257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        check_ == IS_STRING) {
1871257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      return NULL;
1872257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    }
1873257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return this;
1874257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
1875b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1876257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  bool is_interval_check() const { return check_ <= LAST_INTERVAL_CHECK; }
1877257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  void GetCheckInterval(InstanceType* first, InstanceType* last);
1878257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  void GetCheckMaskAndTag(uint8_t* mask, uint8_t* tag);
1879b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1880257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CheckInstanceType)
1881b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1882b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
1883b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // TODO(ager): It could be nice to allow the ommision of instance
1884b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // type checks if we have already performed an instance type check
1885b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // with a larger range.
1886e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) {
1887b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    HCheckInstanceType* b = HCheckInstanceType::cast(other);
1888257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return check_ == b->check_;
1889b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1890b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1891b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
1892257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  enum Check {
1893257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    IS_JS_OBJECT_OR_JS_FUNCTION,
1894257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    IS_JS_ARRAY,
1895257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    IS_STRING,
1896257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    IS_SYMBOL,
1897257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    LAST_INTERVAL_CHECK = IS_JS_ARRAY
1898257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  };
1899257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1900257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HCheckInstanceType(HValue* value, Check check)
1901257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      : HUnaryOperation(value), check_(check) {
1902257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    set_representation(Representation::Tagged());
1903257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    SetFlag(kUseGVN);
1904257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
1905257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1906257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  const Check check_;
1907b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1908b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1909b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1910b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HCheckNonSmi: public HUnaryOperation {
1911b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
1912b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  explicit HCheckNonSmi(HValue* value) : HUnaryOperation(value) {
1913b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
1914b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kUseGVN);
1915b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1916b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1917b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  virtual bool IsCheckInstruction() const { return true; }
1918b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1919b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
1920b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return Representation::Tagged();
1921b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1922b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1923e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual HType CalculateInferredType();
1924b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1925b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG
19261e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  virtual void Verify();
1927b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif
1928b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1929257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  virtual HValue* Canonicalize() {
1930257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    HType value_type = value()->type();
1931257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    if (!value_type.IsUninitialized() &&
1932257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        (value_type.IsHeapNumber() ||
1933257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch         value_type.IsString() ||
1934257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch         value_type.IsBoolean() ||
1935257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch         value_type.IsNonPrimitive())) {
1936257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      return NULL;
1937257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    }
1938257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return this;
1939257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
1940257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1941257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CheckNonSmi)
19421e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
19431e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
1944e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
1945b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1946b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1947b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1948e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HCheckPrototypeMaps: public HTemplateInstruction<0> {
1949b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
1950b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  HCheckPrototypeMaps(Handle<JSObject> prototype, Handle<JSObject> holder)
1951b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch      : prototype_(prototype), holder_(holder) {
1952b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kUseGVN);
1953b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kDependsOnMaps);
1954b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1955b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1956b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  virtual bool IsCheckInstruction() const { return true; }
1957b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1958b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG
19591e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  virtual void Verify();
1960b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif
1961b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1962b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  Handle<JSObject> prototype() const { return prototype_; }
1963b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<JSObject> holder() const { return holder_; }
1964b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1965257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CheckPrototypeMaps)
1966b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1967e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
1968e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
1969e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1970e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1971e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual intptr_t Hashcode() {
197244f0eee88ff00398ff7f715fab053374d808c90dSteve Block    ASSERT(!HEAP->IsAllocationAllowed());
1973b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    intptr_t hash = reinterpret_cast<intptr_t>(*prototype());
1974b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    hash = 17 * hash + reinterpret_cast<intptr_t>(*holder());
1975b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    return hash;
1976b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
1977b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1978b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
1979e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) {
1980b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    HCheckPrototypeMaps* b = HCheckPrototypeMaps::cast(other);
1981b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    return prototype_.is_identical_to(b->prototype()) &&
1982b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch        holder_.is_identical_to(b->holder());
1983b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1984b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1985b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
1986b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  Handle<JSObject> prototype_;
1987b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<JSObject> holder_;
1988b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1989b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1990b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1991b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HCheckSmi: public HUnaryOperation {
1992b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
1993b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  explicit HCheckSmi(HValue* value) : HUnaryOperation(value) {
1994b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
1995b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kUseGVN);
1996b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1997b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1998b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  virtual bool IsCheckInstruction() const { return true; }
1999b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2000b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
2001b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return Representation::Tagged();
2002b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2003e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual HType CalculateInferredType();
2004b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2005b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG
20061e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  virtual void Verify();
2007b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif
2008b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2009257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CheckSmi)
20101e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
20111e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
2012e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
2013b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2014b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2015b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2016b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HPhi: public HValue {
2017b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
2018b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  explicit HPhi(int merged_index)
2019b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      : inputs_(2),
2020b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        merged_index_(merged_index),
202144f0eee88ff00398ff7f715fab053374d808c90dSteve Block        phi_id_(-1),
2022257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        is_live_(false),
2023257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        is_convertible_to_integer_(true) {
2024b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    for (int i = 0; i < Representation::kNumRepresentations; i++) {
2025b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      non_phi_uses_[i] = 0;
2026b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      indirect_uses_[i] = 0;
2027b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
2028b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(merged_index >= 0);
2029b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
2030b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kFlexibleRepresentation);
2031b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2032b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2033e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual Representation InferredRepresentation() {
2034b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    bool double_occurred = false;
2035b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    bool int32_occurred = false;
2036b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    for (int i = 0; i < OperandCount(); ++i) {
2037b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      HValue* value = OperandAt(i);
2038b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      if (value->representation().IsDouble()) double_occurred = true;
2039b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      if (value->representation().IsInteger32()) int32_occurred = true;
2040b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      if (value->representation().IsTagged()) return Representation::Tagged();
2041b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
2042b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2043b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (double_occurred) return Representation::Double();
2044b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (int32_occurred) return Representation::Integer32();
2045b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return Representation::None();
2046b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2047b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2048b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual Range* InferRange();
2049b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
2050b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return representation();
2051b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2052e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual HType CalculateInferredType();
2053e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual int OperandCount() { return inputs_.length(); }
2054e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual HValue* OperandAt(int index) { return inputs_[index]; }
2055e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* GetRedundantReplacement();
2056b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void AddInput(HValue* value);
205744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  bool HasRealUses();
2058b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
20591e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  bool IsReceiver() { return merged_index_ == 0; }
2060b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2061b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int merged_index() const { return merged_index_; }
2062b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2063e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintTo(StringStream* stream);
2064b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2065b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG
20661e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  virtual void Verify();
2067b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif
2068b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2069b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void InitRealUses(int id);
2070b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void AddNonPhiUsesFrom(HPhi* other);
2071b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void AddIndirectUsesTo(int* use_count);
2072b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2073b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int tagged_non_phi_uses() const {
2074b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return non_phi_uses_[Representation::kTagged];
2075b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2076b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int int32_non_phi_uses() const {
2077b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return non_phi_uses_[Representation::kInteger32];
2078b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2079b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int double_non_phi_uses() const {
2080b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return non_phi_uses_[Representation::kDouble];
2081b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2082b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int tagged_indirect_uses() const {
2083b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return indirect_uses_[Representation::kTagged];
2084b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2085b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int int32_indirect_uses() const {
2086b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return indirect_uses_[Representation::kInteger32];
2087b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2088b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int double_indirect_uses() const {
2089b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return indirect_uses_[Representation::kDouble];
2090b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2091b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int phi_id() { return phi_id_; }
209244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  bool is_live() { return is_live_; }
209344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void set_is_live(bool b) { is_live_ = b; }
2094b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2095257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  static HPhi* cast(HValue* value) {
2096257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    ASSERT(value->IsPhi());
2097257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return reinterpret_cast<HPhi*>(value);
2098257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
2099257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  virtual Opcode opcode() const { return HValue::kPhi; }
2100257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2101257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  virtual bool IsConvertibleToInteger() const {
2102257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return is_convertible_to_integer_;
2103257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
2104257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2105257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  void set_is_convertible_to_integer(bool b) {
2106257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    is_convertible_to_integer_ = b;
2107257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
2108257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2109b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
2110b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual void DeleteFromGraph();
2111b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual void InternalSetOperandAt(int index, HValue* value) {
2112b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    inputs_[index] = value;
2113b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2114b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2115b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
2116b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ZoneList<HValue*> inputs_;
2117b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int merged_index_;
2118b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2119b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int non_phi_uses_[Representation::kNumRepresentations];
2120b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int indirect_uses_[Representation::kNumRepresentations];
2121b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int phi_id_;
212244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  bool is_live_;
2123257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  bool is_convertible_to_integer_;
2124b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2125b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2126b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2127e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HArgumentsObject: public HTemplateInstruction<0> {
2128b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
2129b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HArgumentsObject() {
2130b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
2131b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kIsArguments);
2132b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2133b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2134e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
2135e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
2136e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
2137e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
2138257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(ArgumentsObject)
2139b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2140b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2141b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2142e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HConstant: public HTemplateInstruction<0> {
2143b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
2144b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HConstant(Handle<Object> handle, Representation r);
2145b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2146b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<Object> handle() const { return handle_; }
2147b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
214844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  bool InOldSpace() const { return !HEAP->InNewSpace(*handle_); }
21499fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block
2150e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
2151e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
2152e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
2153e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
2154257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  virtual bool IsConvertibleToInteger() const {
2155257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    if (handle_->IsSmi()) return true;
2156257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    if (handle_->IsHeapNumber() &&
2157257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        (HeapNumber::cast(*handle_)->value() ==
2158257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch         static_cast<double>(NumberToInt32(*handle_)))) return true;
2159257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return false;
2160257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
2161257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
216244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual bool EmitAtUses() { return !representation().IsDouble(); }
2163e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
2164e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual HType CalculateInferredType();
2165b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool IsInteger() const { return handle_->IsSmi(); }
2166b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HConstant* CopyToRepresentation(Representation r) const;
2167b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HConstant* CopyToTruncatedInt32() const;
2168b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool HasInteger32Value() const { return has_int32_value_; }
2169b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int32_t Integer32Value() const {
2170b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(HasInteger32Value());
2171b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return int32_value_;
2172b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2173b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool HasDoubleValue() const { return has_double_value_; }
2174b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  double DoubleValue() const {
2175b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(HasDoubleValue());
2176b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return double_value_;
2177b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2178b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool HasStringValue() const { return handle_->IsString(); }
2179b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
21808b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  bool ToBoolean() const;
21818b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
2182e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual intptr_t Hashcode() {
218344f0eee88ff00398ff7f715fab053374d808c90dSteve Block    ASSERT(!HEAP->allow_allocation(false));
2184b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return reinterpret_cast<intptr_t>(*handle());
2185b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2186b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2187b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG
21881e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  virtual void Verify() { }
2189b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif
2190b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2191257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Constant)
2192b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2193b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
2194b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual Range* InferRange();
2195b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2196e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) {
2197b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    HConstant* other_constant = HConstant::cast(other);
2198b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return handle().is_identical_to(other_constant->handle());
2199b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2200b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2201b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
2202b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<Object> handle_;
2203b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2204b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // The following two values represent the int32 and the double value of the
2205b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // given constant if there is a lossless conversion between the constant
2206b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // and the specific representation.
2207257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  bool has_int32_value_ : 1;
2208257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  bool has_double_value_ : 1;
2209b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int32_t int32_value_;
2210b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  double double_value_;
2211b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2212b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2213b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2214e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HBinaryOperation: public HTemplateInstruction<2> {
2215b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
2216b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HBinaryOperation(HValue* left, HValue* right) {
2217b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(left != NULL && right != NULL);
2218b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetOperandAt(0, left);
2219b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetOperandAt(1, right);
2220b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2221b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2222e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* left() { return OperandAt(0); }
2223e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* right() { return OperandAt(1); }
2224b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2225b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // TODO(kasperl): Move these helpers to the IA-32 Lithium
2226b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // instruction sequence builder.
2227e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* LeastConstantOperand() {
2228b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (IsCommutative() && left()->IsConstant()) return right();
2229b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return left();
2230b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2231e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* MostConstantOperand() {
2232b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (IsCommutative() && left()->IsConstant()) return left();
2233b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return right();
2234b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2235b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2236b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual bool IsCommutative() const { return false; }
2237b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2238e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
2239b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2240b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2241b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2242e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HApplyArguments: public HTemplateInstruction<4> {
2243b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
2244b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HApplyArguments(HValue* function,
2245b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch                  HValue* receiver,
2246b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch                  HValue* length,
2247b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch                  HValue* elements) {
2248b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
2249b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetOperandAt(0, function);
2250b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetOperandAt(1, receiver);
2251b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetOperandAt(2, length);
2252b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetOperandAt(3, elements);
22531e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetAllSideEffects();
2254b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2255b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2256b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
2257b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // The length is untagged, all other inputs are tagged.
2258b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return (index == 2)
2259b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        ? Representation::Integer32()
2260b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        : Representation::Tagged();
2261b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2262b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2263e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* function() { return OperandAt(0); }
2264e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* receiver() { return OperandAt(1); }
2265e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* length() { return OperandAt(2); }
2266e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* elements() { return OperandAt(3); }
2267b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2268257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(ApplyArguments)
2269b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2270b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2271b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2272e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HArgumentsElements: public HTemplateInstruction<0> {
2273b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
2274b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HArgumentsElements() {
2275b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // The value produced by this instruction is a pointer into the stack
2276b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // that looks as if it was a smi because of alignment.
2277b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
2278b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kUseGVN);
2279b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2280b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2281257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(ArgumentsElements)
22821e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
2283e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
2284e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
2285e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
2286e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
22871e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
2288e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
2289b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2290b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2291b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2292b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HArgumentsLength: public HUnaryOperation {
2293b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
2294b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  explicit HArgumentsLength(HValue* value) : HUnaryOperation(value) {
2295b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Integer32());
2296b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kUseGVN);
2297b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2298b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2299e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
2300e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::Tagged();
2301e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
2302e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
2303257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(ArgumentsLength)
23041e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
23051e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
2306e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
2307b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2308b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2309b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2310e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HAccessArgumentsAt: public HTemplateInstruction<3> {
2311b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
2312b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HAccessArgumentsAt(HValue* arguments, HValue* length, HValue* index) {
2313b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
2314b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kUseGVN);
2315b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetOperandAt(0, arguments);
2316b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetOperandAt(1, length);
2317b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetOperandAt(2, index);
2318b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2319b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2320e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
2321b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2322b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
2323b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // The arguments elements is considered tagged.
2324b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return index == 0
2325b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        ? Representation::Tagged()
2326b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        : Representation::Integer32();
2327b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2328b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2329e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* arguments() { return OperandAt(0); }
2330e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* length() { return OperandAt(1); }
2331e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* index() { return OperandAt(2); }
2332b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2333257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(AccessArgumentsAt)
2334b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2335e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
2336b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2337b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2338b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2339b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HBoundsCheck: public HBinaryOperation {
2340b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
2341b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HBoundsCheck(HValue* index, HValue* length)
2342b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      : HBinaryOperation(index, length) {
23437d3e7fc4b65010eabe860313ee0c64f50843f6e3Ben Murdoch    set_representation(Representation::Integer32());
2344b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kUseGVN);
2345b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2346b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2347b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  virtual bool IsCheckInstruction() const { return true; }
2348b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2349b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
2350b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return Representation::Integer32();
2351b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2352b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2353b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG
23541e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  virtual void Verify();
2355b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif
2356b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2357e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* index() { return left(); }
2358e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* length() { return right(); }
2359b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2360257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(BoundsCheck)
23611e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
23621e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
2363e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
2364b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2365b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2366b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2367b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HBitwiseBinaryOperation: public HBinaryOperation {
2368b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
2369b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HBitwiseBinaryOperation(HValue* left, HValue* right)
2370b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      : HBinaryOperation(left, right) {
23711e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    set_representation(Representation::Tagged());
23721e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetFlag(kFlexibleRepresentation);
23731e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetAllSideEffects();
2374b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2375b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2376b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
23771e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return representation();
2378b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2379b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
23801e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  virtual void RepresentationChanged(Representation to) {
23811e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    if (!to.IsTagged()) {
23821e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      ASSERT(to.IsInteger32());
23831e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      ClearAllSideEffects();
23841e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      SetFlag(kTruncatingToInt32);
23851e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      SetFlag(kUseGVN);
23861e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    }
23871e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
23881e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
2389e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual HType CalculateInferredType();
23901e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
2391257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_ABSTRACT_INSTRUCTION(BitwiseBinaryOperation)
2392b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2393b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2394b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2395b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HArithmeticBinaryOperation: public HBinaryOperation {
2396b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
2397b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HArithmeticBinaryOperation(HValue* left, HValue* right)
2398b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      : HBinaryOperation(left, right) {
2399b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
2400b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kFlexibleRepresentation);
24011e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetAllSideEffects();
2402b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2403b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2404b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual void RepresentationChanged(Representation to) {
2405b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (!to.IsTagged()) {
24061e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      ClearAllSideEffects();
2407b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      SetFlag(kUseGVN);
2408b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
2409b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2410b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2411e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual HType CalculateInferredType();
2412b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
2413b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return representation();
2414b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2415e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual Representation InferredRepresentation() {
2416b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (left()->representation().Equals(right()->representation())) {
2417b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      return left()->representation();
2418b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
2419b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return HValue::InferredRepresentation();
2420b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2421b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2422b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2423b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2424b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HCompare: public HBinaryOperation {
2425b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
2426b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HCompare(HValue* left, HValue* right, Token::Value token)
2427b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      : HBinaryOperation(left, right), token_(token) {
2428b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(Token::IsCompareOp(token));
2429b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
24301e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetAllSideEffects();
2431b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2432b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2433b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void SetInputRepresentation(Representation r);
24341e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
243544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual bool EmitAtUses() {
2436257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return !HasSideEffects() && !HasMultipleUses();
24371e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
24381e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
2439b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
2440b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return input_representation_;
2441b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2442b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Representation GetInputRepresentation() const {
2443b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return input_representation_;
2444b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2445b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Token::Value token() const { return token_; }
2446e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
2447b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2448e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual HType CalculateInferredType();
2449b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2450e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual intptr_t Hashcode() {
2451b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return HValue::Hashcode() * 7 + token_;
2452b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2453b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2454257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Compare)
2455b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2456b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
2457e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) {
2458b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    HCompare* comp = HCompare::cast(other);
2459b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return token_ == comp->token();
2460b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2461b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2462b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
2463b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Representation input_representation_;
2464b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Token::Value token_;
2465b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2466b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2467b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2468b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HCompareJSObjectEq: public HBinaryOperation {
2469b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
2470b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HCompareJSObjectEq(HValue* left, HValue* right)
2471b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      : HBinaryOperation(left, right) {
2472b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
2473b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kUseGVN);
247444f0eee88ff00398ff7f715fab053374d808c90dSteve Block    SetFlag(kDependsOnMaps);
2475b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2476b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
247744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual bool EmitAtUses() {
2478257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return !HasSideEffects() && !HasMultipleUses();
24791e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
24801e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
2481b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
2482b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return Representation::Tagged();
2483b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2484e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual HType CalculateInferredType();
2485b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2486257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CompareJSObjectEq)
24871e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
24881e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
2489e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
2490b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2491b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2492b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2493257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochclass HCompareSymbolEq: public HBinaryOperation {
2494257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public:
2495257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HCompareSymbolEq(HValue* left, HValue* right, Token::Value op)
2496257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      : HBinaryOperation(left, right), op_(op) {
2497257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    ASSERT(op == Token::EQ || op == Token::EQ_STRICT);
2498257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    set_representation(Representation::Tagged());
2499257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    SetFlag(kUseGVN);
2500257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    SetFlag(kDependsOnMaps);
2501257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
2502257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2503257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  Token::Value op() const { return op_; }
2504257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2505257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  virtual bool EmitAtUses() {
2506257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return !HasSideEffects() && !HasMultipleUses();
2507257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
2508257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2509257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
2510257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return Representation::Tagged();
2511257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
2512257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2513257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  virtual HType CalculateInferredType() { return HType::Boolean(); }
2514257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2515257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CompareSymbolEq);
2516257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2517257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch protected:
2518257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  virtual bool DataEquals(HValue* other) {
2519257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return op_ == HCompareSymbolEq::cast(other)->op_;
2520257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
2521257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2522257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch private:
2523257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  const Token::Value op_;
2524257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
2525257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2526257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2527b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HUnaryPredicate: public HUnaryOperation {
2528b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
2529b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  explicit HUnaryPredicate(HValue* value) : HUnaryOperation(value) {
2530b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
2531b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kUseGVN);
2532b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
25331e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
253444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual bool EmitAtUses() {
2535257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return !HasSideEffects() && !HasMultipleUses();
25361e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
25371e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
2538b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
2539b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return Representation::Tagged();
2540b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2541e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual HType CalculateInferredType();
2542b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2543b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2544b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2545b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HIsNull: public HUnaryPredicate {
2546b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
2547b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HIsNull(HValue* value, bool is_strict)
2548b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      : HUnaryPredicate(value), is_strict_(is_strict) { }
2549b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2550b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool is_strict() const { return is_strict_; }
2551b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2552257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(IsNull)
2553b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2554b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
2555e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) {
2556b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    HIsNull* b = HIsNull::cast(other);
2557b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return is_strict_ == b->is_strict();
2558b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2559b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2560b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
2561b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool is_strict_;
2562b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2563b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2564b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2565b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HIsObject: public HUnaryPredicate {
2566b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
2567b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  explicit HIsObject(HValue* value) : HUnaryPredicate(value) { }
2568b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2569257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(IsObject)
25701e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
25711e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
2572e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
2573b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2574b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2575b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2576b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HIsSmi: public HUnaryPredicate {
2577b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
2578b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  explicit HIsSmi(HValue* value) : HUnaryPredicate(value) { }
2579b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2580257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(IsSmi)
2581257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2582257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch protected:
2583257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  virtual bool DataEquals(HValue* other) { return true; }
2584257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
2585257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2586257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2587257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochclass HIsUndetectable: public HUnaryPredicate {
2588257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public:
2589257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  explicit HIsUndetectable(HValue* value) : HUnaryPredicate(value) { }
2590257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2591257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(IsUndetectable)
25921e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
25931e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
2594e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
25951e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block};
25961e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
25971e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
2598e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HIsConstructCall: public HTemplateInstruction<0> {
25991e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public:
26001e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HIsConstructCall() {
26011e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    set_representation(Representation::Tagged());
26021e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetFlag(kUseGVN);
26031e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
26041e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
260544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual bool EmitAtUses() {
2606257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return !HasSideEffects() && !HasMultipleUses();
26071e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
26081e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
2609e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
2610e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
2611e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
2612e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
2613257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(IsConstructCall)
26141e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
26151e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
2616e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
2617b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2618b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2619b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2620b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HHasInstanceType: public HUnaryPredicate {
2621b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
2622b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HHasInstanceType(HValue* value, InstanceType type)
2623b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      : HUnaryPredicate(value), from_(type), to_(type) { }
2624b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HHasInstanceType(HValue* value, InstanceType from, InstanceType to)
2625b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      : HUnaryPredicate(value), from_(from), to_(to) {
2626b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(to == LAST_TYPE);  // Others not implemented yet in backend.
2627b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2628b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2629b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  InstanceType from() { return from_; }
2630b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  InstanceType to() { return to_; }
2631b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2632e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
2633b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2634257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(HasInstanceType)
2635b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2636b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
2637e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) {
2638b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    HHasInstanceType* b = HHasInstanceType::cast(other);
2639b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return (from_ == b->from()) && (to_ == b->to());
2640b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2641b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2642b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
2643b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  InstanceType from_;
2644b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  InstanceType to_;  // Inclusive range, not all combinations work.
2645b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2646b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2647b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2648b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HHasCachedArrayIndex: public HUnaryPredicate {
2649b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
2650b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  explicit HHasCachedArrayIndex(HValue* value) : HUnaryPredicate(value) { }
2651b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2652257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(HasCachedArrayIndex)
26531e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
26541e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
2655e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
2656e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch};
2657e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
2658e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
2659e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HGetCachedArrayIndex: public HUnaryPredicate {
2660e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch public:
2661e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  explicit HGetCachedArrayIndex(HValue* value) : HUnaryPredicate(value) { }
2662e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
2663257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(GetCachedArrayIndex)
2664e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
2665e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch protected:
2666e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
2667b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2668b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2669b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2670b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HClassOfTest: public HUnaryPredicate {
2671b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
2672b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HClassOfTest(HValue* value, Handle<String> class_name)
2673b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      : HUnaryPredicate(value), class_name_(class_name) { }
2674b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2675257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(ClassOfTest)
2676b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2677e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
2678b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2679b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<String> class_name() const { return class_name_; }
2680b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2681b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
2682e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) {
2683b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    HClassOfTest* b = HClassOfTest::cast(other);
2684b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return class_name_.is_identical_to(b->class_name_);
2685b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2686b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2687b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
2688b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<String> class_name_;
2689b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2690b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2691b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2692b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HTypeofIs: public HUnaryPredicate {
2693b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
2694b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HTypeofIs(HValue* value, Handle<String> type_literal)
2695b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      : HUnaryPredicate(value), type_literal_(type_literal) { }
2696b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2697b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<String> type_literal() { return type_literal_; }
2698e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
2699b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2700257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(TypeofIs)
2701b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2702b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
2703e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) {
2704b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    HTypeofIs* b = HTypeofIs::cast(other);
2705b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return type_literal_.is_identical_to(b->type_literal_);
2706b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2707b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2708b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
2709b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<String> type_literal_;
2710b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2711b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2712b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2713e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HInstanceOf: public HTemplateInstruction<3> {
2714b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
27151e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HInstanceOf(HValue* context, HValue* left, HValue* right) {
27161e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetOperandAt(0, context);
27171e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetOperandAt(1, left);
27181e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetOperandAt(2, right);
2719b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
27201e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetAllSideEffects();
2721b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2722b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2723e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* context() { return OperandAt(0); }
2724e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* left() { return OperandAt(1); }
2725e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* right() { return OperandAt(2); }
27261e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
272744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual bool EmitAtUses() {
2728257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return !HasSideEffects() && !HasMultipleUses();
27291e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
2730b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2731b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
2732b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return Representation::Tagged();
2733b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2734b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2735e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
27361e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
2737257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(InstanceOf)
2738b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2739b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2740b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2741086aeeaae12517475c22695a200be45495516549Ben Murdochclass HInstanceOfKnownGlobal: public HUnaryOperation {
2742086aeeaae12517475c22695a200be45495516549Ben Murdoch public:
2743086aeeaae12517475c22695a200be45495516549Ben Murdoch  HInstanceOfKnownGlobal(HValue* left, Handle<JSFunction> right)
2744086aeeaae12517475c22695a200be45495516549Ben Murdoch      : HUnaryOperation(left), function_(right) {
2745086aeeaae12517475c22695a200be45495516549Ben Murdoch    set_representation(Representation::Tagged());
27461e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetAllSideEffects();
2747086aeeaae12517475c22695a200be45495516549Ben Murdoch  }
2748086aeeaae12517475c22695a200be45495516549Ben Murdoch
2749086aeeaae12517475c22695a200be45495516549Ben Murdoch  Handle<JSFunction> function() { return function_; }
2750086aeeaae12517475c22695a200be45495516549Ben Murdoch
2751086aeeaae12517475c22695a200be45495516549Ben Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
2752086aeeaae12517475c22695a200be45495516549Ben Murdoch    return Representation::Tagged();
2753086aeeaae12517475c22695a200be45495516549Ben Murdoch  }
2754086aeeaae12517475c22695a200be45495516549Ben Murdoch
2755257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(InstanceOfKnownGlobal)
2756086aeeaae12517475c22695a200be45495516549Ben Murdoch
2757086aeeaae12517475c22695a200be45495516549Ben Murdoch private:
2758086aeeaae12517475c22695a200be45495516549Ben Murdoch  Handle<JSFunction> function_;
2759086aeeaae12517475c22695a200be45495516549Ben Murdoch};
2760086aeeaae12517475c22695a200be45495516549Ben Murdoch
2761086aeeaae12517475c22695a200be45495516549Ben Murdoch
2762b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HPower: public HBinaryOperation {
2763b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
2764b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HPower(HValue* left, HValue* right)
2765b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      : HBinaryOperation(left, right) {
2766b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Double());
2767b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kUseGVN);
2768b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2769b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2770b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
2771b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return (index == 1) ? Representation::None() : Representation::Double();
2772b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2773b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2774257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Power)
27751e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
27761e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
2777e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
2778b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2779b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2780b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2781b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HAdd: public HArithmeticBinaryOperation {
2782b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
2783b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HAdd(HValue* left, HValue* right) : HArithmeticBinaryOperation(left, right) {
2784b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kCanOverflow);
2785b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2786b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2787b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Add is only commutative if two integer values are added and not if two
2788b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // tagged values are added (because it might be a String concatenation).
2789b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual bool IsCommutative() const {
2790b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return !representation().IsTagged();
2791b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2792b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2793b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited);
2794b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2795e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual HType CalculateInferredType();
2796b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2797257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Add)
2798b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2799b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
2800e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
28011e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
2802b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual Range* InferRange();
2803b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2804b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2805b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2806b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HSub: public HArithmeticBinaryOperation {
2807b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
2808b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HSub(HValue* left, HValue* right) : HArithmeticBinaryOperation(left, right) {
2809b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kCanOverflow);
2810b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2811b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2812b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited);
2813b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2814257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Sub)
2815b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2816b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
2817e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
28181e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
2819b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual Range* InferRange();
2820b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2821b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2822b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2823b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HMul: public HArithmeticBinaryOperation {
2824b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
2825b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HMul(HValue* left, HValue* right) : HArithmeticBinaryOperation(left, right) {
2826b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kCanOverflow);
2827b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2828b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2829b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited);
2830b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2831b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Only commutative if it is certain that not two objects are multiplicated.
2832b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual bool IsCommutative() const {
2833b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return !representation().IsTagged();
2834b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2835b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2836257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Mul)
2837b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2838b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
2839e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
28401e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
2841b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual Range* InferRange();
2842b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2843b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2844b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2845b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HMod: public HArithmeticBinaryOperation {
2846b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
2847b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HMod(HValue* left, HValue* right) : HArithmeticBinaryOperation(left, right) {
2848b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kCanBeDivByZero);
2849b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2850b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
285144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  bool HasPowerOf2Divisor() {
285244f0eee88ff00398ff7f715fab053374d808c90dSteve Block    if (right()->IsConstant() &&
285344f0eee88ff00398ff7f715fab053374d808c90dSteve Block        HConstant::cast(right())->HasInteger32Value()) {
285444f0eee88ff00398ff7f715fab053374d808c90dSteve Block      int32_t value = HConstant::cast(right())->Integer32Value();
285544f0eee88ff00398ff7f715fab053374d808c90dSteve Block      return value != 0 && (IsPowerOf2(value) || IsPowerOf2(-value));
285644f0eee88ff00398ff7f715fab053374d808c90dSteve Block    }
285744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
285844f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return false;
285944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
286044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
2861b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited);
2862b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2863257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Mod)
2864b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2865b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
2866e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
28671e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
2868b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual Range* InferRange();
2869b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2870b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2871b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2872b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HDiv: public HArithmeticBinaryOperation {
2873b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
2874b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HDiv(HValue* left, HValue* right) : HArithmeticBinaryOperation(left, right) {
2875b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kCanBeDivByZero);
2876b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kCanOverflow);
2877b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2878b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2879b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited);
2880b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2881257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Div)
2882b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2883b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
2884e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
28851e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
2886b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual Range* InferRange();
2887b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2888b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2889b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2890b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HBitAnd: public HBitwiseBinaryOperation {
2891b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
2892b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HBitAnd(HValue* left, HValue* right)
2893b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      : HBitwiseBinaryOperation(left, right) { }
2894b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2895b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual bool IsCommutative() const { return true; }
2896e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual HType CalculateInferredType();
2897b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2898257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(BitAnd)
2899b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2900b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
2901e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
29021e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
2903b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual Range* InferRange();
2904b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2905b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2906b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2907b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HBitXor: public HBitwiseBinaryOperation {
2908b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
2909b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HBitXor(HValue* left, HValue* right)
2910b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      : HBitwiseBinaryOperation(left, right) { }
2911b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2912b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual bool IsCommutative() const { return true; }
2913e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual HType CalculateInferredType();
2914b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2915257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(BitXor)
29161e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
29171e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
2918e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
2919b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2920b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2921b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2922b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HBitOr: public HBitwiseBinaryOperation {
2923b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
2924b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HBitOr(HValue* left, HValue* right)
2925b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      : HBitwiseBinaryOperation(left, right) { }
2926b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2927b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual bool IsCommutative() const { return true; }
2928e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual HType CalculateInferredType();
2929b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2930257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(BitOr)
2931b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2932b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
2933e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
29341e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
2935b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual Range* InferRange();
2936b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2937b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2938b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2939b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HShl: public HBitwiseBinaryOperation {
2940b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
2941b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HShl(HValue* left, HValue* right)
2942b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      : HBitwiseBinaryOperation(left, right) { }
2943b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2944b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual Range* InferRange();
2945e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual HType CalculateInferredType();
2946b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2947257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Shl)
29481e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
29491e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
2950e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
2951b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2952b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2953b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2954b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HShr: public HBitwiseBinaryOperation {
2955b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
2956b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HShr(HValue* left, HValue* right)
2957b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      : HBitwiseBinaryOperation(left, right) { }
2958b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2959e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual HType CalculateInferredType();
2960b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2961257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Shr)
29621e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
29631e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
2964e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
2965b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2966b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2967b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2968b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HSar: public HBitwiseBinaryOperation {
2969b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
2970b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HSar(HValue* left, HValue* right)
2971b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      : HBitwiseBinaryOperation(left, right) { }
2972b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2973b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual Range* InferRange();
2974e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual HType CalculateInferredType();
2975b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2976257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Sar)
29771e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
29781e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
2979e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
2980b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2981b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2982b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2983e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HOsrEntry: public HTemplateInstruction<0> {
2984b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
2985b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  explicit HOsrEntry(int ast_id) : ast_id_(ast_id) {
2986b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kChangesOsrEntries);
2987b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2988b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2989b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int ast_id() const { return ast_id_; }
2990b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2991e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
2992e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
2993e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
2994e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
2995257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(OsrEntry)
2996b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2997b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
2998b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int ast_id_;
2999b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3000b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3001b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3002e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HParameter: public HTemplateInstruction<0> {
3003b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
3004b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  explicit HParameter(unsigned index) : index_(index) {
3005b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
3006b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3007b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3008b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  unsigned index() const { return index_; }
3009b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3010e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
3011e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
3012e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
3013e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
3014e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
3015b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3016257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Parameter)
3017b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3018b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
3019b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  unsigned index_;
3020b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3021b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3022b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
30231e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HCallStub: public HUnaryCall {
3024b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
30251e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HCallStub(HValue* context, CodeStub::Major major_key, int argument_count)
30261e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      : HUnaryCall(context, argument_count),
30271e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block        major_key_(major_key),
3028b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        transcendental_type_(TranscendentalCache::kNumberOfCaches) {
3029b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3030b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3031b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  CodeStub::Major major_key() { return major_key_; }
30321e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
3033e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* context() { return value(); }
3034b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3035b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void set_transcendental_type(TranscendentalCache::Type transcendental_type) {
3036b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    transcendental_type_ = transcendental_type;
3037b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3038b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  TranscendentalCache::Type transcendental_type() {
3039b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return transcendental_type_;
3040b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
30411e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
3042e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
3043e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
3044e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
3045e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::Tagged();
3046e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
3047b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3048257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CallStub)
3049b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3050b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
3051b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  CodeStub::Major major_key_;
3052b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  TranscendentalCache::Type transcendental_type_;
3053b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3054b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3055b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3056e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HUnknownOSRValue: public HTemplateInstruction<0> {
3057b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
3058b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HUnknownOSRValue() { set_representation(Representation::Tagged()); }
3059b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3060e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
3061e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
3062e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
3063e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
3064257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(UnknownOSRValue)
3065b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3066b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3067b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
30688b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochclass HLoadGlobalCell: public HTemplateInstruction<0> {
3069b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
30708b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  HLoadGlobalCell(Handle<JSGlobalPropertyCell> cell, bool check_hole_value)
3071b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      : cell_(cell), check_hole_value_(check_hole_value) {
3072b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
3073b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kUseGVN);
3074b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kDependsOnGlobalVars);
3075b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3076b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3077b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<JSGlobalPropertyCell>  cell() const { return cell_; }
3078b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool check_hole_value() const { return check_hole_value_; }
3079b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3080e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
3081b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3082e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual intptr_t Hashcode() {
308344f0eee88ff00398ff7f715fab053374d808c90dSteve Block    ASSERT(!HEAP->allow_allocation(false));
3084b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return reinterpret_cast<intptr_t>(*cell_);
3085b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3086b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3087e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
3088e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
3089e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
3090e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
3091257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(LoadGlobalCell)
3092b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3093b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
3094e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) {
30958b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    HLoadGlobalCell* b = HLoadGlobalCell::cast(other);
3096b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return cell_.is_identical_to(b->cell());
3097b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3098b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3099b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
3100b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<JSGlobalPropertyCell> cell_;
3101b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool check_hole_value_;
3102b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3103b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3104b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
31058b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochclass HLoadGlobalGeneric: public HBinaryOperation {
3106b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
31078b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  HLoadGlobalGeneric(HValue* context,
31088b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch                     HValue* global_object,
31098b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch                     Handle<Object> name,
31108b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch                     bool for_typeof)
31118b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch      : HBinaryOperation(context, global_object),
31128b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch        name_(name),
31138b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch        for_typeof_(for_typeof) {
31148b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    set_representation(Representation::Tagged());
31158b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    SetAllSideEffects();
31168b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  }
31178b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
31188b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  HValue* context() { return OperandAt(0); }
31198b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  HValue* global_object() { return OperandAt(1); }
31208b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  Handle<Object> name() const { return name_; }
31218b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  bool for_typeof() const { return for_typeof_; }
31228b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
31238b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  virtual void PrintDataTo(StringStream* stream);
31248b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
31258b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
31268b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    return Representation::Tagged();
31278b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  }
31288b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
3129257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(LoadGlobalGeneric)
31308b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
31318b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch private:
31328b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  Handle<Object> name_;
31338b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  bool for_typeof_;
31348b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch};
31358b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
31368b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
31378b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochclass HStoreGlobalCell: public HUnaryOperation {
31388b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch public:
31398b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  HStoreGlobalCell(HValue* value,
31408b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch                   Handle<JSGlobalPropertyCell> cell,
31418b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch                   bool check_hole_value)
31421e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      : HUnaryOperation(value),
31431e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block        cell_(cell),
31441e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block        check_hole_value_(check_hole_value) {
3145b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kChangesGlobalVars);
3146b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3147b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3148b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<JSGlobalPropertyCell> cell() const { return cell_; }
31491e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  bool check_hole_value() const { return check_hole_value_; }
3150b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3151b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
3152b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return Representation::Tagged();
3153b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3154e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
3155b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3156257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(StoreGlobalCell)
3157b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3158b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
3159b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<JSGlobalPropertyCell> cell_;
31601e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  bool check_hole_value_;
3161b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3162b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3163b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
31648b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochclass HStoreGlobalGeneric: public HTemplateInstruction<3> {
31658b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch public:
31668b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  HStoreGlobalGeneric(HValue* context,
31678b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch                      HValue* global_object,
31688b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch                      Handle<Object> name,
31698b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch                      HValue* value,
31708b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch                      bool strict_mode)
31718b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch      : name_(name),
31728b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch        strict_mode_(strict_mode) {
31738b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    SetOperandAt(0, context);
31748b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    SetOperandAt(1, global_object);
31758b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    SetOperandAt(2, value);
31768b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    set_representation(Representation::Tagged());
31778b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    SetAllSideEffects();
31788b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  }
31798b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
31808b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  HValue* context() { return OperandAt(0); }
31818b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  HValue* global_object() { return OperandAt(1); }
31828b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  Handle<Object> name() const { return name_; }
31838b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  HValue* value() { return OperandAt(2); }
31848b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  bool strict_mode() { return strict_mode_; }
31858b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
31868b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  virtual void PrintDataTo(StringStream* stream);
31878b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
31888b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
31898b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    return Representation::Tagged();
31908b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  }
31918b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
3192257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(StoreGlobalGeneric)
31938b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
31948b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch private:
31958b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  Handle<Object> name_;
31968b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  bool strict_mode_;
31978b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch};
31988b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
31998b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
32001e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HLoadContextSlot: public HUnaryOperation {
3201b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
32021e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HLoadContextSlot(HValue* context , int slot_index)
32031e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      : HUnaryOperation(context), slot_index_(slot_index) {
3204b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    set_representation(Representation::Tagged());
3205b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    SetFlag(kUseGVN);
32061e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetFlag(kDependsOnContextSlots);
3207b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
3208b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
3209b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  int slot_index() const { return slot_index_; }
3210b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
32111e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  virtual Representation RequiredInputRepresentation(int index) const {
32121e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return Representation::Tagged();
3213b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
3214b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
3215e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
32161e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
3217257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(LoadContextSlot)
3218b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
3219b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch protected:
3220e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) {
3221b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    HLoadContextSlot* b = HLoadContextSlot::cast(other);
32221e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return (slot_index() == b->slot_index());
3223b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
3224b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
3225b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch private:
32261e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  int slot_index_;
32271e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block};
32281e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
32291e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
32301e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockstatic inline bool StoringValueNeedsWriteBarrier(HValue* value) {
32311e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  return !value->type().IsSmi() &&
32321e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      !(value->IsConstant() && HConstant::cast(value)->InOldSpace());
32331e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}
32341e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
32351e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
32361e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HStoreContextSlot: public HBinaryOperation {
32371e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public:
32381e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HStoreContextSlot(HValue* context, int slot_index, HValue* value)
32391e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      : HBinaryOperation(context, value), slot_index_(slot_index) {
32401e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetFlag(kChangesContextSlots);
32411e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
32421e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
3243e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* context() { return OperandAt(0); }
3244e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* value() { return OperandAt(1); }
32451e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  int slot_index() const { return slot_index_; }
32461e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
3247e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  bool NeedsWriteBarrier() {
32481e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return StoringValueNeedsWriteBarrier(value());
32491e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
32501e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
32511e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  virtual Representation RequiredInputRepresentation(int index) const {
32521e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return Representation::Tagged();
32531e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
32541e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
3255e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
32561e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
3257257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(StoreContextSlot)
32581e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
32591e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block private:
3260b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  int slot_index_;
3261b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
3262b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
3263b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
3264b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HLoadNamedField: public HUnaryOperation {
3265b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
3266b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HLoadNamedField(HValue* object, bool is_in_object, int offset)
3267b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      : HUnaryOperation(object),
3268b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        is_in_object_(is_in_object),
3269b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        offset_(offset) {
3270b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
3271b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kUseGVN);
327244f0eee88ff00398ff7f715fab053374d808c90dSteve Block    SetFlag(kDependsOnMaps);
3273b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (is_in_object) {
3274b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      SetFlag(kDependsOnInobjectFields);
3275b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    } else {
3276b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      SetFlag(kDependsOnBackingStoreFields);
3277b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
3278b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3279b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3280e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* object() { return OperandAt(0); }
3281b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool is_in_object() const { return is_in_object_; }
3282b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int offset() const { return offset_; }
3283b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3284b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
3285b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return Representation::Tagged();
3286b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3287e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
3288b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3289257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(LoadNamedField)
3290b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3291b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
3292e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) {
3293b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    HLoadNamedField* b = HLoadNamedField::cast(other);
3294b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return is_in_object_ == b->is_in_object_ && offset_ == b->offset_;
3295b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3296b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3297b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
3298b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool is_in_object_;
3299b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int offset_;
3300b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3301b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3302b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
330344f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass HLoadNamedFieldPolymorphic: public HUnaryOperation {
330444f0eee88ff00398ff7f715fab053374d808c90dSteve Block public:
330544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  HLoadNamedFieldPolymorphic(HValue* object,
330644f0eee88ff00398ff7f715fab053374d808c90dSteve Block                             ZoneMapList* types,
330744f0eee88ff00398ff7f715fab053374d808c90dSteve Block                             Handle<String> name);
330844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
330944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  HValue* object() { return OperandAt(0); }
331044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ZoneMapList* types() { return &types_; }
331144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Handle<String> name() { return name_; }
331244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  bool need_generic() { return need_generic_; }
331344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
331444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual Representation RequiredInputRepresentation(int index) const {
331544f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return Representation::Tagged();
331644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
331744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
3318257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(LoadNamedFieldPolymorphic)
331944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
332044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static const int kMaxLoadPolymorphism = 4;
332144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
332244f0eee88ff00398ff7f715fab053374d808c90dSteve Block protected:
332344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual bool DataEquals(HValue* value);
332444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
332544f0eee88ff00398ff7f715fab053374d808c90dSteve Block private:
332644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ZoneMapList types_;
332744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Handle<String> name_;
332844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  bool need_generic_;
332944f0eee88ff00398ff7f715fab053374d808c90dSteve Block};
333044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
333144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
333244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
33331e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HLoadNamedGeneric: public HBinaryOperation {
3334b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
33351e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HLoadNamedGeneric(HValue* context, HValue* object, Handle<Object> name)
33361e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      : HBinaryOperation(context, object), name_(name) {
3337b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
33381e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetAllSideEffects();
3339b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3340b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3341e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* context() { return OperandAt(0); }
3342e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* object() { return OperandAt(1); }
3343b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<Object> name() const { return name_; }
3344b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3345b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
3346b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return Representation::Tagged();
3347b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3348b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3349257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(LoadNamedGeneric)
3350b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3351b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
3352b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<Object> name_;
3353b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3354b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3355b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
33569fac840a46e8b7e26894f4792ba26dde14c56b04Steve Blockclass HLoadFunctionPrototype: public HUnaryOperation {
33579fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block public:
33589fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block  explicit HLoadFunctionPrototype(HValue* function)
33599fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block      : HUnaryOperation(function) {
33609fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block    set_representation(Representation::Tagged());
33611e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetFlag(kUseGVN);
33621e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetFlag(kDependsOnCalls);
33639fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block  }
33649fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block
3365e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* function() { return OperandAt(0); }
33669fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block
33679fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block  virtual Representation RequiredInputRepresentation(int index) const {
33689fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block    return Representation::Tagged();
33699fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block  }
33709fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block
3371257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(LoadFunctionPrototype)
33729fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block
33739fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block protected:
3374e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
33759fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block};
33769fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block
33779fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block
3378e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HLoadKeyedFastElement: public HBinaryOperation {
3379b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
3380e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HLoadKeyedFastElement(HValue* obj, HValue* key) : HBinaryOperation(obj, key) {
3381b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
3382b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kDependsOnArrayElements);
3383b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kUseGVN);
3384b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3385b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3386e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* object() { return OperandAt(0); }
3387e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* key() { return OperandAt(1); }
3388e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
3389b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
3390b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // The key is supposed to be Integer32.
3391b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return (index == 1) ? Representation::Integer32()
3392b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        : Representation::Tagged();
3393b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3394b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3395e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
3396e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
3397257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  bool RequiresHoleCheck() const;
3398257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
3399257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(LoadKeyedFastElement)
34001e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
34011e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
3402e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
34031e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block};
34041e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
34051e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
340644f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass HLoadKeyedSpecializedArrayElement: public HBinaryOperation {
34071e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public:
340844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  HLoadKeyedSpecializedArrayElement(HValue* external_elements,
340944f0eee88ff00398ff7f715fab053374d808c90dSteve Block                                    HValue* key,
341044f0eee88ff00398ff7f715fab053374d808c90dSteve Block                                    ExternalArrayType array_type)
341144f0eee88ff00398ff7f715fab053374d808c90dSteve Block      : HBinaryOperation(external_elements, key),
341244f0eee88ff00398ff7f715fab053374d808c90dSteve Block        array_type_(array_type) {
3413257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    if (array_type == kExternalFloatArray ||
3414257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        array_type == kExternalDoubleArray) {
341544f0eee88ff00398ff7f715fab053374d808c90dSteve Block      set_representation(Representation::Double());
341644f0eee88ff00398ff7f715fab053374d808c90dSteve Block    } else {
341744f0eee88ff00398ff7f715fab053374d808c90dSteve Block      set_representation(Representation::Integer32());
341844f0eee88ff00398ff7f715fab053374d808c90dSteve Block    }
341944f0eee88ff00398ff7f715fab053374d808c90dSteve Block    SetFlag(kDependsOnSpecializedArrayElements);
342044f0eee88ff00398ff7f715fab053374d808c90dSteve Block    // Native code could change the specialized array.
34211e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetFlag(kDependsOnCalls);
34221e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetFlag(kUseGVN);
34231e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
34241e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
3425e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
34261e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
34271e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  virtual Representation RequiredInputRepresentation(int index) const {
34281e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    // The key is supposed to be Integer32, but the base pointer
34291e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    // for the element load is a naked pointer.
34301e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return (index == 1) ? Representation::Integer32()
34311e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block        : Representation::External();
34321e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
34331e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
3434e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* external_pointer() { return OperandAt(0); }
3435e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* key() { return OperandAt(1); }
343644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ExternalArrayType array_type() const { return array_type_; }
34371e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
3438257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(LoadKeyedSpecializedArrayElement)
34391e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
34401e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
344144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual bool DataEquals(HValue* other) {
344244f0eee88ff00398ff7f715fab053374d808c90dSteve Block    if (!other->IsLoadKeyedSpecializedArrayElement()) return false;
344344f0eee88ff00398ff7f715fab053374d808c90dSteve Block    HLoadKeyedSpecializedArrayElement* cast_other =
344444f0eee88ff00398ff7f715fab053374d808c90dSteve Block        HLoadKeyedSpecializedArrayElement::cast(other);
344544f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return array_type_ == cast_other->array_type();
344644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
344744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
344844f0eee88ff00398ff7f715fab053374d808c90dSteve Block private:
344944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ExternalArrayType array_type_;
3450b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3451b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3452b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3453e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HLoadKeyedGeneric: public HTemplateInstruction<3> {
3454b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
3455257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HLoadKeyedGeneric(HValue* context, HValue* obj, HValue* key) {
3456e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    set_representation(Representation::Tagged());
3457e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    SetOperandAt(0, obj);
3458e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    SetOperandAt(1, key);
34591e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetOperandAt(2, context);
34601e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetAllSideEffects();
34611e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
34621e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
3463e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* object() { return OperandAt(0); }
3464e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* key() { return OperandAt(1); }
3465e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* context() { return OperandAt(2); }
34669fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block
3467e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
3468b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3469b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
3470b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return Representation::Tagged();
3471b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3472b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3473257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(LoadKeyedGeneric)
3474b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3475b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3476b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3477e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HStoreNamedField: public HBinaryOperation {
3478b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
3479b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HStoreNamedField(HValue* obj,
34801e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block                   Handle<String> name,
3481b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch                   HValue* val,
3482b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch                   bool in_object,
3483b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch                   int offset)
3484e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      : HBinaryOperation(obj, val),
3485e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        name_(name),
3486b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        is_in_object_(in_object),
3487b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        offset_(offset) {
3488b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (is_in_object_) {
3489b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      SetFlag(kChangesInobjectFields);
3490b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    } else {
3491b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      SetFlag(kChangesBackingStoreFields);
3492b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
3493b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3494b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3495257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(StoreNamedField)
3496b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3497b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
34981e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return Representation::Tagged();
3499b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3500e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
3501e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
3502e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* object() { return OperandAt(0); }
3503e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* value() { return OperandAt(1); }
3504b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3505e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  Handle<String> name() const { return name_; }
3506b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool is_in_object() const { return is_in_object_; }
3507b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int offset() const { return offset_; }
3508b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<Map> transition() const { return transition_; }
3509b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void set_transition(Handle<Map> map) { transition_ = map; }
3510b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3511e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  bool NeedsWriteBarrier() {
35121e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return StoringValueNeedsWriteBarrier(value());
35131e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
35141e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
3515b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
3516e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  Handle<String> name_;
3517b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool is_in_object_;
3518b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int offset_;
3519b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<Map> transition_;
3520b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3521b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3522b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3523e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HStoreNamedGeneric: public HTemplateInstruction<3> {
3524b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
35251e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HStoreNamedGeneric(HValue* context,
35261e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block                     HValue* object,
35271e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block                     Handle<String> name,
35288b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch                     HValue* value,
35298b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch                     bool strict_mode)
35308b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch      : name_(name),
35318b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch        strict_mode_(strict_mode) {
3532e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    SetOperandAt(0, object);
3533e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    SetOperandAt(1, value);
35341e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetOperandAt(2, context);
35351e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetAllSideEffects();
35361e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
35371e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
3538e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* object() { return OperandAt(0); }
3539e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* value() { return OperandAt(1); }
3540e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* context() { return OperandAt(2); }
3541e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  Handle<String> name() { return name_; }
35428b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  bool strict_mode() { return strict_mode_; }
35431e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
3544e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
35451e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
3546e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
3547e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::Tagged();
3548b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3549b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3550257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(StoreNamedGeneric)
35511e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
35521e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block private:
3553e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  Handle<String> name_;
35548b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  bool strict_mode_;
3555b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3556b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3557b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3558e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HStoreKeyedFastElement: public HTemplateInstruction<3> {
3559b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
3560e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HStoreKeyedFastElement(HValue* obj, HValue* key, HValue* val) {
3561b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetOperandAt(0, obj);
3562b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetOperandAt(1, key);
3563b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetOperandAt(2, val);
3564e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    SetFlag(kChangesArrayElements);
3565b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3566b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3567b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
3568e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    // The key is supposed to be Integer32.
3569e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return (index == 1) ? Representation::Integer32()
3570e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        : Representation::Tagged();
3571b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3572b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3573e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* object() { return OperandAt(0); }
3574e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* key() { return OperandAt(1); }
3575e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* value() { return OperandAt(2); }
3576b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3577e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  bool NeedsWriteBarrier() {
35789fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block    return StoringValueNeedsWriteBarrier(value());
35799fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block  }
35809fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block
3581e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
3582b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3583257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(StoreKeyedFastElement)
3584b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3585b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3586b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
358744f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass HStoreKeyedSpecializedArrayElement: public HTemplateInstruction<3> {
3588b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
358944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  HStoreKeyedSpecializedArrayElement(HValue* external_elements,
359044f0eee88ff00398ff7f715fab053374d808c90dSteve Block                                     HValue* key,
359144f0eee88ff00398ff7f715fab053374d808c90dSteve Block                                     HValue* val,
359244f0eee88ff00398ff7f715fab053374d808c90dSteve Block                                     ExternalArrayType array_type)
359344f0eee88ff00398ff7f715fab053374d808c90dSteve Block      : array_type_(array_type) {
359444f0eee88ff00398ff7f715fab053374d808c90dSteve Block    SetFlag(kChangesSpecializedArrayElements);
3595e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    SetOperandAt(0, external_elements);
3596e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    SetOperandAt(1, key);
3597e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    SetOperandAt(2, val);
3598b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3599b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3600e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
3601e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
3602b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
3603e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    if (index == 0) {
3604e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      return Representation::External();
3605e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    } else {
3606257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      if (index == 2 && (array_type() == kExternalFloatArray ||
3607257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch                         array_type() == kExternalDoubleArray)) {
360844f0eee88ff00398ff7f715fab053374d808c90dSteve Block        return Representation::Double();
360944f0eee88ff00398ff7f715fab053374d808c90dSteve Block      } else {
361044f0eee88ff00398ff7f715fab053374d808c90dSteve Block        return Representation::Integer32();
361144f0eee88ff00398ff7f715fab053374d808c90dSteve Block      }
3612e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    }
3613b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3614b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3615e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* external_pointer() { return OperandAt(0); }
3616e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* key() { return OperandAt(1); }
3617e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* value() { return OperandAt(2); }
361844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ExternalArrayType array_type() const { return array_type_; }
3619e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
3620257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(StoreKeyedSpecializedArrayElement)
3621257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
362244f0eee88ff00398ff7f715fab053374d808c90dSteve Block private:
362344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ExternalArrayType array_type_;
3624b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3625b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3626b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3627e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HStoreKeyedGeneric: public HTemplateInstruction<4> {
3628b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
36291e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HStoreKeyedGeneric(HValue* context,
36301e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block                     HValue* object,
36311e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block                     HValue* key,
36328b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch                     HValue* value,
36338b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch                     bool strict_mode)
36348b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch      : strict_mode_(strict_mode) {
3635e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    SetOperandAt(0, object);
3636e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    SetOperandAt(1, key);
3637e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    SetOperandAt(2, value);
36381e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetOperandAt(3, context);
36391e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetAllSideEffects();
36401e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
36411e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
3642e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* object() { return OperandAt(0); }
3643e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* key() { return OperandAt(1); }
3644e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* value() { return OperandAt(2); }
3645e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* context() { return OperandAt(3); }
36468b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  bool strict_mode() { return strict_mode_; }
36471e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
3648e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
3649e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::Tagged();
3650b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3651b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3652e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void PrintDataTo(StringStream* stream);
36531e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
3654257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(StoreKeyedGeneric)
36558b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
36568b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch private:
36578b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  bool strict_mode_;
36588b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch};
36598b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
36608b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
3661257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochclass HStringAdd: public HBinaryOperation {
3662257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public:
3663257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HStringAdd(HValue* left, HValue* right) : HBinaryOperation(left, right) {
3664257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    set_representation(Representation::Tagged());
3665257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    SetFlag(kUseGVN);
3666257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    SetFlag(kDependsOnMaps);
3667257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
3668257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
3669257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
3670257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return Representation::Tagged();
3671257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
3672257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
3673257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  virtual HType CalculateInferredType() {
3674257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return HType::String();
3675257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
3676257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
3677257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(StringAdd)
3678257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
3679257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch protected:
3680257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  virtual bool DataEquals(HValue* other) { return true; }
3681257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
3682257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
3683257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
36841e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HStringCharCodeAt: public HBinaryOperation {
36851e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public:
36861e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HStringCharCodeAt(HValue* string, HValue* index)
36871e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      : HBinaryOperation(string, index) {
36881e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    set_representation(Representation::Integer32());
36891e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetFlag(kUseGVN);
369044f0eee88ff00398ff7f715fab053374d808c90dSteve Block    SetFlag(kDependsOnMaps);
36911e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
36921e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
36931e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  virtual Representation RequiredInputRepresentation(int index) const {
36941e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    // The index is supposed to be Integer32.
36951e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return (index == 1) ? Representation::Integer32()
36961e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block        : Representation::Tagged();
36971e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
36981e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
3699e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* string() { return OperandAt(0); }
3700e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* index() { return OperandAt(1); }
37011e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
3702257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(StringCharCodeAt)
37031e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
37041e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
3705e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
37061e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
37071e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  virtual Range* InferRange() {
37081e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return new Range(0, String::kMaxUC16CharCode);
37091e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
37101e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block};
37111e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
37121e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
371344f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass HStringCharFromCode: public HUnaryOperation {
371444f0eee88ff00398ff7f715fab053374d808c90dSteve Block public:
371544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  explicit HStringCharFromCode(HValue* char_code) : HUnaryOperation(char_code) {
371644f0eee88ff00398ff7f715fab053374d808c90dSteve Block    set_representation(Representation::Tagged());
371744f0eee88ff00398ff7f715fab053374d808c90dSteve Block    SetFlag(kUseGVN);
371844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
371944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
372044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual Representation RequiredInputRepresentation(int index) const {
372144f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return Representation::Integer32();
372244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
372344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
372444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual bool DataEquals(HValue* other) { return true; }
372544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
3726257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(StringCharFromCode)
372744f0eee88ff00398ff7f715fab053374d808c90dSteve Block};
372844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
372944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
37301e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HStringLength: public HUnaryOperation {
37311e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public:
37321e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  explicit HStringLength(HValue* string) : HUnaryOperation(string) {
37331e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    set_representation(Representation::Tagged());
37341e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetFlag(kUseGVN);
373544f0eee88ff00398ff7f715fab053374d808c90dSteve Block    SetFlag(kDependsOnMaps);
37361e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
37371e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
37381e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  virtual Representation RequiredInputRepresentation(int index) const {
37391e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return Representation::Tagged();
37401e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
37411e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
3742e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual HType CalculateInferredType() {
37431e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    STATIC_ASSERT(String::kMaxLength <= Smi::kMaxValue);
37441e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return HType::Smi();
37451e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
37461e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
3747257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(StringLength)
37481e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
37491e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
3750e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) { return true; }
37511e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
37521e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  virtual Range* InferRange() {
37531e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return new Range(0, String::kMaxLength);
37541e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
3755b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3756b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3757b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3758e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochtemplate <int V>
3759e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HMaterializedLiteral: public HTemplateInstruction<V> {
3760b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
3761e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HMaterializedLiteral<V>(int index, int depth)
3762b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      : literal_index_(index), depth_(depth) {
3763e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    this->set_representation(Representation::Tagged());
3764b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3765b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3766b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int literal_index() const { return literal_index_; }
3767b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int depth() const { return depth_; }
3768b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3769b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
3770b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int literal_index_;
3771b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int depth_;
3772b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3773b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3774b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3775e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HArrayLiteral: public HMaterializedLiteral<0> {
3776b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
3777b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HArrayLiteral(Handle<FixedArray> constant_elements,
3778b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch                int length,
3779b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch                int literal_index,
3780b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch                int depth)
3781e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      : HMaterializedLiteral<0>(literal_index, depth),
3782b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        length_(length),
3783b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        constant_elements_(constant_elements) {}
3784b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3785b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<FixedArray> constant_elements() const { return constant_elements_; }
3786b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int length() const { return length_; }
3787b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3788b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool IsCopyOnWrite() const;
3789b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3790e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
3791e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
3792e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
3793e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
3794257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(ArrayLiteral)
3795b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3796b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
3797b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int length_;
3798b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<FixedArray> constant_elements_;
3799b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3800b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3801b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3802e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HObjectLiteral: public HMaterializedLiteral<1> {
3803b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
38041e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HObjectLiteral(HValue* context,
38051e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block                 Handle<FixedArray> constant_properties,
3806b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch                 bool fast_elements,
3807b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch                 int literal_index,
380844f0eee88ff00398ff7f715fab053374d808c90dSteve Block                 int depth,
380944f0eee88ff00398ff7f715fab053374d808c90dSteve Block                 bool has_function)
3810e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      : HMaterializedLiteral<1>(literal_index, depth),
3811b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        constant_properties_(constant_properties),
381244f0eee88ff00398ff7f715fab053374d808c90dSteve Block        fast_elements_(fast_elements),
381344f0eee88ff00398ff7f715fab053374d808c90dSteve Block        has_function_(has_function) {
38141e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetOperandAt(0, context);
38151e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
3816b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3817e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* context() { return OperandAt(0); }
3818b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<FixedArray> constant_properties() const {
3819b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return constant_properties_;
3820b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3821b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool fast_elements() const { return fast_elements_; }
382244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  bool has_function() const { return has_function_; }
3823b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3824e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
3825e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::Tagged();
3826e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
38271e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
3828257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(ObjectLiteral)
3829b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3830b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
3831b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<FixedArray> constant_properties_;
3832b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool fast_elements_;
383344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  bool has_function_;
3834b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3835b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3836b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3837e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HRegExpLiteral: public HMaterializedLiteral<0> {
3838b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
3839b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HRegExpLiteral(Handle<String> pattern,
3840b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch                 Handle<String> flags,
3841b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch                 int literal_index)
3842e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      : HMaterializedLiteral<0>(literal_index, 0),
3843b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        pattern_(pattern),
3844b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        flags_(flags) { }
3845b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3846b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<String> pattern() { return pattern_; }
3847b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<String> flags() { return flags_; }
3848b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3849e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
3850e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
3851e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
3852e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
3853257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(RegExpLiteral)
3854b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3855b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
3856b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<String> pattern_;
3857b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<String> flags_;
3858b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3859b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3860b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3861e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HFunctionLiteral: public HTemplateInstruction<0> {
3862b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
3863b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HFunctionLiteral(Handle<SharedFunctionInfo> shared, bool pretenure)
3864b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      : shared_info_(shared), pretenure_(pretenure) {
3865b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
3866b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3867b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3868e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
3869e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
3870e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
3871e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
3872257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(FunctionLiteral)
3873b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3874b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<SharedFunctionInfo> shared_info() const { return shared_info_; }
3875b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool pretenure() const { return pretenure_; }
3876b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3877b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
3878b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<SharedFunctionInfo> shared_info_;
3879b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool pretenure_;
3880b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3881b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3882b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3883b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HTypeof: public HUnaryOperation {
3884b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
3885b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  explicit HTypeof(HValue* value) : HUnaryOperation(value) {
3886b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
3887b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3888b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
38891e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  virtual Representation RequiredInputRepresentation(int index) const {
38901e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return Representation::Tagged();
38911e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
38921e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
3893257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Typeof)
3894b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3895b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3896b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
389744f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass HToFastProperties: public HUnaryOperation {
389844f0eee88ff00398ff7f715fab053374d808c90dSteve Block public:
389944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  explicit HToFastProperties(HValue* value) : HUnaryOperation(value) {
390044f0eee88ff00398ff7f715fab053374d808c90dSteve Block    // This instruction is not marked as having side effects, but
390144f0eee88ff00398ff7f715fab053374d808c90dSteve Block    // changes the map of the input operand. Use it only when creating
390244f0eee88ff00398ff7f715fab053374d808c90dSteve Block    // object literals.
390344f0eee88ff00398ff7f715fab053374d808c90dSteve Block    ASSERT(value->IsObjectLiteral());
390444f0eee88ff00398ff7f715fab053374d808c90dSteve Block    set_representation(Representation::Tagged());
390544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
390644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
390744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual Representation RequiredInputRepresentation(int index) const {
390844f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return Representation::Tagged();
390944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
391044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
3911257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(ToFastProperties)
391244f0eee88ff00398ff7f715fab053374d808c90dSteve Block};
391344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
391444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
3915b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HValueOf: public HUnaryOperation {
3916b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
3917b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  explicit HValueOf(HValue* value) : HUnaryOperation(value) {
3918b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
3919b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3920b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3921e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
3922e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::Tagged();
3923e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
3924e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
3925257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(ValueOf)
3926b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3927b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3928b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3929b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HDeleteProperty: public HBinaryOperation {
3930b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
3931b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HDeleteProperty(HValue* obj, HValue* key)
3932b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      : HBinaryOperation(obj, key) {
3933b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
39341e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetAllSideEffects();
3935b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3936b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3937b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
3938b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return Representation::Tagged();
3939b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3940b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3941257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(DeleteProperty)
3942b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3943e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* object() { return left(); }
3944e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* key() { return right(); }
3945b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3946b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3947257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
3948257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochclass HIn: public HTemplateInstruction<2> {
3949257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public:
3950257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HIn(HValue* key, HValue* object) {
3951257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    SetOperandAt(0, key);
3952257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    SetOperandAt(1, object);
3953257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    set_representation(Representation::Tagged());
3954257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    SetAllSideEffects();
3955257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
3956257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
3957257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HValue* key() { return OperandAt(0); }
3958257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HValue* object() { return OperandAt(1); }
3959257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
3960257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  virtual Representation RequiredInputRepresentation(int index) const {
3961257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return Representation::Tagged();
3962257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
3963257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
3964257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  virtual HType CalculateInferredType() {
3965257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return HType::Boolean();
3966257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
3967257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
3968257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  virtual void PrintDataTo(StringStream* stream);
3969257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
3970257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(In)
3971257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
3972257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
3973b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#undef DECLARE_INSTRUCTION
3974b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#undef DECLARE_CONCRETE_INSTRUCTION
3975b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3976b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} }  // namespace v8::internal
3977b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3978b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif  // V8_HYDROGEN_INSTRUCTIONS_H_
3979