13ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Copyright 2012 the V8 project authors. All rights reserved.
2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// found in the LICENSE file.
4b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifndef V8_HYDROGEN_INSTRUCTIONS_H_
6b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#define V8_HYDROGEN_INSTRUCTIONS_H_
7b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/v8.h"
9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/allocation.h"
11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/base/bits.h"
12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/code-stubs.h"
13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/conversions.h"
14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/data-flow.h"
15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/deoptimizer.h"
16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/feedback-slots.h"
17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/hydrogen-types.h"
18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/small-pointer-list.h"
19b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/unique.h"
20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/utils.h"
21b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/zone.h"
22b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
23b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochnamespace v8 {
24b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochnamespace internal {
25b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
26b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// Forward declarations.
27b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstruct ChangesOf;
28b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HBasicBlock;
29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HDiv;
30b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HEnvironment;
31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HInferRepresentationPhase;
32b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HInstruction;
33b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HLoopInformation;
34b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HStoreNamedField;
35b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HValue;
36b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass LInstruction;
37b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass LChunkBuilder;
38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass OStream;
39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
40b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define HYDROGEN_ABSTRACT_INSTRUCTION_LIST(V) \
41b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(ArithmeticBinaryOperation)                \
42b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(BinaryOperation)                          \
43b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(BitwiseBinaryOperation)                   \
44b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(ControlInstruction)                       \
45b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(Instruction)
46b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
48b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define HYDROGEN_CONCRETE_INSTRUCTION_LIST(V) \
49b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(AbnormalExit)                             \
50b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(AccessArgumentsAt)                        \
51b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(Add)                                      \
52b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(AllocateBlockContext)                     \
53b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(Allocate)                                 \
54b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(ApplyArguments)                           \
55b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(ArgumentsElements)                        \
56b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(ArgumentsLength)                          \
57b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(ArgumentsObject)                          \
58b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(Bitwise)                                  \
59b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(BlockEntry)                               \
60b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(BoundsCheck)                              \
61b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(BoundsCheckBaseIndexInformation)          \
62b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(Branch)                                   \
63b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(CallWithDescriptor)                       \
64b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(CallJSFunction)                           \
65b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(CallFunction)                             \
66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(CallNew)                                  \
67b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(CallNewArray)                             \
68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(CallRuntime)                              \
69b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(CallStub)                                 \
70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(CapturedObject)                           \
71b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(Change)                                   \
72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(CheckHeapObject)                          \
73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(CheckInstanceType)                        \
74b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(CheckMaps)                                \
75b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(CheckMapValue)                            \
76b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(CheckSmi)                                 \
77b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(CheckValue)                               \
78b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(ClampToUint8)                             \
79b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(ClassOfTestAndBranch)                     \
80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(CompareNumericAndBranch)                  \
81b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(CompareHoleAndBranch)                     \
82b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(CompareGeneric)                           \
83b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(CompareMinusZeroAndBranch)                \
84b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(CompareObjectEqAndBranch)                 \
85b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(CompareMap)                               \
86b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(Constant)                                 \
87b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(ConstructDouble)                          \
88b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(Context)                                  \
89b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(DateField)                                \
90b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(DebugBreak)                               \
91b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(DeclareGlobals)                           \
92b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(Deoptimize)                               \
93b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(Div)                                      \
94b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(DoubleBits)                               \
95b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(DummyUse)                                 \
96b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(EnterInlined)                             \
97b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(EnvironmentMarker)                        \
98b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(ForceRepresentation)                      \
99b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(ForInCacheArray)                          \
100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(ForInPrepareMap)                          \
101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(FunctionLiteral)                          \
102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(GetCachedArrayIndex)                      \
103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(Goto)                                     \
104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(HasCachedArrayIndexAndBranch)             \
105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(HasInstanceTypeAndBranch)                 \
106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(InnerAllocatedObject)                     \
107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(InstanceOf)                               \
108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(InstanceOfKnownGlobal)                    \
109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(InvokeFunction)                           \
110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(IsConstructCallAndBranch)                 \
111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(IsObjectAndBranch)                        \
112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(IsStringAndBranch)                        \
113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(IsSmiAndBranch)                           \
114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(IsUndetectableAndBranch)                  \
115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(LeaveInlined)                             \
116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(LoadContextSlot)                          \
117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(LoadFieldByIndex)                         \
118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(LoadFunctionPrototype)                    \
119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(LoadGlobalCell)                           \
120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(LoadGlobalGeneric)                        \
121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(LoadKeyed)                                \
122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(LoadKeyedGeneric)                         \
123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(LoadNamedField)                           \
124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(LoadNamedGeneric)                         \
125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(LoadRoot)                                 \
126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(MapEnumLength)                            \
127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(MathFloorOfDiv)                           \
128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(MathMinMax)                               \
129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(Mod)                                      \
130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(Mul)                                      \
131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(OsrEntry)                                 \
132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(Parameter)                                \
133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(Power)                                    \
134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(PushArguments)                            \
135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(RegExpLiteral)                            \
136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(Return)                                   \
137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(Ror)                                      \
138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(Sar)                                      \
139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(SeqStringGetChar)                         \
140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(SeqStringSetChar)                         \
141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(Shl)                                      \
142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(Shr)                                      \
143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(Simulate)                                 \
144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(StackCheck)                               \
145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(StoreCodeEntry)                           \
146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(StoreContextSlot)                         \
147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(StoreFrameContext)                        \
148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(StoreGlobalCell)                          \
149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(StoreKeyed)                               \
150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(StoreKeyedGeneric)                        \
151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(StoreNamedField)                          \
152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(StoreNamedGeneric)                        \
153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(StringAdd)                                \
154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(StringCharCodeAt)                         \
155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(StringCharFromCode)                       \
156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(StringCompareAndBranch)                   \
157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(Sub)                                      \
158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(TailCallThroughMegamorphicCache)          \
159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(ThisFunction)                             \
160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(ToFastProperties)                         \
161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(TransitionElementsKind)                   \
162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(TrapAllocationMemento)                    \
163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(Typeof)                                   \
164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(TypeofIsAndBranch)                        \
165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(UnaryMathOperation)                       \
166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(UnknownOSRValue)                          \
167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(UseConst)                                 \
1683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  V(WrapReceiver)
169b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define GVN_TRACKED_FLAG_LIST(V)               \
171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(NewSpacePromotion)
172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define GVN_UNTRACKED_FLAG_LIST(V)             \
174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(ArrayElements)                             \
175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(ArrayLengths)                              \
176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(StringLengths)                             \
177b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(BackingStoreFields)                        \
178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(Calls)                                     \
179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(ContextSlots)                              \
180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(DoubleArrayElements)                       \
181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(DoubleFields)                              \
1823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  V(ElementsKind)                              \
1833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  V(ElementsPointer)                           \
184b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(GlobalVars)                                \
185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(InobjectFields)                            \
186b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  V(Maps)                                      \
187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(OsrEntries)                                \
188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(ExternalMemory)                            \
189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(StringChars)                               \
190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(TypedArrayElements)
191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define DECLARE_ABSTRACT_INSTRUCTION(type)                              \
194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool Is##type() const FINAL OVERRIDE { return true; }   \
195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static H##type* cast(HValue* value) {                                 \
196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(value->Is##type());                                          \
197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return reinterpret_cast<H##type*>(value);                           \
198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
199b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define DECLARE_CONCRETE_INSTRUCTION(type)              \
202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual LInstruction* CompileToLithium(               \
203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch     LChunkBuilder* builder) FINAL OVERRIDE;      \
204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static H##type* cast(HValue* value) {                 \
205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(value->Is##type());                          \
206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return reinterpret_cast<H##type*>(value);           \
207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }                                                     \
208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Opcode opcode() const FINAL OVERRIDE {  \
209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return HValue::k##type;                             \
210257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
211b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
212b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum PropertyAccessType { LOAD, STORE };
214b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
215b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass Range FINAL : public ZoneObject {
217b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
218e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  Range()
219e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      : lower_(kMinInt),
220e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        upper_(kMaxInt),
221e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        next_(NULL),
222e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        can_be_minus_zero_(false) { }
223b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
224b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Range(int32_t lower, int32_t upper)
225e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      : lower_(lower),
226e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        upper_(upper),
227e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        next_(NULL),
228e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch        can_be_minus_zero_(false) { }
229b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
230b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int32_t upper() const { return upper_; }
231b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int32_t lower() const { return lower_; }
232b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Range* next() const { return next_; }
2333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Range* CopyClearLower(Zone* zone) const {
2343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return new(zone) Range(kMinInt, upper_);
2353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
2363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Range* CopyClearUpper(Zone* zone) const {
2373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return new(zone) Range(lower_, kMaxInt);
2383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
2393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Range* Copy(Zone* zone) const {
2403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    Range* result = new(zone) Range(lower_, upper_);
24169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    result->set_can_be_minus_zero(CanBeMinusZero());
24269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    return result;
24369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  }
244b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int32_t Mask() const;
245b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void set_can_be_minus_zero(bool b) { can_be_minus_zero_ = b; }
246b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool CanBeMinusZero() const { return CanBeZero() && can_be_minus_zero_; }
247b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool CanBeZero() const { return upper_ >= 0 && lower_ <= 0; }
248b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool CanBeNegative() const { return lower_ < 0; }
249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool CanBePositive() const { return upper_ > 0; }
250e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  bool Includes(int value) const { return lower_ <= value && upper_ >= value; }
25169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  bool IsMostGeneric() const {
25269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    return lower_ == kMinInt && upper_ == kMaxInt && CanBeMinusZero();
25369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  }
254e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  bool IsInSmiRange() const {
255e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return lower_ >= Smi::kMinValue && upper_ <= Smi::kMaxValue;
256b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void ClampToSmi() {
258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    lower_ = Max(lower_, Smi::kMinValue);
259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    upper_ = Min(upper_, Smi::kMaxValue);
260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
261e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  void KeepOrder();
2623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#ifdef DEBUG
263e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  void Verify() const;
2643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#endif
265b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
266b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void StackUpon(Range* other) {
267b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    Intersect(other);
268b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    next_ = other;
269b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
270b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
271e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  void Intersect(Range* other);
272e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  void Union(Range* other);
273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void CombinedMax(Range* other);
274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void CombinedMin(Range* other);
275b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
276e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  void AddConstant(int32_t value);
277e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  void Sar(int32_t value);
278e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  void Shl(int32_t value);
279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool AddAndCheckOverflow(const Representation& r, Range* other);
280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool SubAndCheckOverflow(const Representation& r, Range* other);
281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool MulAndCheckOverflow(const Representation& r, Range* other);
282b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
283b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
284b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int32_t lower_;
285b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int32_t upper_;
286b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Range* next_;
287b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool can_be_minus_zero_;
288b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
289b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
290b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
291257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochclass HUseListNode: public ZoneObject {
292257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public:
293257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HUseListNode(HValue* value, int index, HUseListNode* tail)
294257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      : tail_(tail), value_(value), index_(index) {
295257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
296257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HUseListNode* tail();
298257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HValue* value() const { return value_; }
299257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  int index() const { return index_; }
300257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
301257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  void set_tail(HUseListNode* list) { tail_ = list; }
302257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
303257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#ifdef DEBUG
304257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  void Zap() {
305257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    tail_ = reinterpret_cast<HUseListNode*>(1);
306257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    value_ = NULL;
307257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    index_ = -1;
308257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
309257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#endif
310257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
311257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch private:
312257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HUseListNode* tail_;
313257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HValue* value_;
314257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  int index_;
315257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
316257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
317257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
318257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// We reuse use list nodes behind the scenes as uses are added and deleted.
319257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// This class is the safe way to iterate uses while deleting them.
320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HUseIterator FINAL BASE_EMBEDDED {
321257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public:
322257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  bool Done() { return current_ == NULL; }
323257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  void Advance();
324257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
325257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HValue* value() {
326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(!Done());
327257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return value_;
328257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
329257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
330257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  int index() {
331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(!Done());
332257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return index_;
333257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
334257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
335257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch private:
336257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  explicit HUseIterator(HUseListNode* head);
337257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
338257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HUseListNode* current_;
339257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HUseListNode* next_;
340257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HValue* value_;
341257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  int index_;
342257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
343257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  friend class HValue;
344257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
345257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
346257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// All tracked flags should appear before untracked ones.
3483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochenum GVNFlag {
3493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Declare global value numbering flags.
350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define DECLARE_FLAG(Type) k##Type,
351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  GVN_TRACKED_FLAG_LIST(DECLARE_FLAG)
352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  GVN_UNTRACKED_FLAG_LIST(DECLARE_FLAG)
3533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#undef DECLARE_FLAG
354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define COUNT_FLAG(Type) + 1
355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  kNumberOfTrackedSideEffects = 0 GVN_TRACKED_FLAG_LIST(COUNT_FLAG),
356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  kNumberOfUntrackedSideEffects = 0 GVN_UNTRACKED_FLAG_LIST(COUNT_FLAG),
357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef COUNT_FLAG
358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  kNumberOfFlags = kNumberOfTrackedSideEffects + kNumberOfUntrackedSideEffects
359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic inline GVNFlag GVNFlagFromInt(int i) {
363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(i >= 0);
364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(i < kNumberOfFlags);
365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return static_cast<GVNFlag>(i);
366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass DecompositionResult FINAL BASE_EMBEDDED {
370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DecompositionResult() : base_(NULL), offset_(0), scale_(0) {}
372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* base() { return base_; }
374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int offset() { return offset_; }
375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int scale() { return scale_; }
376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool Apply(HValue* other_base, int other_offset, int other_scale = 0) {
378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (base_ == NULL) {
379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      base_ = other_base;
380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      offset_ = other_offset;
381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      scale_ = other_scale;
382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return true;
383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else {
384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (scale_ == 0) {
385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        base_ = other_base;
386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        offset_ += other_offset;
387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        scale_ = other_scale;
388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return true;
389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      } else {
390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return false;
391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void SwapValues(HValue** other_base, int* other_offset, int* other_scale) {
396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    swap(&base_, other_base);
397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    swap(&offset_, other_offset);
398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    swap(&scale_, other_scale);
399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  template <class T> void swap(T* a, T* b) {
403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    T c(*a);
404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    *a = *b;
405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    *b = c;
406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* base_;
409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int offset_;
410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int scale_;
411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtypedef EnumSet<GVNFlag, int32_t> GVNFlagSet;
415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// This class encapsulates encoding and decoding of sources positions from
418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// which hydrogen values originated.
419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// When FLAG_track_hydrogen_positions is set this object encodes the
420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// identifier of the inlining and absolute offset from the start of the
421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// inlined function.
422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// When the flag is not set we simply track absolute offset from the
423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// script start.
424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HSourcePosition {
425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HSourcePosition(const HSourcePosition& other) : value_(other.value_) { }
427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HSourcePosition Unknown() {
429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return HSourcePosition(RelocInfo::kNoPosition);
430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool IsUnknown() const { return value_ == RelocInfo::kNoPosition; }
433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int position() const { return PositionField::decode(value_); }
435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void set_position(int position) {
436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (FLAG_hydrogen_track_positions) {
437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      value_ = static_cast<int>(PositionField::update(value_, position));
438b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else {
439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      value_ = position;
440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int inlining_id() const { return InliningIdField::decode(value_); }
444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void set_inlining_id(int inlining_id) {
445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (FLAG_hydrogen_track_positions) {
446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      value_ = static_cast<int>(InliningIdField::update(value_, inlining_id));
447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int raw() const { return value_; }
451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
452b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  typedef BitField<int, 0, 9> InliningIdField;
454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Offset from the start of the inlined function.
456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  typedef BitField<int, 9, 23> PositionField;
457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit HSourcePosition(int value) : value_(value) { }
459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  friend class HPositionInfo;
461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  friend class LCodeGenBase;
462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // If FLAG_hydrogen_track_positions is set contains bitfields InliningIdField
464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // and PositionField.
465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Otherwise contains absolute offset from the script start.
466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int value_;
4673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
4683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochOStream& operator<<(OStream& os, const HSourcePosition& p);
4713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HValue : public ZoneObject {
474b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
475b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static const int kNoNumber = -1;
476b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
477b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  enum Flag {
478b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kFlexibleRepresentation,
479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    kCannotBeTagged,
4803fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    // Participate in Global Value Numbering, i.e. elimination of
4813fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    // unnecessary recomputations. If an instruction sets this flag, it must
4823fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    // implement DataEquals(), which will be used to determine if other
4833fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    // occurrences of the instruction are indeed the same.
484b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kUseGVN,
485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // Track instructions that are dominating side effects. If an instruction
486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // sets this flag, it must implement HandleSideEffectDominator() and should
487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // indicate which side effects to track by setting GVN flags.
488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    kTrackSideEffectDominators,
489b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kCanOverflow,
490b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kBailoutOnMinusZero,
491b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kCanBeDivByZero,
492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    kLeftCanBeMinInt,
493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    kLeftCanBeNegative,
494b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    kLeftCanBePositive,
495b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    kAllowUndefinedAsNaN,
496b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kIsArguments,
497b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    kTruncatingToInt32,
498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    kAllUsesTruncatingToInt32,
499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    kTruncatingToSmi,
500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    kAllUsesTruncatingToSmi,
501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // Set after an instruction is killed.
5023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    kIsDead,
503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // Instructions that are allowed to produce full range unsigned integer
504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // values are marked with kUint32 flag. If arithmetic shift or a load from
505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // EXTERNAL_UINT32_ELEMENTS array is not marked with this flag
506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // it will deoptimize if result does not fit into signed integer range.
507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // HGraph::ComputeSafeUint32Operations is responsible for setting this
508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // flag.
509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    kUint32,
510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    kHasNoObservableSideEffects,
511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // Indicates an instruction shouldn't be replaced by optimization, this flag
512b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // is useful to set in cases where recomputing a value is cheaper than
513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // extending the value's live range and spilling it.
514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    kCantBeReplaced,
515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // Indicates the instruction is live during dead code elimination.
516b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    kIsLive,
517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // HEnvironmentMarkers are deleted before dead code
519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // elimination takes place, so they can repurpose the kIsLive flag:
520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    kEndsLiveRange = kIsLive,
521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // TODO(everyone): Don't forget to update this!
523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    kLastFlag = kIsLive
524b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  };
525b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
526b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  STATIC_ASSERT(kLastFlag < kBitsPerInt);
527b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
528b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static HValue* cast(HValue* value) { return value; }
529b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
530b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  enum Opcode {
531b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // Declare a unique enum value for each hydrogen instruction.
532257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  #define DECLARE_OPCODE(type) k##type,
533257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    HYDROGEN_CONCRETE_INSTRUCTION_LIST(DECLARE_OPCODE)
534257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    kPhi
535257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  #undef DECLARE_OPCODE
536b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  };
537257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  virtual Opcode opcode() const = 0;
538257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
539257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // Declare a non-virtual predicates for each concrete HInstruction or HValue.
540257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  #define DECLARE_PREDICATE(type) \
541257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    bool Is##type() const { return opcode() == k##type; }
542257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    HYDROGEN_CONCRETE_INSTRUCTION_LIST(DECLARE_PREDICATE)
543257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  #undef DECLARE_PREDICATE
544257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    bool IsPhi() const { return opcode() == kPhi; }
545257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
546257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // Declare virtual predicates for abstract HInstruction or HValue
547257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  #define DECLARE_PREDICATE(type) \
548257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    virtual bool Is##type() const { return false; }
549257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    HYDROGEN_ABSTRACT_INSTRUCTION_LIST(DECLARE_PREDICATE)
550257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  #undef DECLARE_PREDICATE
551b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool IsBitwiseBinaryShift() {
553b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return IsShl() || IsShr() || IsSar();
554b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit HValue(HType type = HType::Tagged())
557b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : block_(NULL),
558b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        id_(kNoNumber),
559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        type_(type),
560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        use_list_(NULL),
561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        range_(NULL),
562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef DEBUG
563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        range_poisoned_(false),
564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif
565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        flags_(0) {}
566b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual ~HValue() {}
567b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual HSourcePosition position() const {
569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return HSourcePosition::Unknown();
570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual HSourcePosition operand_position(int index) const {
572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return position();
573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
575b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HBasicBlock* block() const { return block_; }
576b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void SetBlock(HBasicBlock* block);
577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Note: Never call this method for an unlinked value.
579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Isolate* isolate() const;
580b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
581b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int id() const { return id_; }
582b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void set_id(int id) { id_ = id; }
583b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
584257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HUseIterator uses() const { return HUseIterator(use_list_); }
585b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
58644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  virtual bool EmitAtUses() { return false; }
587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
588b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Representation representation() const { return representation_; }
589b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void ChangeRepresentation(Representation r) {
590b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(CheckFlag(kFlexibleRepresentation));
591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(!CheckFlag(kCannotBeTagged) || !r.IsTagged());
592b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    RepresentationChanged(r);
593b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    representation_ = r;
594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (r.IsTagged()) {
595b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      // Tagged is the bottom of the lattice, don't go any further.
596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      ClearFlag(kFlexibleRepresentation);
597b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
598b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
599b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual void AssumeRepresentation(Representation r);
600257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation KnownOptimalRepresentation() {
602b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Representation r = representation();
603b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (r.IsTagged()) {
604b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      HType t = type();
605b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (t.IsSmi()) return Representation::Smi();
606b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (t.IsHeapNumber()) return Representation::Double();
607b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (t.IsHeapObject()) return r;
608b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return Representation::None();
609b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
610b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return r;
611b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
612b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
613b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HType type() const { return type_; }
61469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  void set_type(HType new_type) {
615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(new_type.IsSubtypeOf(type_));
61669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    type_ = new_type;
617b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
618b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
619b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // There are HInstructions that do not really change a value, they
620b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // only add pieces of information to it (like bounds checks, map checks,
621b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // smi checks...).
622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // We call these instructions "informative definitions", or "iDef".
623b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // One of the iDef operands is special because it is the value that is
624b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // "transferred" to the output, we call it the "redefined operand".
625b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // If an HValue is an iDef it must override RedefinedOperandIndex() so that
626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // it does not return kNoRedefinedOperand;
627b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static const int kNoRedefinedOperand = -1;
628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual int RedefinedOperandIndex() { return kNoRedefinedOperand; }
629b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool IsInformativeDefinition() {
630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return RedefinedOperandIndex() != kNoRedefinedOperand;
631b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* RedefinedOperand() {
633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    int index = RedefinedOperandIndex();
634b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return index == kNoRedefinedOperand ? NULL : OperandAt(index);
635b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool CanReplaceWithDummyUses();
638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual int argument_delta() const { return 0; }
640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // A purely informative definition is an idef that will not emit code and
642b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // should therefore be removed from the graph in the RestoreActualValues
643b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // phase (so that live ranges will be shorter).
644b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool IsPurelyInformativeDefinition() { return false; }
645b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
646b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // This method must always return the original HValue SSA definition,
647b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // regardless of any chain of iDefs of this value.
648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* ActualValue() {
649b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HValue* value = this;
650b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    int index;
651b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    while ((index = value->RedefinedOperandIndex()) != kNoRedefinedOperand) {
652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      value = value->OperandAt(index);
653b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return value;
655b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
656b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
657b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool IsInteger32Constant();
658b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t GetInteger32Constant();
659b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool EqualsInteger32Constant(int32_t value);
660b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
661b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool IsDefinedAfter(HBasicBlock* other) const;
662b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
663b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Operands.
664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual int OperandCount() const = 0;
665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual HValue* OperandAt(int index) const = 0;
666b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void SetOperandAt(int index, HValue* value);
667b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
668257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  void DeleteAndReplaceWith(HValue* other);
669257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  void ReplaceAllUsesWith(HValue* other);
670257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  bool HasNoUses() const { return use_list_ == NULL; }
671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool HasOneUse() const {
672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return use_list_ != NULL && use_list_->tail() == NULL;
673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
674257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  bool HasMultipleUses() const {
675257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return use_list_ != NULL && use_list_->tail() != NULL;
676257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
677257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  int UseCount() const;
6783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
6793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Mark this HValue as dead and to be removed from other HValues' use lists.
6803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  void Kill();
681b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
682b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int flags() const { return flags_; }
6831e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  void SetFlag(Flag f) { flags_ |= (1 << f); }
6841e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  void ClearFlag(Flag f) { flags_ &= ~(1 << f); }
6851e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  bool CheckFlag(Flag f) const { return (flags_ & (1 << f)) != 0; }
686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void CopyFlag(Flag f, HValue* other) {
687b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (other->CheckFlag(f)) SetFlag(f);
688b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
6891e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
6903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Returns true if the flag specified is set for all uses, false otherwise.
691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool CheckUsesForFlag(Flag f) const;
692b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Same as before and the first one without the flag is returned in value.
693b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool CheckUsesForFlag(Flag f, HValue** value) const;
694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Returns true if the flag specified is set for all uses, and this set
695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // of uses is non-empty.
696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool HasAtLeastOneUseWithFlagAndNoneWithout(Flag f) const;
697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  GVNFlagSet ChangesFlags() const { return changes_flags_; }
699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  GVNFlagSet DependsOnFlags() const { return depends_on_flags_; }
700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void SetChangesFlag(GVNFlag f) { changes_flags_.Add(f); }
701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void SetDependsOnFlag(GVNFlag f) { depends_on_flags_.Add(f); }
702b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void ClearChangesFlag(GVNFlag f) { changes_flags_.Remove(f); }
703b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void ClearDependsOnFlag(GVNFlag f) { depends_on_flags_.Remove(f); }
704b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool CheckChangesFlag(GVNFlag f) const {
705b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return changes_flags_.Contains(f);
706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool CheckDependsOnFlag(GVNFlag f) const {
708b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return depends_on_flags_.Contains(f);
709b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void SetAllSideEffects() { changes_flags_.Add(AllSideEffectsFlagSet()); }
7113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  void ClearAllSideEffects() {
712b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    changes_flags_.Remove(AllSideEffectsFlagSet());
7133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
7143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool HasSideEffects() const {
715b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return changes_flags_.ContainsAnyOf(AllSideEffectsFlagSet());
7163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
7173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool HasObservableSideEffects() const {
718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return !CheckFlag(kHasNoObservableSideEffects) &&
719b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        changes_flags_.ContainsAnyOf(AllObservableSideEffectsFlagSet());
7203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
7213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  GVNFlagSet SideEffectFlags() const {
723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    GVNFlagSet result = ChangesFlags();
7243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    result.Intersect(AllSideEffectsFlagSet());
7253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return result;
7263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
7273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  GVNFlagSet ObservableChangesFlags() const {
729b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    GVNFlagSet result = ChangesFlags();
7303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    result.Intersect(AllObservableSideEffectsFlagSet());
7313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return result;
7323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
733589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
734b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Range* range() const {
735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(!range_poisoned_);
736b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return range_;
737b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool HasRange() const {
739b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(!range_poisoned_);
740b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return range_ != NULL;
741b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
742b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef DEBUG
743b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void PoisonRange() { range_poisoned_ = true; }
744b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif
7453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  void AddNewRange(Range* r, Zone* zone);
746b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void RemoveLastAddedRange();
7473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  void ComputeInitialRange(Zone* zone);
748b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
749b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Escape analysis helpers.
750b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool HasEscapingOperandAt(int index) { return true; }
751b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool HasOutOfBoundsAccess(int size) { return false; }
752e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
753b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Representation helpers.
754b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation observed_input_representation(int index) {
755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return Representation::None();
756b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
757b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) = 0;
758b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual void InferRepresentation(HInferRepresentationPhase* h_infer);
759b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
760b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // This gives the instruction an opportunity to replace itself with an
761b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // instruction that does the same in some better way.  To replace an
762b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // instruction with a new one, first add the new instruction to the graph,
763b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // then return it.  Return NULL to have the instruction deleted.
764b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual HValue* Canonicalize() { return this; }
765b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
766e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  bool Equals(HValue* other);
767e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual intptr_t Hashcode();
768b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
769b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Compute unique ids upfront that is safe wrt GC and concurrent compilation.
770b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual void FinalizeUniqueness() { }
771b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
772b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Printing support.
773b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual OStream& PrintTo(OStream& os) const = 0;  // NOLINT
774b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
775257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  const char* Mnemonic() const;
776b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
777b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Type information helpers.
778b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool HasMonomorphicJSObjectType();
779b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
780b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // TODO(mstarzinger): For now instructions can override this function to
781b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // specify statically known types, once HType can convey more information
782b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // it should be based on the HType.
783b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Handle<Map> GetMonomorphicJSObjectMap() { return Handle<Map>(); }
784b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
785b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Updated the inferred type of this instruction and returns true if
786b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // it has changed.
787b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool UpdateInferredType();
788b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
789e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual HType CalculateInferredType();
790b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
791b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // This function must be overridden for instructions which have the
792b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // kTrackSideEffectDominators flag set, to track instructions that are
793b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // dominating side effects.
794b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // It returns true if it removed an instruction which had side effects.
795b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool HandleSideEffectDominator(GVNFlag side_effect,
796b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                         HValue* dominator) {
797b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    UNREACHABLE();
798b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return false;
799b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
801b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Check if this instruction has some reason that prevents elimination.
802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool CannotBeEliminated() const {
803b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return HasObservableSideEffects() || !IsDeletable();
804b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
806b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG
8071e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  virtual void Verify() = 0;
808b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif
809b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
810b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool TryDecompose(DecompositionResult* decomposition) {
811b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (RedefinedOperand() != NULL) {
812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return RedefinedOperand()->TryDecompose(decomposition);
813b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else {
814b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return false;
815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
816b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
817b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
818b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Returns true conservatively if the program might be able to observe a
819b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // ToString() operation on this value.
820b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool ToStringCanBeObserved() const {
821b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return ToStringOrToNumberCanBeObserved();
822b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
823b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
824b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Returns true conservatively if the program might be able to observe a
825b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // ToNumber() operation on this value.
826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool ToNumberCanBeObserved() const {
827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return ToStringOrToNumberCanBeObserved();
828b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
829b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
830b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MinusZeroMode GetMinusZeroMode() {
831b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return CheckFlag(kBailoutOnMinusZero)
832b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        ? FAIL_ON_MINUS_ZERO : TREAT_MINUS_ZERO_AS_ZERO;
833b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
834b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
835b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
8361e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  // This function must be overridden for instructions with flag kUseGVN, to
8371e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  // compare the non-Operand parts of the instruction.
838e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual bool DataEquals(HValue* other) {
8391e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    UNREACHABLE();
8401e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return false;
8411e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
842b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
843b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool ToStringOrToNumberCanBeObserved() const {
844b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (type().IsTaggedPrimitive()) return false;
845b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (type().IsJSObject()) return true;
846b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return !representation().IsSmiOrInteger32() && !representation().IsDouble();
847b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
848b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
849b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RepresentationFromInputs() {
850b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return representation();
851b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
852b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RepresentationFromUses();
853b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Representation RepresentationFromUseRequirements();
854b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool HasNonSmiUse();
855b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual void UpdateRepresentation(Representation new_rep,
856b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                    HInferRepresentationPhase* h_infer,
857b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                    const char* reason);
858b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void AddDependantsToWorklist(HInferRepresentationPhase* h_infer);
859b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
860b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual void RepresentationChanged(Representation to) { }
861b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
8623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Range* InferRange(Zone* zone);
863b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual void DeleteFromGraph() = 0;
864e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  virtual void InternalSetOperandAt(int index, HValue* value) = 0;
865b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void clear_block() {
866b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(block_ != NULL);
867b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    block_ = NULL;
868b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
869b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
870b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void set_representation(Representation r) {
871b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(representation_.IsNone() && !r.IsNone());
872b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    representation_ = r;
873b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
874b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
875b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static GVNFlagSet AllFlagSet() {
8763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    GVNFlagSet result;
877b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define ADD_FLAG(Type) result.Add(k##Type);
878b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  GVN_TRACKED_FLAG_LIST(ADD_FLAG)
879b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  GVN_UNTRACKED_FLAG_LIST(ADD_FLAG)
880589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch#undef ADD_FLAG
881589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    return result;
882589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  }
883589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
8841e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  // A flag mask to mark an instruction as having arbitrary side effects.
8853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  static GVNFlagSet AllSideEffectsFlagSet() {
886b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    GVNFlagSet result = AllFlagSet();
887b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    result.Remove(kOsrEntries);
8883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return result;
8893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
890b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  friend OStream& operator<<(OStream& os, const ChangesOf& v);
8913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
8923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // A flag mask of all side effects that can make observable changes in
8933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // an executing program (i.e. are not safe to repeat, move or remove);
8943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  static GVNFlagSet AllObservableSideEffectsFlagSet() {
895b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    GVNFlagSet result = AllFlagSet();
896b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    result.Remove(kNewSpacePromotion);
897b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    result.Remove(kElementsKind);
898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    result.Remove(kElementsPointer);
899b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    result.Remove(kMaps);
9003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return result;
901592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  }
902592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
903257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // Remove the matching use from the use list if present.  Returns the
904257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // removed list node or NULL.
905257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HUseListNode* RemoveUse(HValue* value, int index);
906257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
907b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void RegisterUse(int index, HValue* new_value);
908b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
909b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HBasicBlock* block_;
910b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
911b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // The id of this instruction in the hydrogen graph, assigned when first
912b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // added to the graph. Reflects creation order.
913b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int id_;
914b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
915b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Representation representation_;
916b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HType type_;
917257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HUseListNode* use_list_;
918b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Range* range_;
919b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef DEBUG
920b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool range_poisoned_;
921b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif
922b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int flags_;
923b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  GVNFlagSet changes_flags_;
924b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  GVNFlagSet depends_on_flags_;
925b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
9263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private:
927b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool IsDeletable() const { return false; }
928b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
929b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(HValue);
930b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
931b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
932b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Support for printing various aspects of an HValue.
933b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstruct NameOf {
934b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit NameOf(const HValue* const v) : value(v) {}
935b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const HValue* value;
936b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
937b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
938b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
939b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstruct TypeOf {
940b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit TypeOf(const HValue* const v) : value(v) {}
941b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const HValue* value;
942b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
943b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
944b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
945b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstruct ChangesOf {
946b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit ChangesOf(const HValue* const v) : value(v) {}
947b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const HValue* value;
948b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
949b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
9503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
951b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochOStream& operator<<(OStream& os, const HValue& v);
952b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochOStream& operator<<(OStream& os, const NameOf& v);
953b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochOStream& operator<<(OStream& os, const TypeOf& v);
954b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochOStream& operator<<(OStream& os, const ChangesOf& v);
955b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
956b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
957b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define DECLARE_INSTRUCTION_FACTORY_P0(I)                                      \
958b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static I* New(Zone* zone, HValue* context) {                                 \
959b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return new(zone) I();                                                      \
960b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
961e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
962b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define DECLARE_INSTRUCTION_FACTORY_P1(I, P1)                                  \
963b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static I* New(Zone* zone, HValue* context, P1 p1) {                          \
964b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return new(zone) I(p1);                                                    \
965b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
966b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
967b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define DECLARE_INSTRUCTION_FACTORY_P2(I, P1, P2)                              \
968b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static I* New(Zone* zone, HValue* context, P1 p1, P2 p2) {                   \
969b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return new(zone) I(p1, p2);                                                \
970b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
971b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
972b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define DECLARE_INSTRUCTION_FACTORY_P3(I, P1, P2, P3)                          \
973b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static I* New(Zone* zone, HValue* context, P1 p1, P2 p2, P3 p3) {            \
974b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return new(zone) I(p1, p2, p3);                                            \
975b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
976b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
977b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define DECLARE_INSTRUCTION_FACTORY_P4(I, P1, P2, P3, P4)                      \
978b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static I* New(Zone* zone,                                                    \
979b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                HValue* context,                                               \
980b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                P1 p1,                                                         \
981b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                P2 p2,                                                         \
982b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                P3 p3,                                                         \
983b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                P4 p4) {                                                       \
984b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return new(zone) I(p1, p2, p3, p4);                                        \
985b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
986b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
987b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define DECLARE_INSTRUCTION_FACTORY_P5(I, P1, P2, P3, P4, P5)                  \
988b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static I* New(Zone* zone,                                                    \
989b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                HValue* context,                                               \
990b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                P1 p1,                                                         \
991b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                P2 p2,                                                         \
992b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                P3 p3,                                                         \
993b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                P4 p4,                                                         \
994b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                P5 p5) {                                                       \
995b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return new(zone) I(p1, p2, p3, p4, p5);                                    \
996b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
997257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
998b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define DECLARE_INSTRUCTION_FACTORY_P6(I, P1, P2, P3, P4, P5, P6)              \
999b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static I* New(Zone* zone,                                                    \
1000b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                HValue* context,                                               \
1001b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                P1 p1,                                                         \
1002b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                P2 p2,                                                         \
1003b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                P3 p3,                                                         \
1004b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                P4 p4,                                                         \
1005b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                P5 p5,                                                         \
1006b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                P6 p6) {                                                       \
1007b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return new(zone) I(p1, p2, p3, p4, p5, p6);                                \
1008b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1009b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1010b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P0(I)                         \
1011b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static I* New(Zone* zone, HValue* context) {                                 \
1012b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return new(zone) I(context);                                               \
1013b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1014b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1015b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P1(I, P1)                     \
1016b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static I* New(Zone* zone, HValue* context, P1 p1) {                          \
1017b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return new(zone) I(context, p1);                                           \
1018b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1019b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1020b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P2(I, P1, P2)                 \
1021b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static I* New(Zone* zone, HValue* context, P1 p1, P2 p2) {                   \
1022b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return new(zone) I(context, p1, p2);                                       \
1023b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1024b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1025b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P3(I, P1, P2, P3)             \
1026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static I* New(Zone* zone, HValue* context, P1 p1, P2 p2, P3 p3) {            \
1027b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return new(zone) I(context, p1, p2, p3);                                   \
1028b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
10291e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1030b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P4(I, P1, P2, P3, P4)         \
1031b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static I* New(Zone* zone,                                                    \
1032b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                HValue* context,                                               \
1033b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                P1 p1,                                                         \
1034b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                P2 p2,                                                         \
1035b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                P3 p3,                                                         \
1036b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                P4 p4) {                                                       \
1037b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return new(zone) I(context, p1, p2, p3, p4);                               \
1038b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1039b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1040b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P5(I, P1, P2, P3, P4, P5)     \
1041b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static I* New(Zone* zone,                                                    \
1042b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                HValue* context,                                               \
1043b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                P1 p1,                                                         \
1044b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                P2 p2,                                                         \
1045b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                P3 p3,                                                         \
1046b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                P4 p4,                                                         \
1047b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                P5 p5) {                                                       \
1048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return new(zone) I(context, p1, p2, p3, p4, p5);                           \
1049b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1050b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1051e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1052b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// A helper class to represent per-operand position information attached to
1053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// the HInstruction in the compact form. Uses tagging to distinguish between
1054b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// case when only instruction's position is available and case when operands'
1055b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// positions are also available.
1056b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// In the first case it contains intruction's position as a tagged value.
1057b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// In the second case it points to an array which contains instruction's
1058b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// position and operands' positions.
1059b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HPositionInfo {
1060b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
1061b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit HPositionInfo(int pos) : data_(TagPosition(pos)) { }
10623fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1063b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HSourcePosition position() const {
1064b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (has_operand_positions()) {
1065b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return operand_positions()[kInstructionPosIndex];
1066b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1067b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return HSourcePosition(static_cast<int>(UntagPosition(data_)));
10683fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
1069b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1070b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void set_position(HSourcePosition pos) {
1071b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (has_operand_positions()) {
1072b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      operand_positions()[kInstructionPosIndex] = pos;
1073b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else {
1074b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      data_ = TagPosition(pos.raw());
1075b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1076e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1077e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1078b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void ensure_storage_for_operand_positions(Zone* zone, int operand_count) {
1079b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (has_operand_positions()) {
1080b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return;
1081b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1082e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1083b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    const int length = kFirstOperandPosIndex + operand_count;
1084b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HSourcePosition* positions =
1085b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        zone->NewArray<HSourcePosition>(length);
1086b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (int i = 0; i < length; i++) {
1087b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      positions[i] = HSourcePosition::Unknown();
1088b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1089e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1090b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    const HSourcePosition pos = position();
1091b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    data_ = reinterpret_cast<intptr_t>(positions);
1092b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    set_position(pos);
1093b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1094b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(has_operand_positions());
1095b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1096b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1097b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HSourcePosition operand_position(int idx) const {
1098b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (!has_operand_positions()) {
1099b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return position();
1100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return *operand_position_slot(idx);
1102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void set_operand_position(int idx, HSourcePosition pos) {
1105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    *operand_position_slot(idx) = pos;
1106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
1109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static const intptr_t kInstructionPosIndex = 0;
1110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static const intptr_t kFirstOperandPosIndex = 1;
1111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HSourcePosition* operand_position_slot(int idx) const {
1113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(has_operand_positions());
1114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return &(operand_positions()[kFirstOperandPosIndex + idx]);
1115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool has_operand_positions() const {
1118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return !IsTaggedPosition(data_);
1119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HSourcePosition* operand_positions() const {
1122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(has_operand_positions());
1123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return reinterpret_cast<HSourcePosition*>(data_);
1124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static const intptr_t kPositionTag = 1;
1127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static const intptr_t kPositionShift = 1;
1128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static bool IsTaggedPosition(intptr_t val) {
1129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return (val & kPositionTag) != 0;
1130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static intptr_t UntagPosition(intptr_t val) {
1132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(IsTaggedPosition(val));
1133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return val >> kPositionShift;
1134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static intptr_t TagPosition(intptr_t val) {
1136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    const intptr_t result = (val << kPositionShift) | kPositionTag;
1137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(UntagPosition(result) == val);
1138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return result;
1139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  intptr_t data_;
1142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
1143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HInstruction : public HValue {
1146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
1147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HInstruction* next() const { return next_; }
1148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HInstruction* previous() const { return previous_; }
1149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual OStream& PrintTo(OStream& os) const OVERRIDE;  // NOLINT
1151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual OStream& PrintDataTo(OStream& os) const;          // NOLINT
1152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool IsLinked() const { return block() != NULL; }
1154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void Unlink();
1155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void InsertBefore(HInstruction* next);
1157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  template<class T> T* Prepend(T* instr) {
1159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    instr->InsertBefore(this);
1160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return instr;
1161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void InsertAfter(HInstruction* previous);
1164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  template<class T> T* Append(T* instr) {
1166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    instr->InsertAfter(this);
1167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return instr;
1168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // The position is a write-once variable.
1171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual HSourcePosition position() const OVERRIDE {
1172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return HSourcePosition(position_.position());
1173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool has_position() const {
1175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return !position().IsUnknown();
1176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void set_position(HSourcePosition position) {
1178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(!has_position());
1179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(!position.IsUnknown());
1180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    position_.set_position(position);
1181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual HSourcePosition operand_position(int index) const OVERRIDE {
1184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    const HSourcePosition pos = position_.operand_position(index);
1185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return pos.IsUnknown() ? position() : pos;
1186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void set_operand_position(Zone* zone, int index, HSourcePosition pos) {
1188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(0 <= index && index < OperandCount());
1189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    position_.ensure_storage_for_operand_positions(zone, OperandCount());
1190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    position_.set_operand_position(index, pos);
1191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool Dominates(HInstruction* other);
1194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool CanTruncateToSmi() const { return CheckFlag(kTruncatingToSmi); }
1195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool CanTruncateToInt32() const { return CheckFlag(kTruncatingToInt32); }
1196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual LInstruction* CompileToLithium(LChunkBuilder* builder) = 0;
1198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef DEBUG
1200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual void Verify() OVERRIDE;
1201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif
1202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool CanDeoptimize();
1204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool HasStackCheck() { return false; }
1206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_ABSTRACT_INSTRUCTION(Instruction)
1208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected:
1210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit HInstruction(HType type = HType::Tagged())
1211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : HValue(type),
1212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        next_(NULL),
1213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        previous_(NULL),
1214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        position_(RelocInfo::kNoPosition) {
1215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetDependsOnFlag(kOsrEntries);
1216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual void DeleteFromGraph() OVERRIDE { Unlink(); }
1219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
1221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void InitializeAsFirst(HBasicBlock* block) {
1222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(!IsLinked());
1223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetBlock(block);
1224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HInstruction* next_;
1227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HInstruction* previous_;
1228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HPositionInfo position_;
1229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  friend class HBasicBlock;
1231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
1232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<int V>
1235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HTemplateInstruction : public HInstruction {
1236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
1237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual int OperandCount() const FINAL OVERRIDE { return V; }
1238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual HValue* OperandAt(int i) const FINAL OVERRIDE {
1239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return inputs_[i];
1240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected:
1243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit HTemplateInstruction(HType type = HType::Tagged())
1244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : HInstruction(type) {}
1245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual void InternalSetOperandAt(int i, HValue* value) FINAL OVERRIDE {
1247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[i] = value;
1248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
1251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EmbeddedContainer<HValue*, V> inputs_;
1252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
1253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HControlInstruction : public HInstruction {
1256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
1257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual HBasicBlock* SuccessorAt(int i) const = 0;
1258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual int SuccessorCount() const = 0;
1259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual void SetSuccessorAt(int i, HBasicBlock* block) = 0;
1260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual OStream& PrintDataTo(OStream& os) const OVERRIDE;  // NOLINT
1262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool KnownSuccessorBlock(HBasicBlock** block) {
1264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    *block = NULL;
1265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return false;
1266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HBasicBlock* FirstSuccessor() {
1269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return SuccessorCount() > 0 ? SuccessorAt(0) : NULL;
1270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HBasicBlock* SecondSuccessor() {
1272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return SuccessorCount() > 1 ? SuccessorAt(1) : NULL;
1273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void Not() {
1276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HBasicBlock* swap = SuccessorAt(0);
1277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetSuccessorAt(0, SuccessorAt(1));
1278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetSuccessorAt(1, swap);
1279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_ABSTRACT_INSTRUCTION(ControlInstruction)
1282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
1283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HSuccessorIterator FINAL BASE_EMBEDDED {
1286e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch public:
1287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit HSuccessorIterator(const HControlInstruction* instr)
1288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : instr_(instr), current_(0) {}
1289e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
12903fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  bool Done() { return current_ >= instr_->SuccessorCount(); }
12913fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HBasicBlock* Current() { return instr_->SuccessorAt(current_); }
12923fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  void Advance() { current_++; }
1293e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1294e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch private:
1295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const HControlInstruction* instr_;
12963fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  int current_;
1297e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch};
1298e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1299e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
13003fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochtemplate<int S, int V>
1301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HTemplateControlInstruction : public HControlInstruction {
1302e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch public:
1303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int SuccessorCount() const OVERRIDE { return S; }
1304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HBasicBlock* SuccessorAt(int i) const OVERRIDE { return successors_[i]; }
1305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void SetSuccessorAt(int i, HBasicBlock* block) OVERRIDE {
1306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    successors_[i] = block;
1307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
13083fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int OperandCount() const OVERRIDE { return V; }
1310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* OperandAt(int i) const OVERRIDE { return inputs_[i]; }
1311e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
13123fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1313e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch protected:
1314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void InternalSetOperandAt(int i, HValue* value) OVERRIDE {
1315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[i] = value;
1316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1317e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1318e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch private:
13193fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  EmbeddedContainer<HBasicBlock*, S> successors_;
13203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  EmbeddedContainer<HValue*, V> inputs_;
1321e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch};
1322e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1323e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HBlockEntry FINAL : public HTemplateInstruction<0> {
1325e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch public:
1326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
1327e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
1328e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1329e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1330257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(BlockEntry)
1331e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch};
1332e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1333e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HDummyUse FINAL : public HTemplateInstruction<1> {
13353fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch public:
1336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit HDummyUse(HValue* value)
1337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : HTemplateInstruction<1>(HType::Smi()) {
1338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(0, value);
1339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // Pretend to be a Smi so that the HChange instructions inserted
1340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // before any use generate as little code as possible.
1341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    set_representation(Representation::Tagged());
1342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* value() const { return OperandAt(0); }
1345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool HasEscapingOperandAt(int index) OVERRIDE { return false; }
1347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
13483fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return Representation::None();
13493fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
13503fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual OStream& PrintDataTo(OStream& os) const OVERRIDE;  // NOLINT
1352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(DummyUse);
13543fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch};
13553fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
13563fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Inserts an int3/stop break instruction for debugging purposes.
1358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HDebugBreak FINAL : public HTemplateInstruction<0> {
1359e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch public:
1360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P0(HDebugBreak);
1361e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
1363e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
1364e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
13651e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(DebugBreak)
1367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
13683fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
136944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HGoto FINAL : public HTemplateControlInstruction<1, 0> {
1371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
1372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit HGoto(HBasicBlock* target) {
1373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetSuccessorAt(0, target);
137444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
137544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool KnownSuccessorBlock(HBasicBlock** block) OVERRIDE {
1377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    *block = FirstSuccessor();
1378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return true;
1379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
138044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
1382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return Representation::None();
138344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
138444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual OStream& PrintDataTo(OStream& os) const OVERRIDE;  // NOLINT
1386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(Goto)
1388b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1389b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1390b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HDeoptimize FINAL : public HTemplateControlInstruction<1, 0> {
1392b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
1393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HDeoptimize* New(Zone* zone,
1394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                          HValue* context,
1395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                          const char* reason,
1396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                          Deoptimizer::BailoutType type,
1397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                          HBasicBlock* unreachable_continuation) {
1398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return new(zone) HDeoptimize(reason, type, unreachable_continuation);
13993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
1400b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool KnownSuccessorBlock(HBasicBlock** block) OVERRIDE {
1402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    *block = NULL;
1403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return true;
1404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
1407e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
1408e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1409e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const char* reason() const { return reason_; }
1411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Deoptimizer::BailoutType type() { return type_; }
1412589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
1413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(Deoptimize)
1414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
1416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit HDeoptimize(const char* reason,
1417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                       Deoptimizer::BailoutType type,
1418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                       HBasicBlock* unreachable_continuation)
1419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : reason_(reason), type_(type) {
1420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetSuccessorAt(0, unreachable_continuation);
1421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const char* reason_;
1424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Deoptimizer::BailoutType type_;
1425b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1426b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1427b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HUnaryControlInstruction : public HTemplateControlInstruction<2, 1> {
1429b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
14303fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HUnaryControlInstruction(HValue* value,
14313fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch                           HBasicBlock* true_target,
14323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch                           HBasicBlock* false_target) {
1433b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetOperandAt(0, value);
14343fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetSuccessorAt(0, true_target);
14353fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetSuccessorAt(1, false_target);
1436b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1437b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1438b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual OStream& PrintDataTo(OStream& os) const OVERRIDE;  // NOLINT
1439b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* value() const { return OperandAt(0); }
1441b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1442b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1443b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HBranch FINAL : public HUnaryControlInstruction {
1445b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
1446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P1(HBranch, HValue*);
1447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P2(HBranch, HValue*,
1448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                 ToBooleanStub::Types);
1449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P4(HBranch, HValue*,
1450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                 ToBooleanStub::Types,
1451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                 HBasicBlock*, HBasicBlock*);
14523fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
1454b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return Representation::None();
1455b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation observed_input_representation(int index) OVERRIDE;
1457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool KnownSuccessorBlock(HBasicBlock** block) OVERRIDE;
1459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual OStream& PrintDataTo(OStream& os) const OVERRIDE;  // NOLINT
1461b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
146269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  ToBooleanStub::Types expected_input_types() const {
146369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    return expected_input_types_;
146469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  }
146569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
14663fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Branch)
146769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
146869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch private:
1469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HBranch(HValue* value,
1470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          ToBooleanStub::Types expected_input_types = ToBooleanStub::Types(),
1471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          HBasicBlock* true_target = NULL,
1472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          HBasicBlock* false_target = NULL)
1473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : HUnaryControlInstruction(value, true_target, false_target),
1474b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        expected_input_types_(expected_input_types) {
1475b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetFlag(kAllowUndefinedAsNaN);
1476b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
147869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  ToBooleanStub::Types expected_input_types_;
1479b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1480b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1481b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HCompareMap FINAL : public HUnaryControlInstruction {
1483b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
1484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P2(HCompareMap, HValue*, Handle<Map>);
1485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P4(HCompareMap, HValue*, Handle<Map>,
1486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                 HBasicBlock*, HBasicBlock*);
1487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool KnownSuccessorBlock(HBasicBlock** block) OVERRIDE {
1489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (known_successor_index() != kNoKnownSuccessorIndex) {
1490b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      *block = SuccessorAt(known_successor_index());
1491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return true;
1492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    *block = NULL;
1494b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return false;
1495b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1496b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual OStream& PrintDataTo(OStream& os) const OVERRIDE;  // NOLINT
1498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static const int kNoKnownSuccessorIndex = -1;
1500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int known_successor_index() const { return known_successor_index_; }
1501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void set_known_successor_index(int known_successor_index) {
1502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    known_successor_index_ = known_successor_index;
1503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1504b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Unique<Map> map() const { return map_; }
1506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool map_is_stable() const { return map_is_stable_; }
1507b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
1509e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::Tagged();
1510e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1511e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1512257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CompareMap)
1513b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected:
1515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual int RedefinedOperandIndex() { return 0; }
1516b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1517b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
1518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HCompareMap(HValue* value,
1519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch              Handle<Map> map,
1520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch              HBasicBlock* true_target = NULL,
1521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch              HBasicBlock* false_target = NULL)
1522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : HUnaryControlInstruction(value, true_target, false_target),
1523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        known_successor_index_(kNoKnownSuccessorIndex),
1524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        map_is_stable_(map->is_stable()),
1525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        map_(Unique<Map>::CreateImmovable(map)) {
1526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    set_representation(Representation::Tagged());
1527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int known_successor_index_ : 31;
1530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool map_is_stable_ : 1;
1531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Unique<Map> map_;
1532b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1533b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1534b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HContext FINAL : public HTemplateInstruction<0> {
1536b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
1537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HContext* New(Zone* zone) {
1538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return new(zone) HContext();
15391e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
1540b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1541b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
1542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return Representation::None();
1543b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1544b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(Context)
1546b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected:
1548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool DataEquals(HValue* other) OVERRIDE { return true; }
1549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1550b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
1551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HContext() {
1552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    set_representation(Representation::Tagged());
1553b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetFlag(kUseGVN);
1554b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool IsDeletable() const OVERRIDE { return true; }
1557b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
1558b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HReturn FINAL : public HTemplateControlInstruction<0, 3> {
1561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
1562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P2(HReturn, HValue*, HValue*);
1563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P1(HReturn, HValue*);
1564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
1566b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // TODO(titzer): require an Int32 input for faster returns.
1567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (index == 2) return Representation::Smi();
1568e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::Tagged();
1569e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1570e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual OStream& PrintDataTo(OStream& os) const OVERRIDE;  // NOLINT
15723fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* value() const { return OperandAt(0); }
1574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* context() const { return OperandAt(1); }
1575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* parameter_count() const { return OperandAt(2); }
15763fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1577257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Return)
1578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
1580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HReturn(HValue* context, HValue* value, HValue* parameter_count = 0) {
1581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(0, value);
1582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(1, context);
1583b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(2, parameter_count);
1584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1585b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1586b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1587b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1588b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HAbnormalExit FINAL : public HTemplateControlInstruction<0, 0> {
1589b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
1590b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P0(HAbnormalExit);
1591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1592b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
1593e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
1594e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1595b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1596257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(AbnormalExit)
1597b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
1598b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HAbnormalExit() {}
1599b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1600b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1601b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1602b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HUnaryOperation : public HTemplateInstruction<1> {
1603b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
1604b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit HUnaryOperation(HValue* value, HType type = HType::Tagged())
1605b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : HTemplateInstruction<1>(type) {
1606b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetOperandAt(0, value);
1607b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1608b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
16093fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  static HUnaryOperation* cast(HValue* value) {
16103fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return reinterpret_cast<HUnaryOperation*>(value);
16113fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
16123fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* value() const { return OperandAt(0); }
1614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual OStream& PrintDataTo(OStream& os) const OVERRIDE;  // NOLINT
1615b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1616b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1617b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1618b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HUseConst FINAL : public HUnaryOperation {
16191e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public:
1620b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P1(HUseConst, HValue*);
16211e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
1623b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return Representation::None();
16241e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
16251e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(UseConst)
16273fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
1629b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    explicit HUseConst(HValue* old_value) : HUnaryOperation(old_value) { }
1630257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
1631257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1632257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HForceRepresentation FINAL : public HTemplateInstruction<1> {
16343fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch public:
1635b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HInstruction* New(Zone* zone, HValue* context, HValue* value,
1636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           Representation required_representation);
16373fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* value() const { return OperandAt(0); }
1639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
1641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return representation();  // Same as the output representation.
16423fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
16433fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1644b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual OStream& PrintDataTo(OStream& os) const OVERRIDE;  // NOLINT
16453fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1646b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(ForceRepresentation)
16473fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
1649257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HForceRepresentation(HValue* value, Representation required_representation) {
1650257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    SetOperandAt(0, value);
1651257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    set_representation(required_representation);
1652257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
16531e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block};
16541e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
16551e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1656b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HChange FINAL : public HUnaryOperation {
1657b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
1658b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HChange(HValue* value,
1659e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch          Representation to,
1660b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          bool is_truncating_to_smi,
1661b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          bool is_truncating_to_int32)
16623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      : HUnaryOperation(value) {
1663b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(!value->representation().IsNone());
1664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(!to.IsNone());
1665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(!value->representation().Equals(to));
1666b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(to);
1667b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kUseGVN);
1668b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetFlag(kCanOverflow);
1669b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (is_truncating_to_smi && to.IsSmi()) {
1670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      SetFlag(kTruncatingToSmi);
1671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      SetFlag(kTruncatingToInt32);
1672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (is_truncating_to_int32) SetFlag(kTruncatingToInt32);
1674b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (value->representation().IsSmi() || value->type().IsSmi()) {
1675b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      set_type(HType::Smi());
1676b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else {
1677b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      set_type(HType::TaggedNumber());
1678b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (to.IsTagged()) SetChangesFlag(kNewSpacePromotion);
1679b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1680b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1681b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool can_convert_undefined_to_nan() {
1683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return CheckUsesForFlag(kAllowUndefinedAsNaN);
16843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
1685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual HType CalculateInferredType() OVERRIDE;
1687b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual HValue* Canonicalize() OVERRIDE;
1688b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1689b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Representation from() const { return value()->representation(); }
1690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Representation to() const { return representation(); }
16913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool deoptimize_on_minus_zero() const {
16923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return CheckFlag(kBailoutOnMinusZero);
16933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
1694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
16953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return from();
1696b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1697b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Range* InferRange(Zone* zone) OVERRIDE;
169969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
1700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual OStream& PrintDataTo(OStream& os) const OVERRIDE;  // NOLINT
1701b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1702257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Change)
1703b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1704b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
1705b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool DataEquals(HValue* other) OVERRIDE { return true; }
1706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
1708b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool IsDeletable() const OVERRIDE {
1709b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return !from().IsTagged() || value()->type().IsSmi();
1710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1711b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1712b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1713b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1714b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HClampToUint8 FINAL : public HUnaryOperation {
1715257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public:
1716b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P1(HClampToUint8, HValue*);
1717b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
1719b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return Representation::None();
1720b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1721b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1722b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(ClampToUint8)
1723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1724b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected:
1725b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool DataEquals(HValue* other) OVERRIDE { return true; }
1726b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1727b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
1728b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit HClampToUint8(HValue* value)
1729b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : HUnaryOperation(value) {
17303fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    set_representation(Representation::Integer32());
1731b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetFlag(kAllowUndefinedAsNaN);
1732257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    SetFlag(kUseGVN);
1733257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
1734257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool IsDeletable() const OVERRIDE { return true; }
1736b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
1737b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1739b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HDoubleBits FINAL : public HUnaryOperation {
1740b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
1741b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  enum Bits { HIGH, LOW };
1742b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P2(HDoubleBits, HValue*, Bits);
1743b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1744b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
1745b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return Representation::Double();
1746257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
1747257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1748b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(DoubleBits)
1749b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1750b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Bits bits() { return bits_; }
17513fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
17523fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch protected:
1753b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool DataEquals(HValue* other) OVERRIDE {
1754b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return other->IsDoubleBits() && HDoubleBits::cast(other)->bits() == bits();
1755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1756b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1757b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
1758b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HDoubleBits(HValue* value, Bits bits)
1759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : HUnaryOperation(value), bits_(bits) {
1760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    set_representation(Representation::Integer32());
1761b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetFlag(kUseGVN);
1762b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1763b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1764b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool IsDeletable() const OVERRIDE { return true; }
1765b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1766b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Bits bits_;
17673fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch};
17683fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
17693fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1770b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HConstructDouble FINAL : public HTemplateInstruction<2> {
1771b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
1772b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P2(HConstructDouble, HValue*, HValue*);
1773b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1774b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
1775b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return Representation::Integer32();
1776b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1777b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1778b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(ConstructDouble)
1779b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1780b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* hi() { return OperandAt(0); }
1781b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* lo() { return OperandAt(1); }
1782b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1783b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected:
1784b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool DataEquals(HValue* other) OVERRIDE { return true; }
1785b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1786b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
1787b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit HConstructDouble(HValue* hi, HValue* lo) {
1788b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    set_representation(Representation::Double());
1789b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetFlag(kUseGVN);
1790b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(0, hi);
1791b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(1, lo);
1792b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1793b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1794b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool IsDeletable() const OVERRIDE { return true; }
1795b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
1796b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1797b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1798b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum RemovableSimulate {
1799b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  REMOVABLE_SIMULATE,
1800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FIXED_SIMULATE
1801b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
1802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1803b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1804b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HSimulate FINAL : public HInstruction {
1805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
1806b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HSimulate(BailoutId ast_id,
1807b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            int pop_count,
1808b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            Zone* zone,
1809b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            RemovableSimulate removable)
1810b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : ast_id_(ast_id),
1811b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        pop_count_(pop_count),
1812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        values_(2, zone),
1813b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        assigned_indexes_(2, zone),
1814b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        zone_(zone),
1815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        removable_(removable),
1816b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        done_with_replay_(false) {}
1817b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ~HSimulate() {}
1818b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1819b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual OStream& PrintDataTo(OStream& os) const OVERRIDE;  // NOLINT
1820b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1821b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool HasAstId() const { return !ast_id_.IsNone(); }
1822b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BailoutId ast_id() const { return ast_id_; }
1823b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void set_ast_id(BailoutId id) {
1824b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(!HasAstId());
1825b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ast_id_ = id;
1826b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1827b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1828b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int pop_count() const { return pop_count_; }
1829b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  const ZoneList<HValue*>* values() const { return &values_; }
1830b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int GetAssignedIndexAt(int index) const {
1831b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(HasAssignedIndexAt(index));
1832b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return assigned_indexes_[index];
1833b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1834b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool HasAssignedIndexAt(int index) const {
1835b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return assigned_indexes_[index] != kNoIndex;
1836b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1837b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void AddAssignedValue(int index, HValue* value) {
1838b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    AddValue(index, value);
1839b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1840b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void AddPushedValue(HValue* value) {
1841b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    AddValue(kNoIndex, value);
1842b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1843b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int ToOperandIndex(int environment_index) {
1844b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (int i = 0; i < assigned_indexes_.length(); ++i) {
1845b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (assigned_indexes_[i] == environment_index) return i;
1846b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1847b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return -1;
1848b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1849b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual int OperandCount() const OVERRIDE { return values_.length(); }
1850b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual HValue* OperandAt(int index) const OVERRIDE {
1851b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return values_[index];
1852b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1853e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1854b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool HasEscapingOperandAt(int index) OVERRIDE { return false; }
1855b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
1856e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
1857e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1858b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1859b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void MergeWith(ZoneList<HSimulate*>* list);
1860b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool is_candidate_for_removal() { return removable_ == REMOVABLE_SIMULATE; }
1861b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1862b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Replay effects of this instruction on the given environment.
1863b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void ReplayEnvironment(HEnvironment* env);
1864b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1865257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Simulate)
1866b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1867b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG
1868b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual void Verify() OVERRIDE;
1869b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void set_closure(Handle<JSFunction> closure) { closure_ = closure; }
1870b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<JSFunction> closure() const { return closure_; }
1871b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif
1872b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1873b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
1874b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual void InternalSetOperandAt(int index, HValue* value) OVERRIDE {
1875b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    values_[index] = value;
1876b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1877b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1878b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
1879b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  static const int kNoIndex = -1;
1880b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void AddValue(int index, HValue* value) {
1881b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    assigned_indexes_.Add(index, zone_);
1882b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // Resize the list of pushed values.
1883b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    values_.Add(NULL, zone_);
1884b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // Set the operand through the base method in HValue to make sure that the
1885b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // use lists are correctly updated.
1886b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetOperandAt(values_.length() - 1, value);
1887b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1888b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool HasValueForIndex(int index) {
1889b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (int i = 0; i < assigned_indexes_.length(); ++i) {
1890b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (assigned_indexes_[i] == index) return true;
1891b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1892b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return false;
1893b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1894b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BailoutId ast_id_;
1895b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int pop_count_;
1896b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ZoneList<HValue*> values_;
1897b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ZoneList<int> assigned_indexes_;
1898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Zone* zone_;
1899b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  RemovableSimulate removable_ : 2;
1900b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool done_with_replay_ : 1;
1901b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1902b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef DEBUG
1903b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<JSFunction> closure_;
1904b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif
1905b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1906b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1907b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1908b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HEnvironmentMarker FINAL : public HTemplateInstruction<1> {
1909b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
1910b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  enum Kind { BIND, LOOKUP };
1911b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1912b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P2(HEnvironmentMarker, Kind, int);
1913b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1914b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Kind kind() const { return kind_; }
1915b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int index() const { return index_; }
1916b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HSimulate* next_simulate() { return next_simulate_; }
1917b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void set_next_simulate(HSimulate* simulate) {
1918b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    next_simulate_ = simulate;
1919b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1920b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1921b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
1922b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return Representation::None();
1923b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1924b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1925b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual OStream& PrintDataTo(OStream& os) const OVERRIDE;  // NOLINT
1926b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1927b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef DEBUG
1928b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void set_closure(Handle<JSFunction> closure) {
1929b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(closure_.is_null());
1930b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(!closure.is_null());
1931b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    closure_ = closure;
1932b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1933b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<JSFunction> closure() const { return closure_; }
1934b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif
1935b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1936b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(EnvironmentMarker);
1937b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1938b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
1939b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HEnvironmentMarker(Kind kind, int index)
1940b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : kind_(kind), index_(index), next_simulate_(NULL) { }
1941b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1942b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Kind kind_;
1943b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int index_;
1944b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HSimulate* next_simulate_;
1945b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1946b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef DEBUG
1947b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<JSFunction> closure_;
1948b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif
1949b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
1950b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1951b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1952b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HStackCheck FINAL : public HTemplateInstruction<1> {
1953b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
19543fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  enum Type {
19553fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    kFunctionEntry,
19563fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    kBackwardsBranch
19573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  };
19583fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1959b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P1(HStackCheck, Type);
19603fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
19613fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* context() { return OperandAt(0); }
1962b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1963b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
19643fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return Representation::Tagged();
1965e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
1966e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
19673fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  void Eliminate() {
19683fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    // The stack check eliminator might try to eliminate the same stack
19693fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    // check instruction multiple times.
19703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    if (IsLinked()) {
1971b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      DeleteAndReplaceWith(NULL);
19723fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    }
19733fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
19743fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
19753fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  bool is_function_entry() { return type_ == kFunctionEntry; }
19763fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  bool is_backwards_branch() { return type_ == kBackwardsBranch; }
19773fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1978257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(StackCheck)
19793fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
19803fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch private:
1981b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HStackCheck(HValue* context, Type type) : type_(type) {
1982b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(0, context);
1983b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetChangesFlag(kNewSpacePromotion);
1984b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1985b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
19863fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  Type type_;
1987b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
1988b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1989b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1990b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum InliningKind {
1991b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  NORMAL_RETURN,          // Drop the function from the environment on return.
1992b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CONSTRUCT_CALL_RETURN,  // Either use allocated receiver or return value.
1993b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  GETTER_CALL_RETURN,     // Returning from a getter, need to restore context.
1994b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SETTER_CALL_RETURN      // Use the RHS of the assignment as the return value.
1995b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
1996b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1997b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1998b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HArgumentsObject;
1999b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HConstant;
2000b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2001b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2002b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HEnterInlined FINAL : public HTemplateInstruction<0> {
2003b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
2004b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HEnterInlined* New(Zone* zone, HValue* context, BailoutId return_id,
2005b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                            Handle<JSFunction> closure,
2006b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                            HConstant* closure_context, int arguments_count,
2007b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                            FunctionLiteral* function,
2008b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                            InliningKind inlining_kind, Variable* arguments_var,
2009b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                            HArgumentsObject* arguments_object) {
2010b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return new (zone) HEnterInlined(return_id, closure, closure_context,
2011b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                    arguments_count, function, inlining_kind,
2012b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                    arguments_var, arguments_object, zone);
2013b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2014b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2015b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void RegisterReturnTarget(HBasicBlock* return_target, Zone* zone);
2016b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ZoneList<HBasicBlock*>* return_targets() { return &return_targets_; }
2017b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2018b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual OStream& PrintDataTo(OStream& os) const OVERRIDE;  // NOLINT
2019b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2020b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<JSFunction> closure() const { return closure_; }
2021b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HConstant* closure_context() const { return closure_context_; }
20223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  int arguments_count() const { return arguments_count_; }
2023b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool arguments_pushed() const { return arguments_pushed_; }
2024b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void set_arguments_pushed() { arguments_pushed_ = true; }
2025b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  FunctionLiteral* function() const { return function_; }
2026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  InliningKind inlining_kind() const { return inlining_kind_; }
2027b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BailoutId ReturnId() const { return return_id_; }
2028b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2029b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
2030e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
2031e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
2032e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
2033b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Variable* arguments_var() { return arguments_var_; }
2034b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HArgumentsObject* arguments_object() { return arguments_object_; }
20353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2036257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(EnterInlined)
2037b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2038b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
2039b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HEnterInlined(BailoutId return_id, Handle<JSFunction> closure,
2040b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                HConstant* closure_context, int arguments_count,
2041b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                FunctionLiteral* function, InliningKind inlining_kind,
2042b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                Variable* arguments_var, HArgumentsObject* arguments_object,
2043b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                Zone* zone)
2044b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : return_id_(return_id),
2045b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        closure_(closure),
2046b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        closure_context_(closure_context),
2047b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        arguments_count_(arguments_count),
2048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        arguments_pushed_(false),
2049b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        function_(function),
2050b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        inlining_kind_(inlining_kind),
2051b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        arguments_var_(arguments_var),
2052b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        arguments_object_(arguments_object),
2053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return_targets_(2, zone) {}
2054b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2055b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BailoutId return_id_;
2056b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<JSFunction> closure_;
2057b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HConstant* closure_context_;
20583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  int arguments_count_;
2059b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool arguments_pushed_;
2060b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  FunctionLiteral* function_;
2061b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  InliningKind inlining_kind_;
2062b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Variable* arguments_var_;
2063b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HArgumentsObject* arguments_object_;
2064b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ZoneList<HBasicBlock*> return_targets_;
2065b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2066b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2067b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2068b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HLeaveInlined FINAL : public HTemplateInstruction<0> {
2069b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
2070b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HLeaveInlined(HEnterInlined* entry,
2071b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                int drop_count)
2072b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : entry_(entry),
2073b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        drop_count_(drop_count) { }
2074b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2075b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
2076e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
2077e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
2078e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
2079b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual int argument_delta() const OVERRIDE {
2080b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return entry_->arguments_pushed() ? -drop_count_ : 0;
2081b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2082b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2083257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(LeaveInlined)
2084b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2085b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
2086b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HEnterInlined* entry_;
2087b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int drop_count_;
2088b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2089b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2090b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2091b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HPushArguments FINAL : public HInstruction {
2092b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
2093b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HPushArguments* New(Zone* zone, HValue* context) {
2094b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return new(zone) HPushArguments(zone);
2095b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2096b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HPushArguments* New(Zone* zone, HValue* context, HValue* arg1) {
2097b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HPushArguments* instr = new(zone) HPushArguments(zone);
2098b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    instr->AddInput(arg1);
2099b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return instr;
2100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HPushArguments* New(Zone* zone, HValue* context, HValue* arg1,
2102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                             HValue* arg2) {
2103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HPushArguments* instr = new(zone) HPushArguments(zone);
2104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    instr->AddInput(arg1);
2105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    instr->AddInput(arg2);
2106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return instr;
2107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HPushArguments* New(Zone* zone, HValue* context, HValue* arg1,
2109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                             HValue* arg2, HValue* arg3) {
2110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HPushArguments* instr = new(zone) HPushArguments(zone);
2111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    instr->AddInput(arg1);
2112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    instr->AddInput(arg2);
2113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    instr->AddInput(arg3);
2114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return instr;
2115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HPushArguments* New(Zone* zone, HValue* context, HValue* arg1,
2117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                             HValue* arg2, HValue* arg3, HValue* arg4) {
2118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HPushArguments* instr = new(zone) HPushArguments(zone);
2119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    instr->AddInput(arg1);
2120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    instr->AddInput(arg2);
2121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    instr->AddInput(arg3);
2122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    instr->AddInput(arg4);
2123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return instr;
2124e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
2125b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
2127b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return Representation::Tagged();
2128b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2129b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual int argument_delta() const OVERRIDE { return inputs_.length(); }
2131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* argument(int i) { return OperandAt(i); }
21321e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
2133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual int OperandCount() const FINAL OVERRIDE {
2134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return inputs_.length();
21353fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
2136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual HValue* OperandAt(int i) const FINAL OVERRIDE {
2137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return inputs_[i];
21383fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
21393fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
2140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void AddInput(HValue* value);
21413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(PushArguments)
21433fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
21443fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch protected:
2145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual void InternalSetOperandAt(int i, HValue* value) FINAL OVERRIDE {
2146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[i] = value;
21473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
21483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private:
2150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit HPushArguments(Zone* zone)
2151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : HInstruction(HType::Tagged()), inputs_(4, zone) {
2152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    set_representation(Representation::Tagged());
2153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ZoneList<HValue*> inputs_;
21563fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch};
21573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
21583fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
2159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HThisFunction FINAL : public HTemplateInstruction<0> {
21601e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public:
2161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P0(HThisFunction);
21621e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
2163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
2164e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
2165e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
2166e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
2167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(ThisFunction)
21681e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
21691e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
2170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool DataEquals(HValue* other) OVERRIDE { return true; }
2171b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
2173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HThisFunction() {
21741e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    set_representation(Representation::Tagged());
21751e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetFlag(kUseGVN);
21761e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
21771e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
2178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool IsDeletable() const OVERRIDE { return true; }
21791e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block};
21801e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
21811e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
2182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HDeclareGlobals FINAL : public HUnaryOperation {
21833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
2184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P2(HDeclareGlobals,
2185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                              Handle<FixedArray>,
2186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                              int);
21873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HValue* context() { return OperandAt(0); }
21893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Handle<FixedArray> pairs() const { return pairs_; }
21903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  int flags() const { return flags_; }
21913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(DeclareGlobals)
21933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
2195e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::Tagged();
2196e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
2197e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
2198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
2199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HDeclareGlobals(HValue* context,
2200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                  Handle<FixedArray> pairs,
2201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                  int flags)
2202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : HUnaryOperation(context),
2203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        pairs_(pairs),
2204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        flags_(flags) {
2205b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
2206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetAllSideEffects();
2207e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
2208e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
2209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<FixedArray> pairs_;
2210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int flags_;
2211b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2212b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2213b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2214e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochtemplate <int V>
2215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HCall : public HTemplateInstruction<V> {
2216b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
22171e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  // The argument count includes the receiver.
2218e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  explicit HCall<V>(int argument_count) : argument_count_(argument_count) {
2219e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    this->set_representation(Representation::Tagged());
2220e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    this->SetAllSideEffects();
22211e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
2222b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual HType CalculateInferredType() FINAL OVERRIDE {
2224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return HType::Tagged();
2225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2226b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual int argument_count() const {
2228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return argument_count_;
2229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
22301e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
2231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual int argument_delta() const OVERRIDE {
2232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return -argument_count();
2233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
22341e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
22351e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block private:
22361e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  int argument_count_;
22371e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block};
22381e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
22391e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
2240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HUnaryCall : public HCall<1> {
22411e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public:
22421e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HUnaryCall(HValue* value, int argument_count)
2243e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      : HCall<1>(argument_count) {
22441e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetOperandAt(0, value);
22451e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
22461e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
2247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(
2248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      int index) FINAL OVERRIDE {
2249e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::Tagged();
2250b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
22511e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
2252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual OStream& PrintDataTo(OStream& os) const OVERRIDE;  // NOLINT
22531e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
2254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* value() const { return OperandAt(0); }
22551e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block};
22561e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
22571e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
2258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HBinaryCall : public HCall<2> {
22591e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public:
22601e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HBinaryCall(HValue* first, HValue* second, int argument_count)
2261e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      : HCall<2>(argument_count) {
22621e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetOperandAt(0, first);
22631e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetOperandAt(1, second);
2264b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2265b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual OStream& PrintDataTo(OStream& os) const OVERRIDE;  // NOLINT
2267b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(
2269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      int index) FINAL OVERRIDE {
2270e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::Tagged();
2271e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
22721e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
2273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* first() const { return OperandAt(0); }
2274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* second() const { return OperandAt(1); }
2275257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
2276257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
22771e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
2278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HCallJSFunction FINAL : public HCall<1> {
2279257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public:
2280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HCallJSFunction* New(Zone* zone,
2281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                              HValue* context,
2282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                              HValue* function,
2283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                              int argument_count,
2284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                              bool pass_argument_count);
2285b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* function() const { return OperandAt(0); }
2287b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual OStream& PrintDataTo(OStream& os) const OVERRIDE;  // NOLINT
22891e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
2290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(
2291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      int index) FINAL OVERRIDE {
2292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(index == 0);
2293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return Representation::Tagged();
2294b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2295b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool pass_argument_count() const { return pass_argument_count_; }
2297e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
2298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool HasStackCheck() FINAL OVERRIDE {
2299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return has_stack_check_;
2300e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
2301b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(CallJSFunction)
2303b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2304b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
2305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // The argument count includes the receiver.
2306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HCallJSFunction(HValue* function,
2307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                  int argument_count,
2308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                  bool pass_argument_count,
2309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                  bool has_stack_check)
2310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : HCall<1>(argument_count),
2311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        pass_argument_count_(pass_argument_count),
2312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        has_stack_check_(has_stack_check) {
2313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      SetOperandAt(0, function);
2314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool pass_argument_count_;
2317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool has_stack_check_;
2318b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2319b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2320b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HCallWithDescriptor FINAL : public HInstruction {
2322b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
2323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HCallWithDescriptor* New(Zone* zone, HValue* context, HValue* target,
2324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                  int argument_count,
2325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                  CallInterfaceDescriptor descriptor,
2326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                  const Vector<HValue*>& operands) {
2327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(operands.length() == descriptor.GetEnvironmentLength());
2328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HCallWithDescriptor* res = new (zone)
2329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        HCallWithDescriptor(target, argument_count, descriptor, operands, zone);
2330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return res;
2331b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2332b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual int OperandCount() const FINAL OVERRIDE {
2334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return values_.length();
2335b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual HValue* OperandAt(int index) const FINAL OVERRIDE {
2337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return values_[index];
23381e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
23391e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
2340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(
2341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      int index) FINAL OVERRIDE {
2342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (index == 0) {
2343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return Representation::Tagged();
2344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else {
2345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      int par_index = index - 1;
2346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      DCHECK(par_index < descriptor_.GetEnvironmentLength());
2347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return descriptor_.GetParameterRepresentation(par_index);
2348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2350b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(CallWithDescriptor)
2352b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual HType CalculateInferredType() FINAL OVERRIDE {
2354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return HType::Tagged();
2355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2356b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual int argument_count() const {
2358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return argument_count_;
2359e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
2360e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
2361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual int argument_delta() const OVERRIDE {
2362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return -argument_count_;
2363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2364b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CallInterfaceDescriptor descriptor() const { return descriptor_; }
2366b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* target() {
2368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return OperandAt(0);
23691e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
23701e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
2371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual OStream& PrintDataTo(OStream& os) const OVERRIDE;  // NOLINT
2372e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
2373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
2374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // The argument count includes the receiver.
2375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HCallWithDescriptor(HValue* target, int argument_count,
2376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                      CallInterfaceDescriptor descriptor,
2377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                      const Vector<HValue*>& operands, Zone* zone)
2378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : descriptor_(descriptor),
2379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        values_(descriptor.GetEnvironmentLength() + 1, zone) {
2380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    argument_count_ = argument_count;
2381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    AddOperand(target, zone);
2382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (int i = 0; i < operands.length(); i++) {
2383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      AddOperand(operands[i], zone);
2384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    this->set_representation(Representation::Tagged());
2386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    this->SetAllSideEffects();
2387e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
2388b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void AddOperand(HValue* v, Zone* zone) {
2390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    values_.Add(NULL, zone);
2391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(values_.length() - 1, v);
2392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void InternalSetOperandAt(int index,
2395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                            HValue* value) FINAL OVERRIDE {
2396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    values_[index] = value;
2397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CallInterfaceDescriptor descriptor_;
2400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ZoneList<HValue*> values_;
2401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int argument_count_;
2402b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2403b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2404b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HInvokeFunction FINAL : public HBinaryCall {
2406b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
2407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P2(HInvokeFunction, HValue*, int);
2408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HInvokeFunction(HValue* context,
2410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                  HValue* function,
2411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                  Handle<JSFunction> known_function,
2412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                  int argument_count)
2413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : HBinaryCall(context, function, argument_count),
2414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        known_function_(known_function) {
2415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    formal_parameter_count_ = known_function.is_null()
2416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        ? 0 : known_function->shared()->formal_parameter_count();
2417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    has_stack_check_ = !known_function.is_null() &&
2418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        (known_function->code()->kind() == Code::FUNCTION ||
2419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch         known_function->code()->kind() == Code::OPTIMIZED_FUNCTION);
24201e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
2421b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HInvokeFunction* New(Zone* zone,
2423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                              HValue* context,
2424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                              HValue* function,
2425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                              Handle<JSFunction> known_function,
2426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                              int argument_count) {
2427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return new(zone) HInvokeFunction(context, function,
2428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                     known_function, argument_count);
2429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2430b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* context() { return first(); }
2432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* function() { return second(); }
2433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<JSFunction> known_function() { return known_function_; }
2434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int formal_parameter_count() const { return formal_parameter_count_; }
2435b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool HasStackCheck() FINAL OVERRIDE {
2437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return has_stack_check_;
2438e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
2439e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
2440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(InvokeFunction)
2441b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2442b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
2443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HInvokeFunction(HValue* context, HValue* function, int argument_count)
2444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : HBinaryCall(context, function, argument_count),
2445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        has_stack_check_(false) {
2446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<JSFunction> known_function_;
2449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int formal_parameter_count_;
2450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool has_stack_check_;
2451b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2452b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2453b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HCallFunction FINAL : public HBinaryCall {
2455b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
2456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P2(HCallFunction, HValue*, int);
2457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P3(
2458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      HCallFunction, HValue*, int, CallFunctionFlags);
24591e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
2460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* context() { return first(); }
2461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* function() { return second(); }
2462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CallFunctionFlags function_flags() const { return function_flags_; }
2463b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(CallFunction)
2465e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
2466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual int argument_delta() const OVERRIDE { return -argument_count(); }
2467b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2468b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
2469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HCallFunction(HValue* context,
2470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                HValue* function,
2471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                int argument_count,
2472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                CallFunctionFlags flags = NO_CALL_FUNCTION_FLAGS)
2473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : HBinaryCall(context, function, argument_count), function_flags_(flags) {
2474b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2475b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CallFunctionFlags function_flags_;
2476b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2477b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2478b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HCallNew FINAL : public HBinaryCall {
2480b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
2481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P2(HCallNew, HValue*, int);
2482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* context() { return first(); }
2484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* constructor() { return second(); }
2485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(CallNew)
2487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
24891e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HCallNew(HValue* context, HValue* constructor, int argument_count)
2490b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : HBinaryCall(context, constructor, argument_count) {}
2491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
2492b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2494b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HCallNewArray FINAL : public HBinaryCall {
2495b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
2496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P3(HCallNewArray,
2497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                              HValue*,
2498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                              int,
2499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                              ElementsKind);
2500b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2501e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* context() { return first(); }
2502e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* constructor() { return second(); }
2503b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual OStream& PrintDataTo(OStream& os) const OVERRIDE;  // NOLINT
2505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ElementsKind elements_kind() const { return elements_kind_; }
2507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(CallNewArray)
2509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
2511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HCallNewArray(HValue* context, HValue* constructor, int argument_count,
2512b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                ElementsKind elements_kind)
2513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : HBinaryCall(context, constructor, argument_count),
2514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        elements_kind_(elements_kind) {}
2515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2516b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ElementsKind elements_kind_;
2517b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2518b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2519b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HCallRuntime FINAL : public HCall<1> {
2521b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
2522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P3(HCallRuntime,
2523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                              Handle<String>,
2524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                              const Runtime::Function*,
2525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                              int);
25263fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
2527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual OStream& PrintDataTo(OStream& os) const OVERRIDE;  // NOLINT
2528b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
25293fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* context() { return OperandAt(0); }
253044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  const Runtime::Function* function() const { return c_function_; }
2531b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<String> name() const { return name_; }
2532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SaveFPRegsMode save_doubles() const { return save_doubles_; }
2533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void set_save_doubles(SaveFPRegsMode save_doubles) {
2534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    save_doubles_ = save_doubles;
2535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2536b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
25383fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return Representation::Tagged();
2539e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
2540e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
2541257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CallRuntime)
2542b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2543b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
2544b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HCallRuntime(HValue* context,
2545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch               Handle<String> name,
2546b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch               const Runtime::Function* c_function,
2547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch               int argument_count)
2548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : HCall<1>(argument_count), c_function_(c_function), name_(name),
2549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        save_doubles_(kDontSaveFPRegs) {
2550b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(0, context);
2551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
255344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  const Runtime::Function* c_function_;
2554b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<String> name_;
2555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SaveFPRegsMode save_doubles_;
2556b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2557b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2558b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HMapEnumLength FINAL : public HUnaryOperation {
2560b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
2561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P1(HMapEnumLength, HValue*);
2562b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
2564b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return Representation::Tagged();
2565b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2566b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(MapEnumLength)
25681e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
25691e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
2570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool DataEquals(HValue* other) OVERRIDE { return true; }
25719fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block
2572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
2573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit HMapEnumLength(HValue* value)
2574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : HUnaryOperation(value, HType::Smi()) {
2575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    set_representation(Representation::Smi());
25769fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block    SetFlag(kUseGVN);
2577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetDependsOnFlag(kMaps);
25789fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block  }
25799fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block
2580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool IsDeletable() const OVERRIDE { return true; }
2581b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2582b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2583b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HUnaryMathOperation FINAL : public HTemplateInstruction<2> {
25853fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch public:
2586b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HInstruction* New(Zone* zone,
2587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           HValue* context,
2588b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           HValue* value,
2589b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           BuiltinFunctionId op);
25903fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
2591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* context() const { return OperandAt(0); }
2592b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* value() const { return OperandAt(1); }
25933fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
2594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual OStream& PrintDataTo(OStream& os) const OVERRIDE;  // NOLINT
25953fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
2596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
2597b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (index == 0) {
2598b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return Representation::Tagged();
2599b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else {
2600b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      switch (op_) {
2601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        case kMathFloor:
2602b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        case kMathRound:
2603b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        case kMathFround:
2604b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        case kMathSqrt:
2605b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        case kMathPowHalf:
2606b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        case kMathLog:
2607b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        case kMathExp:
2608b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          return Representation::Double();
2609b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        case kMathAbs:
2610b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          return representation();
2611b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        case kMathClz32:
2612b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          return Representation::Integer32();
2613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        default:
2614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          UNREACHABLE();
2615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          return Representation::None();
2616b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
2617b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2618b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
26193fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
2620b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Range* InferRange(Zone* zone) OVERRIDE;
26213fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
2622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual HValue* Canonicalize() OVERRIDE;
2623b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RepresentationFromUses() OVERRIDE;
2624b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RepresentationFromInputs() OVERRIDE;
2625b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BuiltinFunctionId op() const { return op_; }
2627b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const char* OpName() const;
2628b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2629b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(UnaryMathOperation)
26301e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
26311e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
2632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool DataEquals(HValue* other) OVERRIDE {
2633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HUnaryMathOperation* b = HUnaryMathOperation::cast(other);
2634b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return op_ == b->op();
2635b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2636b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
2638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Indicates if we support a double (and int32) output for Math.floor and
2639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Math.round.
2640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool SupportsFlexibleFloorAndRound() const {
2641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef V8_TARGET_ARCH_ARM64
2642b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return true;
2643b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#else
2644b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return false;
2645b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif
2646b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
26473fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HUnaryMathOperation(HValue* context, HValue* value, BuiltinFunctionId op)
2648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : HTemplateInstruction<2>(HType::TaggedNumber()), op_(op) {
26493fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(0, context);
26503fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(1, value);
2651b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    switch (op) {
2652b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      case kMathFloor:
2653b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      case kMathRound:
2654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        if (SupportsFlexibleFloorAndRound()) {
2655b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          SetFlag(kFlexibleRepresentation);
2656b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        } else {
2657b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          set_representation(Representation::Integer32());
2658b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        }
2659b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        break;
2660b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      case kMathClz32:
2661b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        set_representation(Representation::Integer32());
2662b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        break;
2663b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      case kMathAbs:
2664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        // Not setting representation here: it is None intentionally.
2665b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        SetFlag(kFlexibleRepresentation);
2666b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        // TODO(svenpanne) This flag is actually only needed if representation()
2667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        // is tagged, and not when it is an unboxed double or unboxed integer.
2668b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        SetChangesFlag(kNewSpacePromotion);
2669b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        break;
2670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      case kMathFround:
2671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      case kMathLog:
2672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      case kMathExp:
2673b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      case kMathSqrt:
2674b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      case kMathPowHalf:
2675b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        set_representation(Representation::Double());
2676b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        break;
2677b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      default:
2678b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        UNREACHABLE();
2679b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
2680b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kUseGVN);
2681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetFlag(kAllowUndefinedAsNaN);
2682b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2683b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool IsDeletable() const OVERRIDE { return true; }
26853fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
2686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* SimplifiedDividendForMathFloorOfDiv(HDiv* hdiv);
2687b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* SimplifiedDivisorForMathFloorOfDiv(HDiv* hdiv);
2688b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2689b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BuiltinFunctionId op_;
2690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
2691b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2692b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2693b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HLoadRoot FINAL : public HTemplateInstruction<0> {
2694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
2695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P1(HLoadRoot, Heap::RootListIndex);
2696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P2(HLoadRoot, Heap::RootListIndex, HType);
2697b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
2699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return Representation::None();
2700b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2701b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2702b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Heap::RootListIndex index() const { return index_; }
2703b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2704b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(LoadRoot)
2705b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2706b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
2707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool DataEquals(HValue* other) OVERRIDE {
2708b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HLoadRoot* b = HLoadRoot::cast(other);
2709b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return index_ == b->index_;
2710b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2711b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2712b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
2713b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit HLoadRoot(Heap::RootListIndex index, HType type = HType::Tagged())
2714b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : HTemplateInstruction<0>(type), index_(index) {
2715b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetFlag(kUseGVN);
2716b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // TODO(bmeurer): We'll need kDependsOnRoots once we add the
2717b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // corresponding HStoreRoot instruction.
2718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetDependsOnFlag(kCalls);
2719b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2720b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2721b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool IsDeletable() const OVERRIDE { return true; }
2722b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const Heap::RootListIndex index_;
2724b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2725b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2726b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2727b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HCheckMaps FINAL : public HTemplateInstruction<2> {
2728b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
2729b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HCheckMaps* New(Zone* zone, HValue* context, HValue* value,
2730b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                         Handle<Map> map, HValue* typecheck = NULL) {
2731b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return new(zone) HCheckMaps(value, new(zone) UniqueSet<Map>(
2732b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            Unique<Map>::CreateImmovable(map), zone), typecheck);
2733b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2734b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HCheckMaps* New(Zone* zone, HValue* context,
2735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                         HValue* value, SmallMapList* map_list,
2736b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                         HValue* typecheck = NULL) {
2737b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    UniqueSet<Map>* maps = new(zone) UniqueSet<Map>(map_list->length(), zone);
2738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (int i = 0; i < map_list->length(); ++i) {
2739b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      maps->Add(Unique<Map>::CreateImmovable(map_list->at(i)), zone);
2740b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2741b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return new(zone) HCheckMaps(value, maps, typecheck);
2742b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2743b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2744b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool IsStabilityCheck() const { return is_stability_check_; }
2745b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void MarkAsStabilityCheck() {
2746b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    maps_are_stable_ = true;
2747b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    has_migration_target_ = false;
2748b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    is_stability_check_ = true;
2749b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    ClearChangesFlag(kNewSpacePromotion);
2750b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    ClearDependsOnFlag(kElementsKind);
2751b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    ClearDependsOnFlag(kMaps);
2752b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2753b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2754b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool HasEscapingOperandAt(int index) OVERRIDE { return false; }
2755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
2756b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return Representation::Tagged();
2757b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2758b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual HType CalculateInferredType() OVERRIDE {
2760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (value()->type().IsHeapObject()) return value()->type();
2761b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return HType::HeapObject();
2762b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2763b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2764b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual OStream& PrintDataTo(OStream& os) const OVERRIDE;  // NOLINT
27651e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
2766b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* value() const { return OperandAt(0); }
2767b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* typecheck() const { return OperandAt(1); }
27681e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
2769b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const UniqueSet<Map>* maps() const { return maps_; }
2770b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void set_maps(const UniqueSet<Map>* maps) { maps_ = maps; }
27711e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
2772b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool maps_are_stable() const { return maps_are_stable_; }
2773b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2774b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool HasMigrationTarget() const { return has_migration_target_; }
2775b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2776b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual HValue* Canonicalize() OVERRIDE;
2777b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2778b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HCheckMaps* CreateAndInsertAfter(Zone* zone,
2779b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                          HValue* value,
2780b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                          Unique<Map> map,
2781b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                          bool map_is_stable,
2782b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                          HInstruction* instr) {
2783b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return instr->Append(new(zone) HCheckMaps(
2784b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            value, new(zone) UniqueSet<Map>(map, zone), map_is_stable));
27851e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
27861e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
2787b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HCheckMaps* CreateAndInsertBefore(Zone* zone,
2788b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                           HValue* value,
2789b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                           const UniqueSet<Map>* maps,
2790b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                           bool maps_are_stable,
2791b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                           HInstruction* instr) {
2792b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return instr->Prepend(new(zone) HCheckMaps(value, maps, maps_are_stable));
27931e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
27941e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
2795b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(CheckMaps)
27961e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
27971e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
2798b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool DataEquals(HValue* other) OVERRIDE {
2799b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return this->maps()->Equals(HCheckMaps::cast(other)->maps());
2800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2801b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual int RedefinedOperandIndex() { return 0; }
2803b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2804b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
2805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HCheckMaps(HValue* value, const UniqueSet<Map>* maps, bool maps_are_stable)
2806b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : HTemplateInstruction<2>(HType::HeapObject()), maps_(maps),
2807b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        has_migration_target_(false), is_stability_check_(false),
2808b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        maps_are_stable_(maps_are_stable) {
2809b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK_NE(0, maps->size());
281069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    SetOperandAt(0, value);
2811b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // Use the object value for the dependency.
2812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(1, value);
2813b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
2814b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kUseGVN);
2815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetDependsOnFlag(kMaps);
2816b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetDependsOnFlag(kElementsKind);
2817b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2818b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2819b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HCheckMaps(HValue* value, const UniqueSet<Map>* maps, HValue* typecheck)
2820b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : HTemplateInstruction<2>(HType::HeapObject()), maps_(maps),
2821b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        has_migration_target_(false), is_stability_check_(false),
2822b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        maps_are_stable_(true) {
2823b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK_NE(0, maps->size());
2824b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(0, value);
2825b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // Use the object value for the dependency if NULL is passed.
2826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(1, typecheck ? typecheck : value);
2827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    set_representation(Representation::Tagged());
2828b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetFlag(kUseGVN);
2829b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetDependsOnFlag(kMaps);
2830b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetDependsOnFlag(kElementsKind);
2831b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (int i = 0; i < maps->size(); ++i) {
2832b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Handle<Map> map = maps->at(i).handle();
2833b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (map->is_migration_target()) has_migration_target_ = true;
2834b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (!map->is_stable()) maps_are_stable_ = false;
2835b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2836b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (has_migration_target_) SetChangesFlag(kNewSpacePromotion);
2837b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2838b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2839b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const UniqueSet<Map>* maps_;
2840b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool has_migration_target_ : 1;
2841b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool is_stability_check_ : 1;
2842b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool maps_are_stable_ : 1;
2843b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2844b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2845b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2846b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HCheckValue FINAL : public HUnaryOperation {
2847b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
2848b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HCheckValue* New(Zone* zone, HValue* context,
2849b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                          HValue* value, Handle<JSFunction> func) {
2850b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bool in_new_space = zone->isolate()->heap()->InNewSpace(*func);
2851b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // NOTE: We create an uninitialized Unique and initialize it later.
2852b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // This is because a JSFunction can move due to GC during graph creation.
2853b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // TODO(titzer): This is a migration crutch. Replace with some kind of
2854b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // Uniqueness scope later.
2855b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Unique<JSFunction> target = Unique<JSFunction>::CreateUninitialized(func);
2856b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HCheckValue* check = new(zone) HCheckValue(value, target, in_new_space);
2857b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return check;
2858b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2859b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HCheckValue* New(Zone* zone, HValue* context,
2860b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                          HValue* value, Unique<HeapObject> target,
2861b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                          bool object_in_new_space) {
2862b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return new(zone) HCheckValue(value, target, object_in_new_space);
2863b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2864b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2865b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual void FinalizeUniqueness() OVERRIDE {
2866b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    object_ = Unique<HeapObject>(object_.handle());
2867b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2868b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2869b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
2870b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return Representation::Tagged();
2871b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2872b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual OStream& PrintDataTo(OStream& os) const OVERRIDE;  // NOLINT
2873b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2874b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual HValue* Canonicalize() OVERRIDE;
2875b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2876b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG
2877b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual void Verify() OVERRIDE;
2878b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif
2879b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2880b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Unique<HeapObject> object() const { return object_; }
2881b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool object_in_new_space() const { return object_in_new_space_; }
2882b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2883b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(CheckValue)
2884b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2885b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
2886b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool DataEquals(HValue* other) OVERRIDE {
2887b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HCheckValue* b = HCheckValue::cast(other);
2888b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return object_ == b->object_;
2889b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2890b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2891b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
2892b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HCheckValue(HValue* value, Unique<HeapObject> object,
2893b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch               bool object_in_new_space)
2894b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : HUnaryOperation(value, value->type()),
2895b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        object_(object),
2896b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        object_in_new_space_(object_in_new_space) {
2897b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    set_representation(Representation::Tagged());
2898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetFlag(kUseGVN);
2899b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2900b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2901b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Unique<HeapObject> object_;
2902b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool object_in_new_space_;
2903b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2904b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2905b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2906b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HCheckInstanceType FINAL : public HUnaryOperation {
2907b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
2908b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  enum Check {
2909b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    IS_SPEC_OBJECT,
2910b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    IS_JS_ARRAY,
2911b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    IS_STRING,
2912b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    IS_INTERNALIZED_STRING,
2913b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LAST_INTERVAL_CHECK = IS_JS_ARRAY
2914b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  };
2915b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2916b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P2(HCheckInstanceType, HValue*, Check);
29173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2918b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual OStream& PrintDataTo(OStream& os) const OVERRIDE;  // NOLINT
2919b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2920b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
2921b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return Representation::Tagged();
2922b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2923b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2924b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual HType CalculateInferredType() OVERRIDE {
2925b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    switch (check_) {
2926b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      case IS_SPEC_OBJECT: return HType::JSObject();
2927b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      case IS_JS_ARRAY: return HType::JSArray();
2928b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      case IS_STRING: return HType::String();
2929b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      case IS_INTERNALIZED_STRING: return HType::String();
2930b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2931b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    UNREACHABLE();
2932b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return HType::Tagged();
2933b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2934b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2935b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual HValue* Canonicalize() OVERRIDE;
2936b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2937257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  bool is_interval_check() const { return check_ <= LAST_INTERVAL_CHECK; }
2938257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  void GetCheckInterval(InstanceType* first, InstanceType* last);
2939257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  void GetCheckMaskAndTag(uint8_t* mask, uint8_t* tag);
2940b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2941b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Check check() const { return check_; }
2942b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2943257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CheckInstanceType)
2944b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2945b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
2946b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // TODO(ager): It could be nice to allow the ommision of instance
2947b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // type checks if we have already performed an instance type check
2948b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // with a larger range.
2949b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool DataEquals(HValue* other) OVERRIDE {
2950b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    HCheckInstanceType* b = HCheckInstanceType::cast(other);
2951257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return check_ == b->check_;
2952b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2953b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2954b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual int RedefinedOperandIndex() { return 0; }
2955b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2956b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
2957b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const char* GetCheckName() const;
29583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2959257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HCheckInstanceType(HValue* value, Check check)
2960b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : HUnaryOperation(value, HType::HeapObject()), check_(check) {
2961257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    set_representation(Representation::Tagged());
2962257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    SetFlag(kUseGVN);
2963257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
2964257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2965257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  const Check check_;
2966b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2967b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2968b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2969b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HCheckSmi FINAL : public HUnaryOperation {
2970b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
2971b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P1(HCheckSmi, HValue*);
2972b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2973b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
2974b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return Representation::Tagged();
2975b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2976b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2977b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual HValue* Canonicalize() OVERRIDE {
2978257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    HType value_type = value()->type();
2979b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (value_type.IsSmi()) {
2980257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      return NULL;
2981257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    }
2982257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return this;
2983257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
2984257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2985b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(CheckSmi)
29861e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
29871e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
2988b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool DataEquals(HValue* other) OVERRIDE { return true; }
2989b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2990b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
2991b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit HCheckSmi(HValue* value) : HUnaryOperation(value, HType::Smi()) {
2992b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    set_representation(Representation::Smi());
2993b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetFlag(kUseGVN);
2994b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2995b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
2996b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2997b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2998b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HCheckHeapObject FINAL : public HUnaryOperation {
2999b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
3000b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P1(HCheckHeapObject, HValue*);
3001b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3002b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool HasEscapingOperandAt(int index) OVERRIDE { return false; }
3003b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
3004b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return Representation::Tagged();
3005b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3006b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3007b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual HType CalculateInferredType() OVERRIDE {
3008b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (value()->type().IsHeapObject()) return value()->type();
3009b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return HType::HeapObject();
3010b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3011b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3012b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG
3013b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual void Verify() OVERRIDE;
3014b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif
3015b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3016b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual HValue* Canonicalize() OVERRIDE {
3017b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return value()->type().IsHeapObject() ? NULL : this;
3018e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
3019e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
3020b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(CheckHeapObject)
3021b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
3022b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
3023b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool DataEquals(HValue* other) OVERRIDE { return true; }
3024b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3025b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
3026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit HCheckHeapObject(HValue* value) : HUnaryOperation(value) {
3027b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
3028b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kUseGVN);
3029b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3030b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
3031b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3032b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3033b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass InductionVariableData;
3034b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
30351e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
3036b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstruct InductionVariableLimitUpdate {
3037b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  InductionVariableData* updated_variable;
3038b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* limit;
3039b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool limit_is_upper;
3040b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool limit_is_included;
3041b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3042b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  InductionVariableLimitUpdate()
3043b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : updated_variable(NULL), limit(NULL),
3044b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        limit_is_upper(false), limit_is_included(false) {}
3045b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3046b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3047b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HBoundsCheck;
3049b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HPhi;
3050b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HBitwise;
3051b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3052b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass InductionVariableData FINAL : public ZoneObject {
3054b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
3055b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  class InductionVariableCheck : public ZoneObject {
3056b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch   public:
3057b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HBoundsCheck* check() { return check_; }
3058b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    InductionVariableCheck* next() { return next_; }
3059b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bool HasUpperLimit() { return upper_limit_ >= 0; }
3060b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    int32_t upper_limit() {
3061b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      DCHECK(HasUpperLimit());
3062b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return upper_limit_;
3063b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3064b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    void set_upper_limit(int32_t upper_limit) {
3065b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      upper_limit_ = upper_limit;
3066b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3067b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3068b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bool processed() { return processed_; }
3069b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    void set_processed() { processed_ = true; }
3070b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3071b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    InductionVariableCheck(HBoundsCheck* check,
3072b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           InductionVariableCheck* next,
3073b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           int32_t upper_limit = kNoLimit)
3074b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        : check_(check), next_(next), upper_limit_(upper_limit),
3075b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          processed_(false) {}
3076b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3077b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch   private:
3078b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HBoundsCheck* check_;
3079b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    InductionVariableCheck* next_;
3080b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    int32_t upper_limit_;
3081b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bool processed_;
3082b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  };
3083b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3084b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  class ChecksRelatedToLength : public ZoneObject {
3085b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch   public:
3086b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HValue* length() { return length_; }
3087b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    ChecksRelatedToLength* next() { return next_; }
3088b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    InductionVariableCheck* checks() { return checks_; }
3089b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3090b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    void AddCheck(HBoundsCheck* check, int32_t upper_limit = kNoLimit);
3091b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    void CloseCurrentBlock();
3092b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3093b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    ChecksRelatedToLength(HValue* length, ChecksRelatedToLength* next)
3094b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : length_(length), next_(next), checks_(NULL),
3095b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        first_check_in_block_(NULL),
3096b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        added_index_(NULL),
3097b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        added_constant_(NULL),
3098b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        current_and_mask_in_block_(0),
3099b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        current_or_mask_in_block_(0) {}
3100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch   private:
3102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    void UseNewIndexInCurrentBlock(Token::Value token,
3103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                   int32_t mask,
3104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                   HValue* index_base,
3105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                   HValue* context);
3106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HBoundsCheck* first_check_in_block() { return first_check_in_block_; }
3108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HBitwise* added_index() { return added_index_; }
3109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    void set_added_index(HBitwise* index) { added_index_ = index; }
3110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HConstant* added_constant() { return added_constant_; }
3111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    void set_added_constant(HConstant* constant) { added_constant_ = constant; }
3112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    int32_t current_and_mask_in_block() { return current_and_mask_in_block_; }
3113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    int32_t current_or_mask_in_block() { return current_or_mask_in_block_; }
3114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    int32_t current_upper_limit() { return current_upper_limit_; }
3115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HValue* length_;
3117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    ChecksRelatedToLength* next_;
3118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    InductionVariableCheck* checks_;
3119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HBoundsCheck* first_check_in_block_;
3121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HBitwise* added_index_;
3122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HConstant* added_constant_;
3123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    int32_t current_and_mask_in_block_;
3124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    int32_t current_or_mask_in_block_;
3125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    int32_t current_upper_limit_;
3126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  };
3127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  struct LimitFromPredecessorBlock {
3129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    InductionVariableData* variable;
3130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Token::Value token;
3131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HValue* limit;
3132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HBasicBlock* other_target;
3133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bool LimitIsValid() { return token != Token::ILLEGAL; }
3135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bool LimitIsIncluded() {
3137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return Token::IsEqualityOp(token) ||
3138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          token == Token::GTE || token == Token::LTE;
3139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bool LimitIsUpper() {
3141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return token == Token::LTE || token == Token::LT || token == Token::NE;
3142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    LimitFromPredecessorBlock()
3145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        : variable(NULL),
3146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          token(Token::ILLEGAL),
3147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          limit(NULL),
3148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          other_target(NULL) {}
3149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  };
3150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static const int32_t kNoLimit = -1;
3152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static InductionVariableData* ExaminePhi(HPhi* phi);
3154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static void ComputeLimitFromPredecessorBlock(
3155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      HBasicBlock* block,
3156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      LimitFromPredecessorBlock* result);
3157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static bool ComputeInductionVariableLimit(
3158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      HBasicBlock* block,
3159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      InductionVariableLimitUpdate* additional_limit);
3160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  struct BitwiseDecompositionResult {
3162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HValue* base;
3163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    int32_t and_mask;
3164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    int32_t or_mask;
3165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HValue* context;
3166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    BitwiseDecompositionResult()
3168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        : base(NULL), and_mask(0), or_mask(0), context(NULL) {}
3169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  };
3170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static void DecomposeBitwise(HValue* value,
3171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                               BitwiseDecompositionResult* result);
3172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void AddCheck(HBoundsCheck* check, int32_t upper_limit = kNoLimit);
3174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool CheckIfBranchIsLoopGuard(Token::Value token,
3176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                HBasicBlock* current_branch,
3177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                HBasicBlock* other_branch);
3178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void UpdateAdditionalLimit(InductionVariableLimitUpdate* update);
3180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HPhi* phi() { return phi_; }
3182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* base() { return base_; }
3183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t increment() { return increment_; }
3184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* limit() { return limit_; }
3185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool limit_included() { return limit_included_; }
3186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HBasicBlock* limit_validity() { return limit_validity_; }
3187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HBasicBlock* induction_exit_block() { return induction_exit_block_; }
3188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HBasicBlock* induction_exit_target() { return induction_exit_target_; }
3189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ChecksRelatedToLength* checks() { return checks_; }
3190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* additional_upper_limit() { return additional_upper_limit_; }
3191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool additional_upper_limit_is_included() {
3192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return additional_upper_limit_is_included_;
3193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* additional_lower_limit() { return additional_lower_limit_; }
3195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool additional_lower_limit_is_included() {
3196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return additional_lower_limit_is_included_;
3197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool LowerLimitIsNonNegativeConstant() {
3200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (base()->IsInteger32Constant() && base()->GetInteger32Constant() >= 0) {
3201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return true;
3202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (additional_lower_limit() != NULL &&
3204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        additional_lower_limit()->IsInteger32Constant() &&
3205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        additional_lower_limit()->GetInteger32Constant() >= 0) {
3206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      // Ignoring the corner case of !additional_lower_limit_is_included()
3207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      // is safe, handling it adds unneeded complexity.
3208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return true;
3209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return false;
3211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t ComputeUpperLimit(int32_t and_mask, int32_t or_mask);
3214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
3216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  template <class T> void swap(T* a, T* b) {
3217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    T c(*a);
3218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    *a = *b;
3219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    *b = c;
3220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  InductionVariableData(HPhi* phi, HValue* base, int32_t increment)
3223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : phi_(phi), base_(IgnoreOsrValue(base)), increment_(increment),
3224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        limit_(NULL), limit_included_(false), limit_validity_(NULL),
3225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        induction_exit_block_(NULL), induction_exit_target_(NULL),
3226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        checks_(NULL),
3227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        additional_upper_limit_(NULL),
3228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        additional_upper_limit_is_included_(false),
3229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        additional_lower_limit_(NULL),
3230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        additional_lower_limit_is_included_(false) {}
3231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static int32_t ComputeIncrement(HPhi* phi, HValue* phi_operand);
3233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HValue* IgnoreOsrValue(HValue* v);
3235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static InductionVariableData* GetInductionVariableData(HValue* v);
3236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HPhi* phi_;
3238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* base_;
3239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t increment_;
3240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* limit_;
3241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool limit_included_;
3242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HBasicBlock* limit_validity_;
3243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HBasicBlock* induction_exit_block_;
3244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HBasicBlock* induction_exit_target_;
3245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ChecksRelatedToLength* checks_;
3246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* additional_upper_limit_;
3247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool additional_upper_limit_is_included_;
3248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* additional_lower_limit_;
3249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool additional_lower_limit_is_included_;
3250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
3251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HPhi FINAL : public HValue {
3254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
3255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HPhi(int merged_index, Zone* zone)
3256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : inputs_(2, zone),
3257b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        merged_index_(merged_index),
325844f0eee88ff00398ff7f715fab053374d808c90dSteve Block        phi_id_(-1),
3259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        induction_variable_data_(NULL) {
3260b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    for (int i = 0; i < Representation::kNumRepresentations; i++) {
3261b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      non_phi_uses_[i] = 0;
3262b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      indirect_uses_[i] = 0;
3263b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
3264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(merged_index >= 0 || merged_index == kInvalidMergedIndex);
3265b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kFlexibleRepresentation);
3266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetFlag(kAllowUndefinedAsNaN);
3267b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3268b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RepresentationFromInputs() OVERRIDE;
3270b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Range* InferRange(Zone* zone) OVERRIDE;
3272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual void InferRepresentation(
3273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      HInferRepresentationPhase* h_infer) OVERRIDE;
3274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
3275b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return representation();
3276b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation KnownOptimalRepresentation() OVERRIDE {
3278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return representation();
3279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual HType CalculateInferredType() OVERRIDE;
3281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual int OperandCount() const OVERRIDE { return inputs_.length(); }
3282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual HValue* OperandAt(int index) const OVERRIDE {
3283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return inputs_[index];
3284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3285e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* GetRedundantReplacement();
3286b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void AddInput(HValue* value);
328744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  bool HasRealUses();
3288b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool IsReceiver() const { return merged_index_ == 0; }
3290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool HasMergedIndex() const { return merged_index_ != kInvalidMergedIndex; }
3291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual HSourcePosition position() const OVERRIDE;
3293b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3294b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int merged_index() const { return merged_index_; }
3295b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  InductionVariableData* induction_variable_data() {
3297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return induction_variable_data_;
3298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool IsInductionVariable() {
3300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return induction_variable_data_ != NULL;
3301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool IsLimitedInductionVariable() {
3303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return IsInductionVariable() &&
3304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        induction_variable_data_->limit() != NULL;
3305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void DetectInductionVariable() {
3307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(induction_variable_data_ == NULL);
3308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    induction_variable_data_ = InductionVariableData::ExaminePhi(this);
3309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual OStream& PrintTo(OStream& os) const OVERRIDE;  // NOLINT
3312b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3313b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG
3314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual void Verify() OVERRIDE;
3315b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif
3316b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3317b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void InitRealUses(int id);
3318b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void AddNonPhiUsesFrom(HPhi* other);
3319b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  void AddIndirectUsesTo(int* use_count);
3320b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3321b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int tagged_non_phi_uses() const {
3322b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return non_phi_uses_[Representation::kTagged];
3323b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int smi_non_phi_uses() const {
3325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return non_phi_uses_[Representation::kSmi];
3326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3327b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int int32_non_phi_uses() const {
3328b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return non_phi_uses_[Representation::kInteger32];
3329b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3330b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int double_non_phi_uses() const {
3331b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return non_phi_uses_[Representation::kDouble];
3332b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3333b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int tagged_indirect_uses() const {
3334b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return indirect_uses_[Representation::kTagged];
3335b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int smi_indirect_uses() const {
3337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return indirect_uses_[Representation::kSmi];
3338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3339b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int int32_indirect_uses() const {
3340b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return indirect_uses_[Representation::kInteger32];
3341b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3342b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int double_indirect_uses() const {
3343b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return indirect_uses_[Representation::kDouble];
3344b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3345b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int phi_id() { return phi_id_; }
3346b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3347257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  static HPhi* cast(HValue* value) {
3348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(value->IsPhi());
3349257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return reinterpret_cast<HPhi*>(value);
3350257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
3351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Opcode opcode() const OVERRIDE { return HValue::kPhi; }
3352257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
3353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void SimplifyConstantInputs();
3354257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
3355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Marker value representing an invalid merge index.
3356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static const int kInvalidMergedIndex = -1;
3357589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
3358b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
3359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual void DeleteFromGraph() OVERRIDE;
3360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual void InternalSetOperandAt(int index, HValue* value) OVERRIDE {
3361b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    inputs_[index] = value;
3362b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3363b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3364b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
3365b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ZoneList<HValue*> inputs_;
3366b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int merged_index_;
3367b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3368b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int non_phi_uses_[Representation::kNumRepresentations];
3369b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int indirect_uses_[Representation::kNumRepresentations];
3370b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int phi_id_;
3371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  InductionVariableData* induction_variable_data_;
3372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // TODO(titzer): we can't eliminate the receiver for generating backtraces
3374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool IsDeletable() const OVERRIDE { return !IsReceiver(); }
3375b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3376b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3377b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Common base class for HArgumentsObject and HCapturedObject.
3379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HDematerializedObject : public HInstruction {
3380b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
3381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HDematerializedObject(int count, Zone* zone) : values_(count, zone) {}
3382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual int OperandCount() const FINAL OVERRIDE {
3384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return values_.length();
3385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual HValue* OperandAt(int index) const FINAL OVERRIDE {
3387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return values_[index];
3388b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3389b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool HasEscapingOperandAt(int index) FINAL OVERRIDE {
3391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return false;
3392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(
3394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      int index) FINAL OVERRIDE {
3395e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
3396e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
3397e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
3398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected:
3399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual void InternalSetOperandAt(int index,
3400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                    HValue* value) FINAL OVERRIDE {
3401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    values_[index] = value;
3402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // List of values tracked by this marker.
3405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ZoneList<HValue*> values_;
3406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
3407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HArgumentsObject FINAL : public HDematerializedObject {
3410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
3411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HArgumentsObject* New(Zone* zone, HValue* context, int count) {
3412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return new(zone) HArgumentsObject(count, zone);
3413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // The values contain a list of all elements in the arguments object
3416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // including the receiver object, which is skipped when materializing.
3417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const ZoneList<HValue*>* arguments_values() const { return &values_; }
3418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int arguments_count() const { return values_.length(); }
3419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void AddArgument(HValue* argument, Zone* zone) {
3421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    values_.Add(NULL, zone);  // Resize list.
3422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(values_.length() - 1, argument);
3423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3425257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(ArgumentsObject)
3426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
3428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HArgumentsObject(int count, Zone* zone)
3429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : HDematerializedObject(count, zone) {
3430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    set_representation(Representation::Tagged());
3431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetFlag(kIsArguments);
3432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3433b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3434b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3435b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HCapturedObject FINAL : public HDematerializedObject {
3437b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
3438b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HCapturedObject(int length, int id, Zone* zone)
3439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : HDematerializedObject(length, zone), capture_id_(id) {
3440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    set_representation(Representation::Tagged());
3441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    values_.AddBlock(NULL, length, zone);  // Resize list.
3442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3443b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // The values contain a list of all in-object properties inside the
3445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // captured object and is index by field index. Properties in the
3446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // properties or elements backing store are not tracked here.
3447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const ZoneList<HValue*>* values() const { return &values_; }
3448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int length() const { return values_.length(); }
3449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int capture_id() const { return capture_id_; }
3450b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Shortcut for the map value of this captured object.
3452b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* map_value() const { return values()->first(); }
34539fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block
3454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void ReuseSideEffectsFromStore(HInstruction* store) {
3455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(store->HasObservableSideEffects());
3456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(store->IsStoreNamedField());
3457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    changes_flags_.Add(store->ChangesFlags());
34583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
34593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Replay effects of this instruction on the given environment.
3461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void ReplayEnvironment(HEnvironment* env);
3462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual OStream& PrintDataTo(OStream& os) const OVERRIDE;  // NOLINT
3464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(CapturedObject)
3466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
3468b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int capture_id_;
3469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Note that we cannot DCE captured objects as they are used to replay
3471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // the environment. This method is here as an explicit reminder.
3472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // TODO(mstarzinger): Turn HSimulates into full snapshots maybe?
3473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool IsDeletable() const FINAL OVERRIDE { return false; }
3474b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
3475b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3476b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HConstant FINAL : public HTemplateInstruction<0> {
3478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
3479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P1(HConstant, int32_t);
3480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P2(HConstant, int32_t, Representation);
3481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P1(HConstant, double);
3482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P1(HConstant, Handle<Object>);
3483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P1(HConstant, ExternalReference);
3484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HConstant* CreateAndInsertAfter(Zone* zone,
3486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                         HValue* context,
3487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                         int32_t value,
3488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                         Representation representation,
3489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                         HInstruction* instruction) {
3490b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return instruction->Append(HConstant::New(
3491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        zone, context, value, representation));
3492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3494b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Handle<Map> GetMonomorphicJSObjectMap() OVERRIDE {
3495b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<Object> object = object_.handle();
3496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (!object.is_null() && object->IsHeapObject()) {
3497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return v8::internal::handle(HeapObject::cast(*object)->map());
3498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return Handle<Map>();
3500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HConstant* CreateAndInsertBefore(Zone* zone,
3503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                          HValue* context,
3504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                          int32_t value,
3505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                          Representation representation,
3506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                          HInstruction* instruction) {
3507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return instruction->Prepend(HConstant::New(
3508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        zone, context, value, representation));
3509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HConstant* CreateAndInsertBefore(Zone* zone,
3512b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                          Unique<Map> map,
3513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                          bool map_is_stable,
3514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                          HInstruction* instruction) {
3515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return instruction->Prepend(new(zone) HConstant(
3516b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        map, Unique<Map>(Handle<Map>::null()), map_is_stable,
3517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        Representation::Tagged(), HType::HeapObject(), true,
3518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        false, false, MAP_TYPE));
3519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HConstant* CreateAndInsertAfter(Zone* zone,
3522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                         Unique<Map> map,
3523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                         bool map_is_stable,
3524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                         HInstruction* instruction) {
3525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return instruction->Append(new(zone) HConstant(
3526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            map, Unique<Map>(Handle<Map>::null()), map_is_stable,
3527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            Representation::Tagged(), HType::HeapObject(), true,
3528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            false, false, MAP_TYPE));
3529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Object> handle(Isolate* isolate) {
3532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (object_.handle().is_null()) {
3533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      // Default arguments to is_not_in_new_space depend on this heap number
3534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      // to be tenured so that it's guaranteed not to be located in new space.
3535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      object_ = Unique<Object>::CreateUninitialized(
3536b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          isolate->factory()->NewNumber(double_value_, TENURED));
3537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    AllowDeferredHandleDereference smi_check;
3539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(has_int32_value_ || !object_.handle()->IsSmi());
3540b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return object_.handle();
3541b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3543b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool IsSpecialDouble() const {
3544b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return has_double_value_ &&
3545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch           (bit_cast<int64_t>(double_value_) == bit_cast<int64_t>(-0.0) ||
3546b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            FixedDoubleArray::is_the_hole_nan(double_value_) ||
3547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            std::isnan(double_value_));
3548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3550b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool NotInNewSpace() const {
3551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return is_not_in_new_space_;
3552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3553b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3554b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool ImmortalImmovable() const;
3555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool IsCell() const {
3557b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return instance_type_ == CELL_TYPE || instance_type_ == PROPERTY_CELL_TYPE;
3558b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool IsMap() const {
3561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return instance_type_ == MAP_TYPE;
3562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
3565e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
3566e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
3567e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
3568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation KnownOptimalRepresentation() OVERRIDE {
3569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (HasSmiValue() && SmiValuesAre31Bits()) return Representation::Smi();
3570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (HasInteger32Value()) return Representation::Integer32();
3571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (HasNumberValue()) return Representation::Double();
3572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (HasExternalReferenceValue()) return Representation::External();
3573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return Representation::Tagged();
3574257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
3575257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
3576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool EmitAtUses() OVERRIDE;
3577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual OStream& PrintDataTo(OStream& os) const OVERRIDE;  // NOLINT
3578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HConstant* CopyToRepresentation(Representation r, Zone* zone) const;
3579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Maybe<HConstant*> CopyToTruncatedInt32(Zone* zone);
3580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Maybe<HConstant*> CopyToTruncatedNumber(Zone* zone);
3581b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool HasInteger32Value() const { return has_int32_value_; }
3582b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int32_t Integer32Value() const {
3583b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(HasInteger32Value());
3584b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return int32_value_;
3585b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3586b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool HasSmiValue() const { return has_smi_value_; }
3587b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool HasDoubleValue() const { return has_double_value_; }
3588b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  double DoubleValue() const {
3589b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(HasDoubleValue());
3590b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return double_value_;
3591b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3592b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool IsTheHole() const {
3593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (HasDoubleValue() && FixedDoubleArray::is_the_hole_nan(double_value_)) {
3594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return true;
3595b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return object_.IsInitialized() &&
3597b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch           object_.IsKnownGlobal(isolate()->heap()->the_hole_value());
3598b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3599b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool HasNumberValue() const { return has_double_value_; }
36003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  int32_t NumberValueAsInteger32() const {
3601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(HasNumberValue());
3602b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // Irrespective of whether a numeric HConstant can be safely
3603b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // represented as an int32, we store the (in some cases lossy)
3604b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // representation of the number in int32_value_.
3605b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return int32_value_;
3606b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3607b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool HasStringValue() const {
3608b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (has_double_value_ || has_int32_value_) return false;
3609b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(!object_.handle().is_null());
3610b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return instance_type_ < FIRST_NONSTRING_TYPE;
3611b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3612b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<String> StringValue() const {
3613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(HasStringValue());
3614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return Handle<String>::cast(object_.handle());
3615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3616b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool HasInternalizedStringValue() const {
3617b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return HasStringValue() && StringShape(instance_type_).IsInternalized();
3618b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3619b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3620b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool HasExternalReferenceValue() const {
3621b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return has_external_reference_value_;
3622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3623b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ExternalReference ExternalReferenceValue() const {
3624b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return external_reference_value_;
3625b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3627b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool HasBooleanValue() const { return type_.IsBoolean(); }
3628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool BooleanValue() const { return boolean_value_; }
3629b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool IsUndetectable() const { return is_undetectable_; }
3630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  InstanceType GetInstanceType() const { return instance_type_; }
3631b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool HasMapValue() const { return instance_type_ == MAP_TYPE; }
3633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Unique<Map> MapValue() const {
3634b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(HasMapValue());
3635b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return Unique<Map>::cast(GetUnique());
3636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool HasStableMapValue() const {
3638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(HasMapValue() || !has_stable_map_value_);
3639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return has_stable_map_value_;
3640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3642b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool HasObjectMap() const { return !object_map_.IsNull(); }
3643b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Unique<Map> ObjectMap() const {
3644b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(HasObjectMap());
3645b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return object_map_;
3646b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3647b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual intptr_t Hashcode() OVERRIDE {
3649b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (has_int32_value_) {
3650b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return static_cast<intptr_t>(int32_value_);
3651b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else if (has_double_value_) {
3652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return static_cast<intptr_t>(bit_cast<int64_t>(double_value_));
3653b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else if (has_external_reference_value_) {
3654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return reinterpret_cast<intptr_t>(external_reference_value_.address());
3655b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else {
3656b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      DCHECK(!object_.handle().is_null());
3657b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return object_.Hashcode();
3658b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
36593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
3660b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3661b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual void FinalizeUniqueness() OVERRIDE {
3662b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (!has_double_value_ && !has_external_reference_value_) {
3663b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      DCHECK(!object_.handle().is_null());
3664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      object_ = Unique<Object>(object_.handle());
3665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3666b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3668b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Unique<Object> GetUnique() const {
3669b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return object_;
3670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
36718b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
3672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool EqualsUnique(Unique<Object> other) const {
3673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return object_.IsInitialized() && object_ == other;
3674b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3675b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3676b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool DataEquals(HValue* other) OVERRIDE {
3677b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HConstant* other_constant = HConstant::cast(other);
3678b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (has_int32_value_) {
3679b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return other_constant->has_int32_value_ &&
3680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          int32_value_ == other_constant->int32_value_;
3681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else if (has_double_value_) {
3682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return other_constant->has_double_value_ &&
3683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch             bit_cast<int64_t>(double_value_) ==
3684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                 bit_cast<int64_t>(other_constant->double_value_);
3685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else if (has_external_reference_value_) {
3686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return other_constant->has_external_reference_value_ &&
3687b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          external_reference_value_ ==
3688b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          other_constant->external_reference_value_;
3689b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else {
3690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (other_constant->has_int32_value_ ||
3691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          other_constant->has_double_value_ ||
3692b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          other_constant->has_external_reference_value_) {
3693b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return false;
3694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
3695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      DCHECK(!object_.handle().is_null());
3696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return other_constant->object_ == object_;
3697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3698b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3699b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3700b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG
3701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual void Verify() OVERRIDE { }
3702b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif
3703b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3704257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Constant)
3705b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3706b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
3707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Range* InferRange(Zone* zone) OVERRIDE;
3708b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3709b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
3710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  friend class HGraph;
3711b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit HConstant(Handle<Object> handle,
3712b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                     Representation r = Representation::None());
3713b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HConstant(int32_t value,
3714b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            Representation r = Representation::None(),
3715b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            bool is_not_in_new_space = true,
3716b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            Unique<Object> optional = Unique<Object>(Handle<Object>::null()));
3717b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HConstant(double value,
3718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            Representation r = Representation::None(),
3719b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            bool is_not_in_new_space = true,
3720b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            Unique<Object> optional = Unique<Object>(Handle<Object>::null()));
3721b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HConstant(Unique<Object> object,
3722b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            Unique<Map> object_map,
3723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            bool has_stable_map_value,
3724b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            Representation r,
3725b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            HType type,
3726b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            bool is_not_in_new_space,
3727b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            bool boolean_value,
3728b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            bool is_undetectable,
3729b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            InstanceType instance_type);
3730b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3731b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit HConstant(ExternalReference reference);
3732b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3733b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void Initialize(Representation r);
3734b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool IsDeletable() const OVERRIDE { return true; }
3736b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3737b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // If this is a numerical constant, object_ either points to the
3738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // HeapObject the constant originated from or is null.  If the
3739b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // constant is non-numeric, object_ always points to a valid
3740b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // constant HeapObject.
3741b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Unique<Object> object_;
3742b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3743b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // If object_ is a heap object, this points to the stable map of the object.
3744b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Unique<Map> object_map_;
3745b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3746b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // If object_ is a map, this indicates whether the map is stable.
3747b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool has_stable_map_value_ : 1;
3748b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3749b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // We store the HConstant in the most specific form safely possible.
3750b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // The two flags, has_int32_value_ and has_double_value_ tell us if
3751b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // int32_value_ and double_value_ hold valid, safe representations
3752b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // of the constant.  has_int32_value_ implies has_double_value_ but
3753b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // not the converse.
3754b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool has_smi_value_ : 1;
3755257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  bool has_int32_value_ : 1;
3756257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  bool has_double_value_ : 1;
3757b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool has_external_reference_value_ : 1;
3758b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool is_not_in_new_space_ : 1;
3759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool boolean_value_ : 1;
3760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool is_undetectable_: 1;
3761b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int32_t int32_value_;
3762b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  double double_value_;
3763b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ExternalReference external_reference_value_;
3764b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3765b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static const InstanceType kUnknownInstanceType = FILLER_TYPE;
3766b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  InstanceType instance_type_;
3767b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3768b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3769b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3770b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HBinaryOperation : public HTemplateInstruction<3> {
3771b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
3772b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HBinaryOperation(HValue* context, HValue* left, HValue* right,
3773b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                   HType type = HType::Tagged())
3774b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : HTemplateInstruction<3>(type),
3775b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        observed_output_representation_(Representation::None()) {
3776b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(left != NULL && right != NULL);
37773fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(0, context);
37783fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(1, left);
37793fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(2, right);
3780b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    observed_input_representation_[0] = Representation::None();
3781b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    observed_input_representation_[1] = Representation::None();
3782b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3783b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3784b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* context() const { return OperandAt(0); }
3785b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* left() const { return OperandAt(1); }
3786b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* right() const { return OperandAt(2); }
3787b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3788b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // True if switching left and right operands likely generates better code.
3789b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool AreOperandsBetterSwitched() {
3790b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (!IsCommutative()) return false;
3791b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3792b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // Constant operands are better off on the right, they can be inlined in
3793b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // many situations on most platforms.
3794b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (left()->IsConstant()) return true;
3795b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (right()->IsConstant()) return false;
3796b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3797b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // Otherwise, if there is only one use of the right operand, it would be
3798b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // better off on the left for platforms that only have 2-arg arithmetic
3799b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // ops (e.g ia32, x64) that clobber the left operand.
3800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return right()->HasOneUse();
3801b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3803b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* BetterLeftOperand() {
3804b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return AreOperandsBetterSwitched() ? right() : left();
3805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3806b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3807b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* BetterRightOperand() {
3808b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return AreOperandsBetterSwitched() ? left() : right();
3809b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3810b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3811b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void set_observed_input_representation(int index, Representation rep) {
3812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(index >= 1 && index <= 2);
3813b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    observed_input_representation_[index - 1] = rep;
3814b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3816b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual void initialize_output_representation(Representation observed) {
3817b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    observed_output_representation_ = observed;
3818b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3819b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3820b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation observed_input_representation(int index) OVERRIDE {
3821b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (index == 0) return Representation::Tagged();
3822b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return observed_input_representation_[index - 1];
3823b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3824b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3825b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual void UpdateRepresentation(Representation new_rep,
3826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                    HInferRepresentationPhase* h_infer,
3827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                    const char* reason) OVERRIDE {
3828b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Representation rep = !FLAG_smi_binop && new_rep.IsSmi()
3829b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        ? Representation::Integer32() : new_rep;
3830b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HValue::UpdateRepresentation(rep, h_infer, reason);
3831b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3832b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3833b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual void InferRepresentation(
3834b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      HInferRepresentationPhase* h_infer) OVERRIDE;
3835b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RepresentationFromInputs() OVERRIDE;
3836b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Representation RepresentationFromOutput();
3837b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual void AssumeRepresentation(Representation r) OVERRIDE;
3838b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3839b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  virtual bool IsCommutative() const { return false; }
3840b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3841b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual OStream& PrintDataTo(OStream& os) const OVERRIDE;  // NOLINT
3842b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3843b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
3844b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (index == 0) return Representation::Tagged();
3845b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return representation();
3846b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3847b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3848b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void SetOperandPositions(Zone* zone,
3849b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           HSourcePosition left_pos,
3850b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           HSourcePosition right_pos) {
3851b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    set_operand_position(zone, 1, left_pos);
3852b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    set_operand_position(zone, 2, right_pos);
3853b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3854b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3855b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool RightIsPowerOf2() {
3856b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (!right()->IsInteger32Constant()) return false;
3857b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    int32_t value = right()->GetInteger32Constant();
3858b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (value < 0) {
3859b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return base::bits::IsPowerOfTwo32(static_cast<uint32_t>(-value));
3860b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3861b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return base::bits::IsPowerOfTwo32(static_cast<uint32_t>(value));
3862b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3863b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3864b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_ABSTRACT_INSTRUCTION(BinaryOperation)
3865b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3866b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
3867b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool IgnoreObservedOutputRepresentation(Representation current_rep);
3868b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3869b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Representation observed_input_representation_[2];
3870b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Representation observed_output_representation_;
3871b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3872b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3873b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3874b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HWrapReceiver FINAL : public HTemplateInstruction<2> {
38753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
3876b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P2(HWrapReceiver, HValue*, HValue*);
38773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3878b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool DataEquals(HValue* other) OVERRIDE { return true; }
3879b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3880b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
38813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return Representation::Tagged();
38823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
38833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3884b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* receiver() const { return OperandAt(0); }
3885b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* function() const { return OperandAt(1); }
3886b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3887b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual HValue* Canonicalize() OVERRIDE;
38883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3889b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual OStream& PrintDataTo(OStream& os) const OVERRIDE;  // NOLINT
3890b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool known_function() const { return known_function_; }
38913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
38923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(WrapReceiver)
3893b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3894b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
3895b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HWrapReceiver(HValue* receiver, HValue* function) {
3896b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    known_function_ = function->IsConstant() &&
3897b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        HConstant::cast(function)->handle(function->isolate())->IsJSFunction();
3898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    set_representation(Representation::Tagged());
3899b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(0, receiver);
3900b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(1, function);
3901b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetFlag(kUseGVN);
3902b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3903b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3904b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool known_function_;
39053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
39063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
39073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3908b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HApplyArguments FINAL : public HTemplateInstruction<4> {
3909b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
3910b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P4(HApplyArguments, HValue*, HValue*, HValue*,
3911b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                 HValue*);
3912b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3913b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
3914b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // The length is untagged, all other inputs are tagged.
3915b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return (index == 2)
3916b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        ? Representation::Integer32()
3917b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        : Representation::Tagged();
3918b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3919b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3920e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* function() { return OperandAt(0); }
3921e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* receiver() { return OperandAt(1); }
3922e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* length() { return OperandAt(2); }
3923e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* elements() { return OperandAt(3); }
3924b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3925257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(ApplyArguments)
3926b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3927b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
3928b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HApplyArguments(HValue* function,
3929b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                  HValue* receiver,
3930b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                  HValue* length,
3931b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                  HValue* elements) {
3932b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
3933b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(0, function);
3934b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(1, receiver);
3935b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(2, length);
3936b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(3, elements);
3937b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetAllSideEffects();
3938b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3939b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
3940b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3941b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3942b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HArgumentsElements FINAL : public HTemplateInstruction<0> {
3943b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
3944b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P1(HArgumentsElements, bool);
3945b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3946257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(ArgumentsElements)
39471e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
3948b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
3949e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
3950e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
3951e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
3952b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool from_inlined() const { return from_inlined_; }
3953b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
39541e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
3955b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool DataEquals(HValue* other) OVERRIDE { return true; }
3956b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3957b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
3958b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit HArgumentsElements(bool from_inlined) : from_inlined_(from_inlined) {
3959b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // The value produced by this instruction is a pointer into the stack
3960b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // that looks as if it was a smi because of alignment.
3961b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    set_representation(Representation::Tagged());
3962b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetFlag(kUseGVN);
3963b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3964b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3965b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool IsDeletable() const OVERRIDE { return true; }
3966b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3967b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool from_inlined_;
3968b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3969b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3970b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3971b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HArgumentsLength FINAL : public HUnaryOperation {
3972b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
3973b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P1(HArgumentsLength, HValue*);
3974b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3975b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
3976e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::Tagged();
3977e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
3978e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
3979257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(ArgumentsLength)
39801e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
39811e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
3982b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool DataEquals(HValue* other) OVERRIDE { return true; }
3983b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3984b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
3985b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit HArgumentsLength(HValue* value) : HUnaryOperation(value) {
3986b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    set_representation(Representation::Integer32());
3987b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetFlag(kUseGVN);
3988b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3989b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3990b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool IsDeletable() const OVERRIDE { return true; }
3991b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
3992b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3993b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3994b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HAccessArgumentsAt FINAL : public HTemplateInstruction<3> {
3995b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
3996b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P3(HAccessArgumentsAt, HValue*, HValue*, HValue*);
3997b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3998b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual OStream& PrintDataTo(OStream& os) const OVERRIDE;  // NOLINT
3999b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4000b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
4001b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // The arguments elements is considered tagged.
4002b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return index == 0
4003b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        ? Representation::Tagged()
4004b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        : Representation::Integer32();
4005b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
4006b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4007b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* arguments() const { return OperandAt(0); }
4008b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* length() const { return OperandAt(1); }
4009b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* index() const { return OperandAt(2); }
4010b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4011257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(AccessArgumentsAt)
4012b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4013b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
4014b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HAccessArgumentsAt(HValue* arguments, HValue* length, HValue* index) {
4015b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    set_representation(Representation::Tagged());
4016b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetFlag(kUseGVN);
4017b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(0, arguments);
4018b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(1, length);
4019b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(2, index);
4020b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
4021b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4022b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool DataEquals(HValue* other) OVERRIDE { return true; }
4023b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
4024b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4025b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HBoundsCheckBaseIndexInformation;
4027b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4028b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4029b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HBoundsCheck FINAL : public HTemplateInstruction<2> {
4030b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
4031b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P2(HBoundsCheck, HValue*, HValue*);
4032b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4033b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool skip_check() const { return skip_check_; }
4034b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void set_skip_check() { skip_check_ = true; }
4035b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4036b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* base() const { return base_; }
4037b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int offset() const { return offset_; }
4038b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int scale() const { return scale_; }
4039b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4040b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void ApplyIndexChange();
4041b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool DetectCompoundIndex() {
4042b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(base() == NULL);
4043b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4044b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DecompositionResult decomposition;
4045b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (index()->TryDecompose(&decomposition)) {
4046b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      base_ = decomposition.base();
4047b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      offset_ = decomposition.offset();
4048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      scale_ = decomposition.scale();
4049b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return true;
4050b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else {
4051b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      base_ = index();
4052b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      offset_ = 0;
4053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      scale_ = 0;
4054b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return false;
4055b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
4056b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
4057b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4058b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
4059b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return representation();
4060b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
4061b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4062b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual OStream& PrintDataTo(OStream& os) const OVERRIDE;  // NOLINT
4063b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual void InferRepresentation(
4064b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      HInferRepresentationPhase* h_infer) OVERRIDE;
4065b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4066b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* index() const { return OperandAt(0); }
4067b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* length() const { return OperandAt(1); }
4068b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool allow_equality() const { return allow_equality_; }
4069b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void set_allow_equality(bool v) { allow_equality_ = v; }
4070b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4071b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual int RedefinedOperandIndex() OVERRIDE { return 0; }
4072b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool IsPurelyInformativeDefinition() OVERRIDE {
4073b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return skip_check();
4074b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
4075b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4076b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(BoundsCheck)
4077b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4078b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected:
4079b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  friend class HBoundsCheckBaseIndexInformation;
4080b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4081b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Range* InferRange(Zone* zone) OVERRIDE;
4082b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4083b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool DataEquals(HValue* other) OVERRIDE { return true; }
4084b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool skip_check_;
4085b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* base_;
4086b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int offset_;
4087b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int scale_;
4088b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool allow_equality_;
4089b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4090b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
4091b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Normally HBoundsCheck should be created using the
4092b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // HGraphBuilder::AddBoundsCheck() helper.
4093b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // However when building stubs, where we know that the arguments are Int32,
4094b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // it makes sense to invoke this constructor directly.
4095b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HBoundsCheck(HValue* index, HValue* length)
4096b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    : skip_check_(false),
4097b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      base_(NULL), offset_(0), scale_(0),
4098b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      allow_equality_(false) {
40993fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(0, index);
41003fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(1, length);
4101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetFlag(kFlexibleRepresentation);
4102b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kUseGVN);
4103b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
4104b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool IsDeletable() const OVERRIDE {
4106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return skip_check() && !FLAG_debug_code;
4107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
4108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
4109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HBoundsCheckBaseIndexInformation FINAL
4112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    : public HTemplateInstruction<2> {
4113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
4114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit HBoundsCheckBaseIndexInformation(HBoundsCheck* check) {
4115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DecompositionResult decomposition;
4116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (check->index()->TryDecompose(&decomposition)) {
4117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      SetOperandAt(0, decomposition.base());
4118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      SetOperandAt(1, check);
4119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else {
4120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      UNREACHABLE();
4121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
4122b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
4123b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* base_index() const { return OperandAt(0); }
4125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HBoundsCheck* bounds_check() { return HBoundsCheck::cast(OperandAt(1)); }
4126b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(BoundsCheckBaseIndexInformation)
4128b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
4130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return representation();
4131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
41321e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
4133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual OStream& PrintDataTo(OStream& os) const OVERRIDE;  // NOLINT
4134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual int RedefinedOperandIndex() OVERRIDE { return 0; }
4136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool IsPurelyInformativeDefinition() OVERRIDE { return true; }
4137b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
4138b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4139b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HBitwiseBinaryOperation : public HBinaryOperation {
4141b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
4142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HBitwiseBinaryOperation(HValue* context, HValue* left, HValue* right,
4143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                          HType type = HType::TaggedNumber())
4144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : HBinaryOperation(context, left, right, type) {
41451e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetFlag(kFlexibleRepresentation);
4146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetFlag(kTruncatingToInt32);
4147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetFlag(kAllowUndefinedAsNaN);
41481e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetAllSideEffects();
4149b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
4150b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual void RepresentationChanged(Representation to) OVERRIDE {
4152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (to.IsTagged() &&
4153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        (left()->ToNumberCanBeObserved() || right()->ToNumberCanBeObserved())) {
4154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      SetAllSideEffects();
4155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      ClearFlag(kUseGVN);
4156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else {
41571e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      ClearAllSideEffects();
41581e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      SetFlag(kUseGVN);
41591e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    }
4160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (to.IsTagged()) SetChangesFlag(kNewSpacePromotion);
41611e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
41621e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
4163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual void UpdateRepresentation(Representation new_rep,
4164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                    HInferRepresentationPhase* h_infer,
4165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                    const char* reason) OVERRIDE {
4166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // We only generate either int32 or generic tagged bitwise operations.
4167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (new_rep.IsDouble()) new_rep = Representation::Integer32();
4168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HBinaryOperation::UpdateRepresentation(new_rep, h_infer, reason);
4169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
4170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation observed_input_representation(int index) OVERRIDE {
4172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Representation r = HBinaryOperation::observed_input_representation(index);
4173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (r.IsDouble()) return Representation::Integer32();
4174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return r;
4175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
4176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual void initialize_output_representation(Representation observed) {
4178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (observed.IsDouble()) observed = Representation::Integer32();
4179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HBinaryOperation::initialize_output_representation(observed);
4180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
41811e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
4182257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_ABSTRACT_INSTRUCTION(BitwiseBinaryOperation)
4183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
4185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool IsDeletable() const OVERRIDE { return true; }
4186b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
4187b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4188b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HMathFloorOfDiv FINAL : public HBinaryOperation {
4190b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
4191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P2(HMathFloorOfDiv,
4192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                              HValue*,
4193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                              HValue*);
4194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(MathFloorOfDiv)
4196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected:
4198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool DataEquals(HValue* other) OVERRIDE { return true; }
4199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
4201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HMathFloorOfDiv(HValue* context, HValue* left, HValue* right)
42023fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : HBinaryOperation(context, left, right) {
4203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    set_representation(Representation::Integer32());
4204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetFlag(kUseGVN);
4205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetFlag(kCanOverflow);
4206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetFlag(kCanBeDivByZero);
4207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetFlag(kLeftCanBeMinInt);
4208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetFlag(kLeftCanBeNegative);
4209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetFlag(kLeftCanBePositive);
4210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetFlag(kAllowUndefinedAsNaN);
4211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
4212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Range* InferRange(Zone* zone) OVERRIDE;
4214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool IsDeletable() const OVERRIDE { return true; }
4216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
4217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HArithmeticBinaryOperation : public HBinaryOperation {
4220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
4221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HArithmeticBinaryOperation(HValue* context, HValue* left, HValue* right)
4222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : HBinaryOperation(context, left, right, HType::TaggedNumber()) {
42231e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetAllSideEffects();
4224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetFlag(kFlexibleRepresentation);
4225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetFlag(kAllowUndefinedAsNaN);
4226b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
4227b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual void RepresentationChanged(Representation to) OVERRIDE {
4229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (to.IsTagged() &&
4230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        (left()->ToNumberCanBeObserved() || right()->ToNumberCanBeObserved())) {
4231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      SetAllSideEffects();
4232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      ClearFlag(kUseGVN);
4233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else {
42341e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      ClearAllSideEffects();
4235b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      SetFlag(kUseGVN);
4236b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
4237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (to.IsTagged()) SetChangesFlag(kNewSpacePromotion);
4238b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
4239b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_ABSTRACT_INSTRUCTION(ArithmeticBinaryOperation)
4241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
4243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool IsDeletable() const OVERRIDE { return true; }
4244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
4245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HCompareGeneric FINAL : public HBinaryOperation {
4248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
4249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P3(HCompareGeneric, HValue*,
4250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                              HValue*, Token::Value);
4251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
42533fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return index == 0
42543fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        ? Representation::Tagged()
42553fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        : representation();
4256b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
42573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
4258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Token::Value token() const { return token_; }
4259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual OStream& PrintDataTo(OStream& os) const OVERRIDE;  // NOLINT
4260b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(CompareGeneric)
4262b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
42643fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HCompareGeneric(HValue* context,
42653fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch                  HValue* left,
42663fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch                  HValue* right,
42673fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch                  Token::Value token)
4268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : HBinaryOperation(context, left, right, HType::Boolean()),
4269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        token_(token) {
4270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(Token::IsCompareOp(token));
4271b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
42721e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetAllSideEffects();
4273b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
4274b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4275b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Token::Value token_;
4276b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
4277b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4278b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HCompareNumericAndBranch : public HTemplateControlInstruction<2, 2> {
4280b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
4281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P3(HCompareNumericAndBranch,
4282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                 HValue*, HValue*, Token::Value);
4283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P5(HCompareNumericAndBranch,
4284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                 HValue*, HValue*, Token::Value,
4285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                 HBasicBlock*, HBasicBlock*);
4286b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* left() const { return OperandAt(0); }
4288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* right() const { return OperandAt(1); }
42893fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  Token::Value token() const { return token_; }
42903fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
4291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void set_observed_input_representation(Representation left,
4292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                         Representation right) {
4293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      observed_input_representation_[0] = left;
4294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      observed_input_representation_[1] = right;
42951e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
42961e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
4297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual void InferRepresentation(
4298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      HInferRepresentationPhase* h_infer) OVERRIDE;
4299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
4301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return representation();
4302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
4303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation observed_input_representation(int index) OVERRIDE {
4304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return observed_input_representation_[index];
4305b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
4306b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool KnownSuccessorBlock(HBasicBlock** block) OVERRIDE;
43081e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
4309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual OStream& PrintDataTo(OStream& os) const OVERRIDE;  // NOLINT
4310b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void SetOperandPositions(Zone* zone,
4312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           HSourcePosition left_pos,
4313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           HSourcePosition right_pos) {
4314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    set_operand_position(zone, 0, left_pos);
4315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    set_operand_position(zone, 1, right_pos);
4316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
4317b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(CompareNumericAndBranch)
4319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
4321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HCompareNumericAndBranch(HValue* left,
4322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           HValue* right,
4323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           Token::Value token,
4324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           HBasicBlock* true_target = NULL,
4325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           HBasicBlock* false_target = NULL)
4326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : token_(token) {
4327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetFlag(kFlexibleRepresentation);
4328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(Token::IsCompareOp(token));
43293fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(0, left);
43303fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(1, right);
4331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetSuccessorAt(0, true_target);
4332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetSuccessorAt(1, false_target);
4333257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
4334257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
4335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Representation observed_input_representation_[2];
4336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Token::Value token_;
4337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
4338257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
43393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HCompareHoleAndBranch FINAL : public HUnaryControlInstruction {
4341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
4342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P1(HCompareHoleAndBranch, HValue*);
4343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P3(HCompareHoleAndBranch, HValue*,
4344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                 HBasicBlock*, HBasicBlock*);
4345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual void InferRepresentation(
4347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      HInferRepresentationPhase* h_infer) OVERRIDE;
4348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
4350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return representation();
4351257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
4352257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
4353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(CompareHoleAndBranch)
4354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
4356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HCompareHoleAndBranch(HValue* value,
4357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        HBasicBlock* true_target = NULL,
4358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        HBasicBlock* false_target = NULL)
4359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : HUnaryControlInstruction(value, true_target, false_target) {
4360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetFlag(kFlexibleRepresentation);
4361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetFlag(kAllowUndefinedAsNaN);
4362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
4363257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
4364257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
4365257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
4366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HCompareMinusZeroAndBranch FINAL : public HUnaryControlInstruction {
4367b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
4368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P1(HCompareMinusZeroAndBranch, HValue*);
43691e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
4370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual void InferRepresentation(
4371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      HInferRepresentationPhase* h_infer) OVERRIDE;
43721e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
4373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
4374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return representation();
4375b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
43763fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
4377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool KnownSuccessorBlock(HBasicBlock** block) OVERRIDE;
4378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(CompareMinusZeroAndBranch)
43803fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
43813fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch private:
4382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit HCompareMinusZeroAndBranch(HValue* value)
4383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : HUnaryControlInstruction(value, NULL, NULL) {
4384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
4385b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
4386b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4387b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HCompareObjectEqAndBranch : public HTemplateControlInstruction<2, 2> {
4389b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
4390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P2(HCompareObjectEqAndBranch, HValue*, HValue*);
4391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P4(HCompareObjectEqAndBranch, HValue*, HValue*,
4392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                 HBasicBlock*, HBasicBlock*);
4393592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
4394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool KnownSuccessorBlock(HBasicBlock** block) OVERRIDE;
4395b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static const int kNoKnownSuccessorIndex = -1;
4397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int known_successor_index() const { return known_successor_index_; }
4398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void set_known_successor_index(int known_successor_index) {
4399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    known_successor_index_ = known_successor_index;
4400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
44013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* left() const { return OperandAt(0); }
4403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* right() const { return OperandAt(1); }
4404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual OStream& PrintDataTo(OStream& os) const OVERRIDE;  // NOLINT
4406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
44083fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return Representation::Tagged();
4409b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
4410b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation observed_input_representation(int index) OVERRIDE {
4412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return Representation::Tagged();
4413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
4414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(CompareObjectEqAndBranch)
44163fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
4417b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
4418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HCompareObjectEqAndBranch(HValue* left,
4419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                            HValue* right,
4420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                            HBasicBlock* true_target = NULL,
4421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                            HBasicBlock* false_target = NULL)
4422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : known_successor_index_(kNoKnownSuccessorIndex) {
4423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(0, left);
4424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(1, right);
4425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetSuccessorAt(0, true_target);
4426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetSuccessorAt(1, false_target);
4427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
4428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int known_successor_index_;
4430b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
4431b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4432b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HIsObjectAndBranch FINAL : public HUnaryControlInstruction {
4434b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
4435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P1(HIsObjectAndBranch, HValue*);
4436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P3(HIsObjectAndBranch, HValue*,
4437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                 HBasicBlock*, HBasicBlock*);
4438b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
44403fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return Representation::Tagged();
44413fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
44421e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
4443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool KnownSuccessorBlock(HBasicBlock** block) OVERRIDE;
4444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
44453fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(IsObjectAndBranch)
4446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
4448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HIsObjectAndBranch(HValue* value,
4449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                     HBasicBlock* true_target = NULL,
4450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                     HBasicBlock* false_target = NULL)
4451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    : HUnaryControlInstruction(value, true_target, false_target) {}
4452b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
4453b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HIsStringAndBranch FINAL : public HUnaryControlInstruction {
44563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
4457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P1(HIsStringAndBranch, HValue*);
4458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P3(HIsStringAndBranch, HValue*,
4459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                 HBasicBlock*, HBasicBlock*);
44603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
44623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return Representation::Tagged();
44633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
44643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool KnownSuccessorBlock(HBasicBlock** block) OVERRIDE;
4466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static const int kNoKnownSuccessorIndex = -1;
4468b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int known_successor_index() const { return known_successor_index_; }
4469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void set_known_successor_index(int known_successor_index) {
4470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    known_successor_index_ = known_successor_index;
4471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
4472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
44733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(IsStringAndBranch)
4474b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4475b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected:
4476b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual int RedefinedOperandIndex() { return 0; }
4477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
4479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HIsStringAndBranch(HValue* value,
4480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                     HBasicBlock* true_target = NULL,
4481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                     HBasicBlock* false_target = NULL)
4482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    : HUnaryControlInstruction(value, true_target, false_target),
4483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      known_successor_index_(kNoKnownSuccessorIndex) { }
4484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int known_successor_index_;
44863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
44873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4488b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HIsSmiAndBranch FINAL : public HUnaryControlInstruction {
4490b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
4491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P1(HIsSmiAndBranch, HValue*);
4492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P3(HIsSmiAndBranch, HValue*,
4493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                 HBasicBlock*, HBasicBlock*);
44943fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
44953fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(IsSmiAndBranch)
4496b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
44983fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return Representation::Tagged();
44993fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
4500257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
4501257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch protected:
4502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool DataEquals(HValue* other) OVERRIDE { return true; }
4503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual int RedefinedOperandIndex() { return 0; }
4504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
4506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HIsSmiAndBranch(HValue* value,
4507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                  HBasicBlock* true_target = NULL,
4508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                  HBasicBlock* false_target = NULL)
4509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : HUnaryControlInstruction(value, true_target, false_target) {
4510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    set_representation(Representation::Tagged());
4511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
4512257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
4513257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
4514257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
4515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HIsUndetectableAndBranch FINAL : public HUnaryControlInstruction {
4516257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public:
4517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P1(HIsUndetectableAndBranch, HValue*);
4518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P3(HIsUndetectableAndBranch, HValue*,
4519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                 HBasicBlock*, HBasicBlock*);
4520257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
4521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
45223fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return Representation::Tagged();
45233fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
45241e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
4525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool KnownSuccessorBlock(HBasicBlock** block) OVERRIDE;
4526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
45273fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(IsUndetectableAndBranch)
4528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
4530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HIsUndetectableAndBranch(HValue* value,
4531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           HBasicBlock* true_target = NULL,
4532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           HBasicBlock* false_target = NULL)
4533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : HUnaryControlInstruction(value, true_target, false_target) {}
45341e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block};
45351e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
45361e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
4537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HStringCompareAndBranch : public HTemplateControlInstruction<2, 3> {
45383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
4539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P3(HStringCompareAndBranch,
4540b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                              HValue*,
4541b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                              HValue*,
4542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                              Token::Value);
45433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
45443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HValue* context() { return OperandAt(0); }
45453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HValue* left() { return OperandAt(1); }
45463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HValue* right() { return OperandAt(2); }
45473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Token::Value token() const { return token_; }
45483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual OStream& PrintDataTo(OStream& os) const OVERRIDE;  // NOLINT
45503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
45523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return Representation::Tagged();
45533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
45543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
45553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Representation GetInputRepresentation() const {
45563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return Representation::Tagged();
45573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
45583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
45593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(StringCompareAndBranch)
45603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
45613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private:
4562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HStringCompareAndBranch(HValue* context,
4563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                          HValue* left,
4564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                          HValue* right,
4565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                          Token::Value token)
4566b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : token_(token) {
4567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(Token::IsCompareOp(token));
4568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(0, context);
4569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(1, left);
4570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(2, right);
4571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    set_representation(Representation::Tagged());
4572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetChangesFlag(kNewSpacePromotion);
4573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
4574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
45753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Token::Value token_;
45763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
45773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
45783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HIsConstructCallAndBranch : public HTemplateControlInstruction<2, 0> {
45801e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public:
4581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P0(HIsConstructCallAndBranch);
4582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4583b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
4584e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
4585e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
4586e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
45873fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(IsConstructCallAndBranch)
4588b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
4589b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HIsConstructCallAndBranch() {}
4590b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
4591b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4592b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HHasInstanceTypeAndBranch FINAL : public HUnaryControlInstruction {
4594b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
4595b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P2(
4596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      HHasInstanceTypeAndBranch, HValue*, InstanceType);
4597b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P3(
4598b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      HHasInstanceTypeAndBranch, HValue*, InstanceType, InstanceType);
4599b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4600b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  InstanceType from() { return from_; }
4601b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  InstanceType to() { return to_; }
4602b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4603b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual OStream& PrintDataTo(OStream& os) const OVERRIDE;  // NOLINT
4604b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4605b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
46063fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return Representation::Tagged();
4607b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
4608b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4609b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool KnownSuccessorBlock(HBasicBlock** block) OVERRIDE;
4610b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
46113fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(HasInstanceTypeAndBranch)
46123fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
4613b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
4614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HHasInstanceTypeAndBranch(HValue* value, InstanceType type)
4615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : HUnaryControlInstruction(value, NULL, NULL), from_(type), to_(type) { }
4616b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HHasInstanceTypeAndBranch(HValue* value, InstanceType from, InstanceType to)
4617b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : HUnaryControlInstruction(value, NULL, NULL), from_(from), to_(to) {
4618b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(to == LAST_TYPE);  // Others not implemented yet in backend.
4619b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
4620b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4621b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  InstanceType from_;
4622b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  InstanceType to_;  // Inclusive range, not all combinations work.
4623b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
4624b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4625b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HHasCachedArrayIndexAndBranch FINAL : public HUnaryControlInstruction {
4627b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
4628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P1(HHasCachedArrayIndexAndBranch, HValue*);
4629b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
46313fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return Representation::Tagged();
46323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
46331e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
46343fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(HasCachedArrayIndexAndBranch)
4635b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
4636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit HHasCachedArrayIndexAndBranch(HValue* value)
4637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : HUnaryControlInstruction(value, NULL, NULL) { }
4638e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch};
4639e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
4640e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
4641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HGetCachedArrayIndex FINAL : public HUnaryOperation {
4642e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch public:
4643b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P1(HGetCachedArrayIndex, HValue*);
46443fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
4645b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
46463fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return Representation::Tagged();
46473fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
4648e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
4649257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(GetCachedArrayIndex)
4650e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
4651e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch protected:
4652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool DataEquals(HValue* other) OVERRIDE { return true; }
4653b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
4655b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit HGetCachedArrayIndex(HValue* value) : HUnaryOperation(value) {
4656b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    set_representation(Representation::Tagged());
4657b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetFlag(kUseGVN);
4658b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
4659b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4660b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool IsDeletable() const OVERRIDE { return true; }
4661b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
4662b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4663b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HClassOfTestAndBranch FINAL : public HUnaryControlInstruction {
4665b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
4666b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P2(HClassOfTestAndBranch, HValue*,
4667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                 Handle<String>);
4668b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
46693fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(ClassOfTestAndBranch)
46703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
4671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
46723fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return Representation::Tagged();
46733fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
4674b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4675b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual OStream& PrintDataTo(OStream& os) const OVERRIDE;  // NOLINT
4676b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4677b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<String> class_name() const { return class_name_; }
4678b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4679b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
4680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HClassOfTestAndBranch(HValue* value, Handle<String> class_name)
4681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : HUnaryControlInstruction(value, NULL, NULL),
4682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        class_name_(class_name) { }
4683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4684b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<String> class_name_;
4685b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
4686b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4687b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4688b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HTypeofIsAndBranch FINAL : public HUnaryControlInstruction {
4689b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
4690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P2(HTypeofIsAndBranch, HValue*, Handle<String>);
4691b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4692b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<String> type_literal() const { return type_literal_.handle(); }
4693b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual OStream& PrintDataTo(OStream& os) const OVERRIDE;  // NOLINT
4694b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
46953fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(TypeofIsAndBranch)
4696b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
4698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return Representation::None();
4699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
4700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool KnownSuccessorBlock(HBasicBlock** block) OVERRIDE;
4702b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4703b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual void FinalizeUniqueness() OVERRIDE {
4704b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    type_literal_ = Unique<String>(type_literal_.handle());
4705b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
4706b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4707b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
4708b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HTypeofIsAndBranch(HValue* value, Handle<String> type_literal)
4709b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : HUnaryControlInstruction(value, NULL, NULL),
4710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        type_literal_(Unique<String>::CreateUninitialized(type_literal)) { }
4711b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4712b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Unique<String> type_literal_;
4713b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
4714b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4715b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4716b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HInstanceOf FINAL : public HBinaryOperation {
4717b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
4718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P2(HInstanceOf, HValue*, HValue*);
4719b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4720b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
4721b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return Representation::Tagged();
4722b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
4723b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4724b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual OStream& PrintDataTo(OStream& os) const OVERRIDE;  // NOLINT
47251e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
4726257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(InstanceOf)
4727b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4728b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
4729b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HInstanceOf(HValue* context, HValue* left, HValue* right)
4730b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : HBinaryOperation(context, left, right, HType::Boolean()) {
4731086aeeaae12517475c22695a200be45495516549Ben Murdoch    set_representation(Representation::Tagged());
47321e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetAllSideEffects();
4733086aeeaae12517475c22695a200be45495516549Ben Murdoch  }
4734b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
4735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4736b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4737b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HInstanceOfKnownGlobal FINAL : public HTemplateInstruction<2> {
4738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
4739b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P2(HInstanceOfKnownGlobal,
4740b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                              HValue*,
4741b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                              Handle<JSFunction>);
4742086aeeaae12517475c22695a200be45495516549Ben Murdoch
47433fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* context() { return OperandAt(0); }
47443fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* left() { return OperandAt(1); }
4745086aeeaae12517475c22695a200be45495516549Ben Murdoch  Handle<JSFunction> function() { return function_; }
4746086aeeaae12517475c22695a200be45495516549Ben Murdoch
4747b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
4748086aeeaae12517475c22695a200be45495516549Ben Murdoch    return Representation::Tagged();
4749086aeeaae12517475c22695a200be45495516549Ben Murdoch  }
4750086aeeaae12517475c22695a200be45495516549Ben Murdoch
4751257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(InstanceOfKnownGlobal)
4752086aeeaae12517475c22695a200be45495516549Ben Murdoch
4753086aeeaae12517475c22695a200be45495516549Ben Murdoch private:
4754b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HInstanceOfKnownGlobal(HValue* context,
4755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                         HValue* left,
4756b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                         Handle<JSFunction> right)
4757b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : HTemplateInstruction<2>(HType::Boolean()), function_(right) {
4758b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(0, context);
4759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(1, left);
4760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    set_representation(Representation::Tagged());
4761b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetAllSideEffects();
4762b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
4763b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4764086aeeaae12517475c22695a200be45495516549Ben Murdoch  Handle<JSFunction> function_;
4765086aeeaae12517475c22695a200be45495516549Ben Murdoch};
4766086aeeaae12517475c22695a200be45495516549Ben Murdoch
4767086aeeaae12517475c22695a200be45495516549Ben Murdoch
4768b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HPower FINAL : public HTemplateInstruction<2> {
4769b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
4770b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HInstruction* New(Zone* zone,
4771b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           HValue* context,
4772b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           HValue* left,
4773b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           HValue* right);
4774b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
47753fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* left() { return OperandAt(0); }
4776b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* right() const { return OperandAt(1); }
47773fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
4778b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
47793fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return index == 0
47803fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      ? Representation::Double()
47813fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : Representation::None();
4782b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
4783b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation observed_input_representation(int index) OVERRIDE {
4784b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return RequiredInputRepresentation(index);
4785b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
4786b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4787257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Power)
47881e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
47891e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
4790b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool DataEquals(HValue* other) OVERRIDE { return true; }
4791b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4792b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
4793b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HPower(HValue* left, HValue* right) {
4794b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(0, left);
4795b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(1, right);
47963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    set_representation(Representation::Double());
4797b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetFlag(kUseGVN);
4798b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetChangesFlag(kNewSpacePromotion);
47993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
48003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4801b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool IsDeletable() const OVERRIDE {
4802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return !right()->representation().IsTagged();
48033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
48043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
48053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
48063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4807b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HAdd FINAL : public HArithmeticBinaryOperation {
4808b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
4809b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HInstruction* New(Zone* zone,
4810b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           HValue* context,
4811b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           HValue* left,
4812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           HValue* right);
4813b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4814b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Add is only commutative if two integer values are added and not if two
4815b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // tagged values are added (because it might be a String concatenation).
4816b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // We also do not commute (pointer + offset).
4817b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool IsCommutative() const OVERRIDE {
4818b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return !representation().IsTagged() && !representation().IsExternal();
4819b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
4820b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4821b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual HValue* Canonicalize() OVERRIDE;
4822b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4823b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool TryDecompose(DecompositionResult* decomposition) OVERRIDE {
4824b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (left()->IsInteger32Constant()) {
4825b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      decomposition->Apply(right(), left()->GetInteger32Constant());
4826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return true;
4827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else if (right()->IsInteger32Constant()) {
4828b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      decomposition->Apply(left(), right()->GetInteger32Constant());
4829b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return true;
4830b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else {
4831b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return false;
4832b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
4833b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
4834b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4835b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual void RepresentationChanged(Representation to) OVERRIDE {
4836b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (to.IsTagged() &&
4837b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        (left()->ToNumberCanBeObserved() || right()->ToNumberCanBeObserved() ||
4838b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch         left()->ToStringCanBeObserved() || right()->ToStringCanBeObserved())) {
4839b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      SetAllSideEffects();
4840b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      ClearFlag(kUseGVN);
4841b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else {
4842b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      ClearAllSideEffects();
4843b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      SetFlag(kUseGVN);
4844b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
4845b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (to.IsTagged()) {
4846b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      SetChangesFlag(kNewSpacePromotion);
4847b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      ClearFlag(kAllowUndefinedAsNaN);
4848b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
4849b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
48503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4851b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RepresentationFromInputs() OVERRIDE;
4852b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4853b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE;
48543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4855257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Add)
4856b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4857b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
4858b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool DataEquals(HValue* other) OVERRIDE { return true; }
4859b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4860b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Range* InferRange(Zone* zone) OVERRIDE;
4861b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4862b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
4863b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HAdd(HValue* context, HValue* left, HValue* right)
48643fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : HArithmeticBinaryOperation(context, left, right) {
4865b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kCanOverflow);
4866b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
4867b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
4868b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4869b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4870b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HSub FINAL : public HArithmeticBinaryOperation {
4871b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
4872b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HInstruction* New(Zone* zone,
4873b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           HValue* context,
4874b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           HValue* left,
4875b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           HValue* right);
4876b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4877b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual HValue* Canonicalize() OVERRIDE;
48783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4879b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool TryDecompose(DecompositionResult* decomposition) OVERRIDE {
4880b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (right()->IsInteger32Constant()) {
4881b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      decomposition->Apply(left(), -right()->GetInteger32Constant());
4882b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return true;
4883b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else {
4884b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return false;
4885b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
4886b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
48873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4888257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Sub)
4889b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4890b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
4891b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool DataEquals(HValue* other) OVERRIDE { return true; }
48921e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
4893b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Range* InferRange(Zone* zone) OVERRIDE;
4894b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4895b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
4896b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HSub(HValue* context, HValue* left, HValue* right)
4897b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : HArithmeticBinaryOperation(context, left, right) {
4898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetFlag(kCanOverflow);
4899b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
4900b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
4901b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4902b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4903b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HMul FINAL : public HArithmeticBinaryOperation {
4904b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
4905b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HInstruction* New(Zone* zone,
4906b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           HValue* context,
4907b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           HValue* left,
4908b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           HValue* right);
4909b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4910b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HInstruction* NewImul(Zone* zone,
4911b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                         HValue* context,
4912b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                         HValue* left,
4913b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                         HValue* right) {
4914b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HInstruction* instr = HMul::New(zone, context, left, right);
4915b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (!instr->IsMul()) return instr;
4916b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HMul* mul = HMul::cast(instr);
4917b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // TODO(mstarzinger): Prevent bailout on minus zero for imul.
4918b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    mul->AssumeRepresentation(Representation::Integer32());
4919b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    mul->ClearFlag(HValue::kCanOverflow);
4920b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return mul;
4921b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
4922b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4923b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual HValue* Canonicalize() OVERRIDE;
4924b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4925b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Only commutative if it is certain that not two objects are multiplicated.
4926b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool IsCommutative() const OVERRIDE {
4927b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return !representation().IsTagged();
4928b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
4929b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4930b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual void UpdateRepresentation(Representation new_rep,
4931b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                    HInferRepresentationPhase* h_infer,
4932b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                    const char* reason) OVERRIDE {
4933b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HArithmeticBinaryOperation::UpdateRepresentation(new_rep, h_infer, reason);
4934b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
4935b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4936b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool MulMinusOne();
49373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4938257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Mul)
4939b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4940b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
4941b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool DataEquals(HValue* other) OVERRIDE { return true; }
4942b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4943b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Range* InferRange(Zone* zone) OVERRIDE;
4944b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4945b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
4946b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HMul(HValue* context, HValue* left, HValue* right)
49473fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : HArithmeticBinaryOperation(context, left, right) {
4948b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetFlag(kCanOverflow);
4949b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
4950b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
4951b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
495244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
4953b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HMod FINAL : public HArithmeticBinaryOperation {
4954b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
4955b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HInstruction* New(Zone* zone,
4956b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           HValue* context,
4957b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           HValue* left,
4958b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           HValue* right);
495944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
4960b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual HValue* Canonicalize() OVERRIDE;
4961b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4962b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual void UpdateRepresentation(Representation new_rep,
4963b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                    HInferRepresentationPhase* h_infer,
4964b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                    const char* reason) OVERRIDE {
4965b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (new_rep.IsSmi()) new_rep = Representation::Integer32();
4966b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HArithmeticBinaryOperation::UpdateRepresentation(new_rep, h_infer, reason);
4967b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
49683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4969257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Mod)
4970b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4971b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
4972b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool DataEquals(HValue* other) OVERRIDE { return true; }
49731e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
4974b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Range* InferRange(Zone* zone) OVERRIDE;
4975b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4976b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
4977b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HMod(HValue* context,
4978b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch       HValue* left,
4979b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch       HValue* right) : HArithmeticBinaryOperation(context, left, right) {
4980b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetFlag(kCanBeDivByZero);
4981b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetFlag(kCanOverflow);
4982b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetFlag(kLeftCanBeNegative);
4983b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
4984b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
4985b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4986b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4987b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HDiv FINAL : public HArithmeticBinaryOperation {
4988b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
4989b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HInstruction* New(Zone* zone,
4990b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           HValue* context,
4991b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           HValue* left,
4992b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           HValue* right);
4993b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4994b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual HValue* Canonicalize() OVERRIDE;
4995b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4996b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual void UpdateRepresentation(Representation new_rep,
4997b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                    HInferRepresentationPhase* h_infer,
4998b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                    const char* reason) OVERRIDE {
4999b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (new_rep.IsSmi()) new_rep = Representation::Integer32();
5000b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HArithmeticBinaryOperation::UpdateRepresentation(new_rep, h_infer, reason);
5001b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
5002b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5003b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(Div)
5004b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5005b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected:
5006b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool DataEquals(HValue* other) OVERRIDE { return true; }
5007b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5008b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Range* InferRange(Zone* zone) OVERRIDE;
5009b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5010b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
50113fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HDiv(HValue* context, HValue* left, HValue* right)
50123fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : HArithmeticBinaryOperation(context, left, right) {
5013b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kCanBeDivByZero);
5014b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kCanOverflow);
5015b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
5016b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
5017b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5018b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5019b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HMathMinMax FINAL : public HArithmeticBinaryOperation {
5020b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
5021b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  enum Operation { kMathMin, kMathMax };
5022b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5023b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HInstruction* New(Zone* zone,
5024b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           HValue* context,
5025b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           HValue* left,
5026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           HValue* right,
5027b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           Operation op);
50283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5029b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation observed_input_representation(int index) OVERRIDE {
5030b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return RequiredInputRepresentation(index);
5031b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
5032b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5033b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual void InferRepresentation(
5034b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      HInferRepresentationPhase* h_infer) OVERRIDE;
5035b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5036b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RepresentationFromInputs() OVERRIDE {
5037b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Representation left_rep = left()->representation();
5038b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Representation right_rep = right()->representation();
5039b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Representation result = Representation::Smi();
5040b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    result = result.generalize(left_rep);
5041b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    result = result.generalize(right_rep);
5042b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (result.IsTagged()) return Representation::Double();
5043b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return result;
5044b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
5045b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5046b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool IsCommutative() const OVERRIDE { return true; }
5047b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Operation operation() { return operation_; }
5049b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5050b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(MathMinMax)
5051b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5052b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
5053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool DataEquals(HValue* other) OVERRIDE {
5054b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return other->IsMathMinMax() &&
5055b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        HMathMinMax::cast(other)->operation_ == operation_;
5056b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
50571e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
5058b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Range* InferRange(Zone* zone) OVERRIDE;
5059b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5060b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
5061b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HMathMinMax(HValue* context, HValue* left, HValue* right, Operation op)
5062b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : HArithmeticBinaryOperation(context, left, right),
5063b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        operation_(op) { }
5064b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5065b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Operation operation_;
5066b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
5067b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5068b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5069b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HBitwise FINAL : public HBitwiseBinaryOperation {
5070b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
5071b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HInstruction* New(Zone* zone,
5072b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           HValue* context,
5073b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           Token::Value op,
5074b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           HValue* left,
5075b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           HValue* right);
5076c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch
50773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Token::Value op() const { return op_; }
507885b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch
5079b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool IsCommutative() const OVERRIDE { return true; }
5080592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
5081b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual HValue* Canonicalize() OVERRIDE;
508285b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch
5083b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual OStream& PrintDataTo(OStream& os) const OVERRIDE;  // NOLINT
508485b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch
50853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(Bitwise)
508685b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch
508785b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch protected:
5088b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool DataEquals(HValue* other) OVERRIDE {
50893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return op() == HBitwise::cast(other)->op();
50903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
509185b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch
5092b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Range* InferRange(Zone* zone) OVERRIDE;
50933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
50943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private:
5095b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HBitwise(HValue* context,
5096b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch           Token::Value op,
5097b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch           HValue* left,
5098b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch           HValue* right)
5099b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : HBitwiseBinaryOperation(context, left, right),
5100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        op_(op) {
5101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(op == Token::BIT_AND || op == Token::BIT_OR || op == Token::BIT_XOR);
5102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // BIT_AND with a smi-range positive value will always unset the
5103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // entire sign-extension of the smi-sign.
5104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (op == Token::BIT_AND &&
5105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        ((left->IsConstant() &&
5106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          left->representation().IsSmi() &&
5107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          HConstant::cast(left)->Integer32Value() >= 0) ||
5108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch         (right->IsConstant() &&
5109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          right->representation().IsSmi() &&
5110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          HConstant::cast(right)->Integer32Value() >= 0))) {
5111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      SetFlag(kTruncatingToSmi);
5112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      SetFlag(kTruncatingToInt32);
5113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // BIT_OR with a smi-range negative value will always set the entire
5114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // sign-extension of the smi-sign.
5115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else if (op == Token::BIT_OR &&
5116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        ((left->IsConstant() &&
5117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          left->representation().IsSmi() &&
5118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          HConstant::cast(left)->Integer32Value() < 0) ||
5119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch         (right->IsConstant() &&
5120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          right->representation().IsSmi() &&
5121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          HConstant::cast(right)->Integer32Value() < 0))) {
5122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      SetFlag(kTruncatingToSmi);
5123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      SetFlag(kTruncatingToInt32);
5124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
5125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
5126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
51273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Token::Value op_;
5128b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
5129b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5130b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HShl FINAL : public HBitwiseBinaryOperation {
5132b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
5133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HInstruction* New(Zone* zone,
5134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           HValue* context,
5135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           HValue* left,
5136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           HValue* right);
5137b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Range* InferRange(Zone* zone) OVERRIDE;
51393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual void UpdateRepresentation(Representation new_rep,
5141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                    HInferRepresentationPhase* h_infer,
5142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                    const char* reason) OVERRIDE {
5143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (new_rep.IsSmi() &&
5144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        !(right()->IsInteger32Constant() &&
5145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          right()->GetInteger32Constant() >= 0)) {
5146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      new_rep = Representation::Integer32();
5147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
5148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HBitwiseBinaryOperation::UpdateRepresentation(new_rep, h_infer, reason);
5149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
5150b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5151257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Shl)
51521e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
51531e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
5154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool DataEquals(HValue* other) OVERRIDE { return true; }
5155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
5157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HShl(HValue* context, HValue* left, HValue* right)
5158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : HBitwiseBinaryOperation(context, left, right) { }
5159b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
5160b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5161b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HShr FINAL : public HBitwiseBinaryOperation {
5163b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
5164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HInstruction* New(Zone* zone,
5165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           HValue* context,
5166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           HValue* left,
5167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           HValue* right);
5168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool TryDecompose(DecompositionResult* decomposition) OVERRIDE {
5170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (right()->IsInteger32Constant()) {
5171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (decomposition->Apply(left(), 0, right()->GetInteger32Constant())) {
5172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        // This is intended to look for HAdd and HSub, to handle compounds
5173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        // like ((base + offset) >> scale) with one single decomposition.
5174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        left()->TryDecompose(decomposition);
5175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return true;
5176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
5177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
5178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return false;
5179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
5180b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Range* InferRange(Zone* zone) OVERRIDE;
51823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual void UpdateRepresentation(Representation new_rep,
5184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                    HInferRepresentationPhase* h_infer,
5185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                    const char* reason) OVERRIDE {
5186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (new_rep.IsSmi()) new_rep = Representation::Integer32();
5187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HBitwiseBinaryOperation::UpdateRepresentation(new_rep, h_infer, reason);
5188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
5189b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5190257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Shr)
51911e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
51921e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
5193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool DataEquals(HValue* other) OVERRIDE { return true; }
5194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
5196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HShr(HValue* context, HValue* left, HValue* right)
5197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : HBitwiseBinaryOperation(context, left, right) { }
5198b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
5199b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5200b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HSar FINAL : public HBitwiseBinaryOperation {
5202b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
5203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HInstruction* New(Zone* zone,
5204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           HValue* context,
5205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           HValue* left,
5206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           HValue* right);
5207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool TryDecompose(DecompositionResult* decomposition) OVERRIDE {
5209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (right()->IsInteger32Constant()) {
5210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (decomposition->Apply(left(), 0, right()->GetInteger32Constant())) {
5211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        // This is intended to look for HAdd and HSub, to handle compounds
5212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        // like ((base + offset) >> scale) with one single decomposition.
5213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        left()->TryDecompose(decomposition);
5214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return true;
5215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
5216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
5217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return false;
5218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
52193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Range* InferRange(Zone* zone) OVERRIDE;
5221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual void UpdateRepresentation(Representation new_rep,
5223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                    HInferRepresentationPhase* h_infer,
5224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                    const char* reason) OVERRIDE {
5225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (new_rep.IsSmi()) new_rep = Representation::Integer32();
5226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HBitwiseBinaryOperation::UpdateRepresentation(new_rep, h_infer, reason);
5227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
5228b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5229257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Sar)
52301e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
52311e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
5232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool DataEquals(HValue* other) OVERRIDE { return true; }
5233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
5235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HSar(HValue* context, HValue* left, HValue* right)
5236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : HBitwiseBinaryOperation(context, left, right) { }
5237b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
5238b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5239b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HRor FINAL : public HBitwiseBinaryOperation {
5241b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
5242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HInstruction* New(Zone* zone,
5243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           HValue* context,
5244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           HValue* left,
5245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           HValue* right) {
5246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return new(zone) HRor(context, left, right);
5247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
5248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual void UpdateRepresentation(Representation new_rep,
5250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                    HInferRepresentationPhase* h_infer,
5251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                    const char* reason) OVERRIDE {
5252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (new_rep.IsSmi()) new_rep = Representation::Integer32();
5253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HBitwiseBinaryOperation::UpdateRepresentation(new_rep, h_infer, reason);
5254b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
5255b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(Ror)
5257b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected:
5259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool DataEquals(HValue* other) OVERRIDE { return true; }
5260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
5262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HRor(HValue* context, HValue* left, HValue* right)
5263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch       : HBitwiseBinaryOperation(context, left, right) {
5264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    ChangeRepresentation(Representation::Integer32());
5265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
5266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
5267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HOsrEntry FINAL : public HTemplateInstruction<0> {
5270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
5271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P1(HOsrEntry, BailoutId);
5272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BailoutId ast_id() const { return ast_id_; }
5274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
5276e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
5277e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
5278e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
5279257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(OsrEntry)
5280b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5281b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
5282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit HOsrEntry(BailoutId ast_id) : ast_id_(ast_id) {
5283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetChangesFlag(kOsrEntries);
5284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetChangesFlag(kNewSpacePromotion);
5285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
5286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  BailoutId ast_id_;
5288b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
5289b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5290b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HParameter FINAL : public HTemplateInstruction<0> {
5292b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
5293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  enum ParameterKind {
5294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    STACK_PARAMETER,
5295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    REGISTER_PARAMETER
5296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  };
5297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P1(HParameter, unsigned);
5299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P2(HParameter, unsigned, ParameterKind);
5300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P3(HParameter, unsigned, ParameterKind,
5301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                 Representation);
5302b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5303b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  unsigned index() const { return index_; }
5304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ParameterKind kind() const { return kind_; }
5305b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual OStream& PrintDataTo(OStream& os) const OVERRIDE;  // NOLINT
5307e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
5308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
5309e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
5310e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
5311b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5312257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Parameter)
5313b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5314b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
5315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit HParameter(unsigned index,
5316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                      ParameterKind kind = STACK_PARAMETER)
5317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : index_(index),
5318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        kind_(kind) {
5319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    set_representation(Representation::Tagged());
5320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
5321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit HParameter(unsigned index,
5323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                      ParameterKind kind,
5324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                      Representation r)
5325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : index_(index),
5326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        kind_(kind) {
5327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    set_representation(r);
5328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
5329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5330b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  unsigned index_;
5331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ParameterKind kind_;
5332b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
5333b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5334b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HCallStub FINAL : public HUnaryCall {
5336b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
5337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P2(HCallStub, CodeStub::Major, int);
5338b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  CodeStub::Major major_key() { return major_key_; }
53391e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
5340e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* context() { return value(); }
5341b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual OStream& PrintDataTo(OStream& os) const OVERRIDE;  // NOLINT
5343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(CallStub)
5345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
5347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HCallStub(HValue* context, CodeStub::Major major_key, int argument_count)
5348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : HUnaryCall(context, argument_count),
5349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        major_key_(major_key) {
5350b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
53511e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
5352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CodeStub::Major major_key_;
5353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
5354e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
5355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HTailCallThroughMegamorphicCache FINAL : public HTemplateInstruction<3> {
5357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
5358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P3(HTailCallThroughMegamorphicCache,
5359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                              HValue*, HValue*, Code::Flags);
5360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
5362e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::Tagged();
5363e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
5364b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* context() const { return OperandAt(0); }
5366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* receiver() const { return OperandAt(1); }
5367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* name() const { return OperandAt(2); }
5368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Code::Flags flags() const { return flags_; }
5369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual OStream& PrintDataTo(OStream& os) const OVERRIDE;  // NOLINT
5371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(TailCallThroughMegamorphicCache)
5373b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5374b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
5375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HTailCallThroughMegamorphicCache(HValue* context, HValue* receiver,
5376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                   HValue* name, Code::Flags flags)
5377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : flags_(flags) {
5378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(0, context);
5379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(1, receiver);
5380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(2, name);
5381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
5382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Code::Flags flags_;
5384b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
5385b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5386b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HUnknownOSRValue FINAL : public HTemplateInstruction<0> {
5388b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
5389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P2(HUnknownOSRValue, HEnvironment*, int);
5390b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual OStream& PrintDataTo(OStream& os) const;  // NOLINT
5392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
5394e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
5395e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
5396e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
5397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void set_incoming_value(HPhi* value) { incoming_value_ = value; }
5398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HPhi* incoming_value() { return incoming_value_; }
5399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HEnvironment *environment() { return environment_; }
5400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int index() { return index_; }
54013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation KnownOptimalRepresentation() OVERRIDE {
5403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (incoming_value_ == NULL) return Representation::None();
5404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return incoming_value_->KnownOptimalRepresentation();
54053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
54063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5407257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(UnknownOSRValue)
54083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
54093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private:
5410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HUnknownOSRValue(HEnvironment* environment, int index)
5411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : environment_(environment),
5412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        index_(index),
5413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        incoming_value_(NULL) {
5414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    set_representation(Representation::Tagged());
5415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
5416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HEnvironment* environment_;
5418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int index_;
54193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HPhi* incoming_value_;
5420b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
5421b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5422b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HLoadGlobalCell FINAL : public HTemplateInstruction<0> {
5424b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
5425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P2(HLoadGlobalCell, Handle<Cell>,
5426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                 PropertyDetails);
5427b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Unique<Cell> cell() const { return cell_; }
5429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool RequiresHoleCheck() const;
5430b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual OStream& PrintDataTo(OStream& os) const OVERRIDE;  // NOLINT
5432b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual intptr_t Hashcode() OVERRIDE {
5434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return cell_.Hashcode();
5435b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
5436b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual void FinalizeUniqueness() OVERRIDE {
5438b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    cell_ = Unique<Cell>(cell_.handle());
5439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
5440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
5442e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::None();
5443e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
5444e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
5445257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(LoadGlobalCell)
5446b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5447b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected:
5448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool DataEquals(HValue* other) OVERRIDE {
5449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return cell_ == HLoadGlobalCell::cast(other)->cell_;
5450b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
5451b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5452b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
5453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HLoadGlobalCell(Handle<Cell> cell, PropertyDetails details)
5454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    : cell_(Unique<Cell>::CreateUninitialized(cell)), details_(details) {
5455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    set_representation(Representation::Tagged());
5456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetFlag(kUseGVN);
5457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetDependsOnFlag(kGlobalVars);
5458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
5459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool IsDeletable() const OVERRIDE { return !RequiresHoleCheck(); }
5461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Unique<Cell> cell_;
54633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  PropertyDetails details_;
5464b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
5465b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5466b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HLoadGlobalGeneric FINAL : public HTemplateInstruction<2> {
5468b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
5469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P3(HLoadGlobalGeneric, HValue*,
5470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                              Handle<String>, bool);
54718b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
54728b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  HValue* context() { return OperandAt(0); }
54738b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  HValue* global_object() { return OperandAt(1); }
5474b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<String> name() const { return name_; }
54758b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  bool for_typeof() const { return for_typeof_; }
5476b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int slot() const {
5477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(FLAG_vector_ics &&
5478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch           slot_ != FeedbackSlotInterface::kInvalidFeedbackSlot);
5479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return slot_;
5480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
5481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<FixedArray> feedback_vector() const { return feedback_vector_; }
5482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void SetVectorAndSlot(Handle<FixedArray> vector, int slot) {
5483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(FLAG_vector_ics);
5484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    feedback_vector_ = vector;
5485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    slot_ = slot;
5486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
54878b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
5488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual OStream& PrintDataTo(OStream& os) const OVERRIDE;  // NOLINT
54898b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
5490b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
54918b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    return Representation::Tagged();
54928b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  }
54938b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
5494257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(LoadGlobalGeneric)
54958b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
54968b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch private:
5497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HLoadGlobalGeneric(HValue* context, HValue* global_object,
5498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                     Handle<String> name, bool for_typeof)
5499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : name_(name), for_typeof_(for_typeof),
5500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        slot_(FeedbackSlotInterface::kInvalidFeedbackSlot) {
5501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(0, context);
5502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(1, global_object);
5503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    set_representation(Representation::Tagged());
5504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetAllSideEffects();
5505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
5506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<String> name_;
55088b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  bool for_typeof_;
5509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<FixedArray> feedback_vector_;
5510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int slot_;
55118b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch};
55128b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
55138b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
5514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HAllocate FINAL : public HTemplateInstruction<2> {
5515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
5516b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static bool CompatibleInstanceTypes(InstanceType type1,
5517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                      InstanceType type2) {
5518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return ComputeFlags(TENURED, type1) == ComputeFlags(TENURED, type2) &&
5519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        ComputeFlags(NOT_TENURED, type1) == ComputeFlags(NOT_TENURED, type2);
5520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
55213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HAllocate* New(Zone* zone,
5523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        HValue* context,
5524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        HValue* size,
5525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        HType type,
5526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        PretenureFlag pretenure_flag,
5527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        InstanceType instance_type,
5528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        Handle<AllocationSite> allocation_site =
5529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                            Handle<AllocationSite>::null()) {
5530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return new(zone) HAllocate(context, size, type, pretenure_flag,
5531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        instance_type, allocation_site);
5532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
55333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Maximum instance size for which allocations will be inlined.
5535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static const int kMaxInlineSize = 64 * kPointerSize;
5536b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* context() const { return OperandAt(0); }
5538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* size() const { return OperandAt(1); }
5539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5540b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool has_size_upper_bound() { return size_upper_bound_ != NULL; }
5541b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HConstant* size_upper_bound() { return size_upper_bound_; }
5542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void set_size_upper_bound(HConstant* value) {
5543b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(size_upper_bound_ == NULL);
5544b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    size_upper_bound_ = value;
5545b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
5546b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
5548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (index == 0) {
5549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return Representation::Tagged();
5550b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else {
5551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return Representation::Integer32();
5552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
55533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
5554b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Handle<Map> GetMonomorphicJSObjectMap() OVERRIDE {
5556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return known_initial_map_;
5557b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
5558b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void set_known_initial_map(Handle<Map> known_initial_map) {
5560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    known_initial_map_ = known_initial_map;
5561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
5562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool IsNewSpaceAllocation() const {
5564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return (flags_ & ALLOCATE_IN_NEW_SPACE) != 0;
5565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
5566b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool IsOldDataSpaceAllocation() const {
5568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return (flags_ & ALLOCATE_IN_OLD_DATA_SPACE) != 0;
5569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
5570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool IsOldPointerSpaceAllocation() const {
5572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return (flags_ & ALLOCATE_IN_OLD_POINTER_SPACE) != 0;
5573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
5574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool MustAllocateDoubleAligned() const {
5576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return (flags_ & ALLOCATE_DOUBLE_ALIGNED) != 0;
5577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
5578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool MustPrefillWithFiller() const {
5580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return (flags_ & PREFILL_WITH_FILLER) != 0;
5581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
5582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5583b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void MakePrefillWithFiller() {
5584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    flags_ = static_cast<HAllocate::Flags>(flags_ | PREFILL_WITH_FILLER);
5585b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
5586b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool MustClearNextMapWord() const {
5588b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return (flags_ & CLEAR_NEXT_MAP_WORD) != 0;
5589b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
5590b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void MakeDoubleAligned() {
5592b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    flags_ = static_cast<HAllocate::Flags>(flags_ | ALLOCATE_DOUBLE_ALIGNED);
5593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
5594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5595b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool HandleSideEffectDominator(GVNFlag side_effect,
5596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                         HValue* dominator) OVERRIDE;
5597b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5598b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual OStream& PrintDataTo(OStream& os) const OVERRIDE;  // NOLINT
5599b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5600b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(Allocate)
5601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5602b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
5603b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  enum Flags {
5604b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    ALLOCATE_IN_NEW_SPACE = 1 << 0,
5605b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    ALLOCATE_IN_OLD_DATA_SPACE = 1 << 1,
5606b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    ALLOCATE_IN_OLD_POINTER_SPACE = 1 << 2,
5607b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    ALLOCATE_DOUBLE_ALIGNED = 1 << 3,
5608b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    PREFILL_WITH_FILLER = 1 << 4,
5609b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CLEAR_NEXT_MAP_WORD = 1 << 5
5610b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  };
5611b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5612b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HAllocate(HValue* context,
5613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            HValue* size,
5614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            HType type,
5615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            PretenureFlag pretenure_flag,
5616b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            InstanceType instance_type,
5617b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            Handle<AllocationSite> allocation_site =
5618b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                Handle<AllocationSite>::null())
5619b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : HTemplateInstruction<2>(type),
5620b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        flags_(ComputeFlags(pretenure_flag, instance_type)),
5621b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        dominating_allocate_(NULL),
5622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        filler_free_space_size_(NULL),
5623b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        size_upper_bound_(NULL) {
5624b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(0, context);
5625b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    UpdateSize(size);
5626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    set_representation(Representation::Tagged());
5627b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetFlag(kTrackSideEffectDominators);
5628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetChangesFlag(kNewSpacePromotion);
5629b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetDependsOnFlag(kNewSpacePromotion);
5630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5631b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (FLAG_trace_pretenuring) {
5632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      PrintF("HAllocate with AllocationSite %p %s\n",
5633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch             allocation_site.is_null()
5634b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                 ? static_cast<void*>(NULL)
5635b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                 : static_cast<void*>(*allocation_site),
5636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch             pretenure_flag == TENURED ? "tenured" : "not tenured");
5637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
5638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
5639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static Flags ComputeFlags(PretenureFlag pretenure_flag,
5641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                            InstanceType instance_type) {
5642b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Flags flags = pretenure_flag == TENURED
5643b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        ? (Heap::TargetSpaceId(instance_type) == OLD_POINTER_SPACE
5644b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            ? ALLOCATE_IN_OLD_POINTER_SPACE : ALLOCATE_IN_OLD_DATA_SPACE)
5645b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        : ALLOCATE_IN_NEW_SPACE;
5646b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (instance_type == FIXED_DOUBLE_ARRAY_TYPE) {
5647b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      flags = static_cast<Flags>(flags | ALLOCATE_DOUBLE_ALIGNED);
5648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
5649b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // We have to fill the allocated object with one word fillers if we do
5650b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // not use allocation folding since some allocations may depend on each
5651b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // other, i.e., have a pointer to each other. A GC in between these
5652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // allocations may leave such objects behind in a not completely initialized
5653b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // state.
5654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (!FLAG_use_gvn || !FLAG_use_allocation_folding) {
5655b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      flags = static_cast<Flags>(flags | PREFILL_WITH_FILLER);
5656b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
5657b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (pretenure_flag == NOT_TENURED &&
5658b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        AllocationSite::CanTrack(instance_type)) {
5659b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      flags = static_cast<Flags>(flags | CLEAR_NEXT_MAP_WORD);
5660b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
5661b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return flags;
5662b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
5663b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void UpdateClearNextMapWord(bool clear_next_map_word) {
5665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    flags_ = static_cast<Flags>(clear_next_map_word
5666b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                ? flags_ | CLEAR_NEXT_MAP_WORD
5667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                : flags_ & ~CLEAR_NEXT_MAP_WORD);
5668b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
5669b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void UpdateSize(HValue* size) {
5671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(1, size);
5672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (size->IsInteger32Constant()) {
5673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      size_upper_bound_ = HConstant::cast(size);
5674b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else {
5675b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      size_upper_bound_ = NULL;
5676b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
5677b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
5678b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5679b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HAllocate* GetFoldableDominator(HAllocate* dominator);
5680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void UpdateFreeSpaceFiller(int32_t filler_size);
5682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void CreateFreeSpaceFiller(int32_t filler_size);
5684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool IsFoldable(HAllocate* allocate) {
5686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return (IsNewSpaceAllocation() && allocate->IsNewSpaceAllocation()) ||
5687b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        (IsOldDataSpaceAllocation() && allocate->IsOldDataSpaceAllocation()) ||
5688b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        (IsOldPointerSpaceAllocation() &&
5689b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            allocate->IsOldPointerSpaceAllocation());
5690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
5691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5692b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void ClearNextMapWord(int offset);
5693b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Flags flags_;
5695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Map> known_initial_map_;
5696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HAllocate* dominating_allocate_;
5697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HStoreNamedField* filler_free_space_size_;
5698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HConstant* size_upper_bound_;
5699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
5700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5702b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HStoreCodeEntry FINAL: public HTemplateInstruction<2> {
5703b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
5704b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HStoreCodeEntry* New(Zone* zone,
5705b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                              HValue* context,
5706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                              HValue* function,
5707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                              HValue* code) {
5708b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return new(zone) HStoreCodeEntry(function, code);
57093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
5710b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
57113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
5712b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return Representation::Tagged();
5713b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
5714b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5715b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* function() { return OperandAt(0); }
5716b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* code_object() { return OperandAt(1); }
5717b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(StoreCodeEntry)
5719b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5720b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
5721b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HStoreCodeEntry(HValue* function, HValue* code) {
5722b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(0, function);
5723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(1, code);
5724b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
5725b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
5726b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5727b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5728b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HInnerAllocatedObject FINAL : public HTemplateInstruction<2> {
57298b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch public:
5730b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HInnerAllocatedObject* New(Zone* zone,
5731b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                    HValue* context,
5732b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                    HValue* value,
5733b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                    HValue* offset,
5734b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                    HType type) {
5735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return new(zone) HInnerAllocatedObject(value, offset, type);
5736b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
5737b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* base_object() const { return OperandAt(0); }
5739b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* offset() const { return OperandAt(1); }
5740b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5741b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
5742b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return index == 0 ? Representation::Tagged() : Representation::Integer32();
5743b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
5744b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5745b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual OStream& PrintDataTo(OStream& os) const OVERRIDE;  // NOLINT
5746b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5747b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(InnerAllocatedObject)
5748b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5749b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
5750b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HInnerAllocatedObject(HValue* value,
5751b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        HValue* offset,
5752b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        HType type) : HTemplateInstruction<2>(type) {
5753b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(value->IsAllocate());
5754b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(type.IsHeapObject());
5755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(0, value);
5756b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(1, offset);
57578b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    set_representation(Representation::Tagged());
57588b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  }
5759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
57608b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
57618b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
5762b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinline bool StoringValueNeedsWriteBarrier(HValue* value) {
5763b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return !value->type().IsSmi()
5764b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      && !value->type().IsNull()
5765b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      && !value->type().IsBoolean()
5766b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      && !value->type().IsUndefined()
5767b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      && !(value->IsConstant() && HConstant::cast(value)->ImmortalImmovable());
5768b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
5769b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
57708b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
5771b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinline bool ReceiverObjectNeedsWriteBarrier(HValue* object,
5772b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                            HValue* value,
5773b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                            HValue* dominator) {
5774b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  while (object->IsInnerAllocatedObject()) {
5775b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    object = HInnerAllocatedObject::cast(object)->base_object();
5776b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
5777b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (object->IsConstant() && HConstant::cast(object)->IsCell()) {
5778b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return false;
5779b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
5780b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (object->IsConstant() &&
5781b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      HConstant::cast(object)->HasExternalReferenceValue()) {
5782b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // Stores to external references require no write barriers
5783b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return false;
5784b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
5785b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // We definitely need a write barrier unless the object is the allocation
5786b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // dominator.
5787b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (object == dominator && object->IsAllocate()) {
5788b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // Stores to new space allocations require no write barriers.
5789b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (HAllocate::cast(object)->IsNewSpaceAllocation()) {
5790b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return false;
5791b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
5792b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // Stores to old space allocations require no write barriers if the value is
5793b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // a constant provably not in new space.
5794b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (value->IsConstant() && HConstant::cast(value)->NotInNewSpace()) {
5795b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return false;
5796b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
5797b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // Stores to old space allocations require no write barriers if the value is
5798b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // an old space allocation.
5799b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    while (value->IsInnerAllocatedObject()) {
5800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      value = HInnerAllocatedObject::cast(value)->base_object();
5801b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
5802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (value->IsAllocate() &&
5803b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        !HAllocate::cast(value)->IsNewSpaceAllocation()) {
5804b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return false;
5805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
5806b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
5807b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return true;
5808b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
5809b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5810b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5811b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinline PointersToHereCheck PointersToHereCheckForObject(HValue* object,
5812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                                        HValue* dominator) {
5813b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  while (object->IsInnerAllocatedObject()) {
5814b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    object = HInnerAllocatedObject::cast(object)->base_object();
5815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
5816b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (object == dominator &&
5817b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      object->IsAllocate() &&
5818b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      HAllocate::cast(object)->IsNewSpaceAllocation()) {
5819b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return kPointersToHereAreAlwaysInteresting;
5820b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
5821b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return kPointersToHereMaybeInteresting;
5822b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
5823b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5824b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5825b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HStoreGlobalCell FINAL : public HUnaryOperation {
5826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
5827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P3(HStoreGlobalCell, HValue*,
5828b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                 Handle<PropertyCell>, PropertyDetails);
5829b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5830b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Unique<PropertyCell> cell() const { return cell_; }
5831b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool RequiresHoleCheck() { return details_.IsConfigurable(); }
5832b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool NeedsWriteBarrier() {
5833b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return StoringValueNeedsWriteBarrier(value());
5834b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
5835b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5836b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual void FinalizeUniqueness() OVERRIDE {
5837b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    cell_ = Unique<PropertyCell>(cell_.handle());
5838b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
5839b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5840b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
58418b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    return Representation::Tagged();
58428b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  }
5843b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual OStream& PrintDataTo(OStream& os) const OVERRIDE;  // NOLINT
58448b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
5845b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(StoreGlobalCell)
58468b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
58478b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch private:
5848b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HStoreGlobalCell(HValue* value,
5849b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                   Handle<PropertyCell> cell,
5850b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                   PropertyDetails details)
5851b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : HUnaryOperation(value),
5852b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        cell_(Unique<PropertyCell>::CreateUninitialized(cell)),
5853b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        details_(details) {
5854b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetChangesFlag(kGlobalVars);
5855b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
5856b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5857b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Unique<PropertyCell> cell_;
5858b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  PropertyDetails details_;
58598b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch};
58608b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
58618b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
5862b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HLoadContextSlot FINAL : public HUnaryOperation {
5863b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public:
58643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  enum Mode {
58653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // Perform a normal load of the context slot without checking its value.
58663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    kNoCheck,
58673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // Load and check the value of the context slot. Deoptimize if it's the
58683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // hole value. This is used for checking for loading of uninitialized
58693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // harmony bindings where we deoptimize into full-codegen generated code
58703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // which will subsequently throw a reference error.
58713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    kCheckDeoptimize,
58723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // Load and check the value of the context slot. Return undefined if it's
58733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // the hole value. This is used for non-harmony const assignments
58743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    kCheckReturnUndefined
58753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  };
58763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5877b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HLoadContextSlot(HValue* context, int slot_index, Mode mode)
5878b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : HUnaryOperation(context), slot_index_(slot_index), mode_(mode) {
5879b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    set_representation(Representation::Tagged());
5880b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    SetFlag(kUseGVN);
5881b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetDependsOnFlag(kContextSlots);
5882b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
5883b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
5884b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  int slot_index() const { return slot_index_; }
58853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Mode mode() const { return mode_; }
58863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
58873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool DeoptimizesOnHole() {
58883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return mode_ == kCheckDeoptimize;
58893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
5890c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch
5891b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool RequiresHoleCheck() const {
58923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return mode_ != kNoCheck;
58933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
58943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5895b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
58961e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return Representation::Tagged();
5897b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
5898b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
5899b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual OStream& PrintDataTo(OStream& os) const OVERRIDE;  // NOLINT
59001e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
5901257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(LoadContextSlot)
5902b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
5903b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch protected:
5904b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool DataEquals(HValue* other) OVERRIDE {
5905b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    HLoadContextSlot* b = HLoadContextSlot::cast(other);
59061e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return (slot_index() == b->slot_index());
5907b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  }
5908b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
5909b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch private:
5910b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool IsDeletable() const OVERRIDE { return !RequiresHoleCheck(); }
5911b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
59121e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  int slot_index_;
59133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Mode mode_;
59141e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block};
59151e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
59161e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
5917b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HStoreContextSlot FINAL : public HTemplateInstruction<2> {
59181e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public:
59193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  enum Mode {
59203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // Perform a normal store to the context slot without checking its previous
59213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // value.
59223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    kNoCheck,
59233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // Check the previous value of the context slot and deoptimize if it's the
59243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // hole value. This is used for checking for assignments to uninitialized
59253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // harmony bindings where we deoptimize into full-codegen generated code
59263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // which will subsequently throw a reference error.
59273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    kCheckDeoptimize,
59283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // Check the previous value and ignore assignment if it isn't a hole value
59293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    kCheckIgnoreAssignment
59303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  };
59313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5932b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P4(HStoreContextSlot, HValue*, int,
5933b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                 Mode, HValue*);
59341e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
5935b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* context() const { return OperandAt(0); }
5936b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* value() const { return OperandAt(1); }
59371e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  int slot_index() const { return slot_index_; }
59383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Mode mode() const { return mode_; }
59391e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
5940e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  bool NeedsWriteBarrier() {
59411e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return StoringValueNeedsWriteBarrier(value());
59421e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
59431e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
59443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool DeoptimizesOnHole() {
59453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return mode_ == kCheckDeoptimize;
59463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
59473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
59483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool RequiresHoleCheck() {
59493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return mode_ != kNoCheck;
59503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
59513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5952b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
59531e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return Representation::Tagged();
59541e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
59551e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
5956b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual OStream& PrintDataTo(OStream& os) const OVERRIDE;  // NOLINT
59571e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
5958257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(StoreContextSlot)
59591e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
59601e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block private:
5961b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HStoreContextSlot(HValue* context, int slot_index, Mode mode, HValue* value)
5962b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : slot_index_(slot_index), mode_(mode) {
5963b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(0, context);
5964b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(1, value);
5965b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetChangesFlag(kContextSlots);
5966b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
5967b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5968b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  int slot_index_;
59693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Mode mode_;
5970b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch};
5971b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
5972b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
5973b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Represents an access to a portion of an object, such as the map pointer,
5974b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// array elements pointer, etc, but not accesses to array elements themselves.
5975b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HObjectAccess FINAL {
5976b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
5977b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  inline bool IsInobject() const {
5978b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return portion() != kBackingStore && portion() != kExternalMemory;
5979b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
5980b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5981b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  inline bool IsExternalMemory() const {
5982b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return portion() == kExternalMemory;
5983b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
5984b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5985b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  inline bool IsStringLength() const {
5986b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return portion() == kStringLengths;
5987b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
5988b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5989b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  inline bool IsMap() const {
5990b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return portion() == kMaps;
599144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
599244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
5993b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  inline int offset() const {
5994b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return OffsetField::decode(value_);
5995b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
599669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
5997b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  inline Representation representation() const {
5998b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return Representation::FromKind(RepresentationField::decode(value_));
5999b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
600044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
6001b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  inline Handle<String> name() const {
6002b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return name_;
6003b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
600444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
6005b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  inline bool immutable() const {
6006b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return ImmutableField::decode(value_);
6007b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
600844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
6009b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Returns true if access is being made to an in-object property that
6010b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // was already added to the object.
6011b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  inline bool existing_inobject_property() const {
6012b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return ExistingInobjectPropertyField::decode(value_);
6013b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
601444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
6015b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  inline HObjectAccess WithRepresentation(Representation representation) {
6016b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return HObjectAccess(portion(), offset(), representation, name(),
6017b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                         immutable(), existing_inobject_property());
6018b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
601944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
6020b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HObjectAccess ForHeapNumberValue() {
6021b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return HObjectAccess(
6022b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        kDouble, HeapNumber::kValueOffset, Representation::Double());
6023b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
602444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
6025b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HObjectAccess ForHeapNumberValueLowestBits() {
6026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return HObjectAccess(kDouble,
6027b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                         HeapNumber::kValueOffset,
6028b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                         Representation::Integer32());
6029b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
6030b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
6031b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HObjectAccess ForHeapNumberValueHighestBits() {
6032b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return HObjectAccess(kDouble,
6033b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                         HeapNumber::kValueOffset + kIntSize,
6034b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                         Representation::Integer32());
6035b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
6036b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
6037b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HObjectAccess ForElementsPointer() {
6038b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return HObjectAccess(kElementsPointer, JSObject::kElementsOffset);
6039b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
6040b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
6041b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HObjectAccess ForLiteralsPointer() {
6042b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return HObjectAccess(kInobject, JSFunction::kLiteralsOffset);
6043b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
604469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
6045b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HObjectAccess ForNextFunctionLinkPointer() {
6046b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return HObjectAccess(kInobject, JSFunction::kNextFunctionLinkOffset);
6047b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
6048b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
6049b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HObjectAccess ForArrayLength(ElementsKind elements_kind) {
6050b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return HObjectAccess(
6051b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        kArrayLengths,
6052b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        JSArray::kLengthOffset,
6053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        IsFastElementsKind(elements_kind)
6054b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            ? Representation::Smi() : Representation::Tagged());
6055b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
6056b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
6057b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HObjectAccess ForAllocationSiteOffset(int offset);
6058b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
6059b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HObjectAccess ForAllocationSiteList() {
6060b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return HObjectAccess(kExternalMemory, 0, Representation::Tagged(),
6061b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                         Handle<String>::null(), false, false);
60629fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block  }
60639fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block
6064b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HObjectAccess ForFixedArrayLength() {
6065b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return HObjectAccess(
6066b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        kArrayLengths,
6067b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        FixedArray::kLengthOffset,
6068b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        Representation::Smi());
6069b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
60709fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block
6071b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HObjectAccess ForStringHashField() {
6072b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return HObjectAccess(kInobject,
6073b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                         String::kHashFieldOffset,
6074b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                         Representation::Integer32());
60759fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block  }
60769fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block
6077b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HObjectAccess ForStringLength() {
6078b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    STATIC_ASSERT(String::kMaxLength <= Smi::kMaxValue);
6079b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return HObjectAccess(
6080b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        kStringLengths,
6081b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        String::kLengthOffset,
6082b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        Representation::Smi());
6083b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
60849fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block
6085b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HObjectAccess ForConsStringFirst() {
6086b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return HObjectAccess(kInobject, ConsString::kFirstOffset);
6087b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
60889fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block
6089b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HObjectAccess ForConsStringSecond() {
6090b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return HObjectAccess(kInobject, ConsString::kSecondOffset);
6091b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
60929fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block
6093b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HObjectAccess ForPropertiesPointer() {
6094b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return HObjectAccess(kInobject, JSObject::kPropertiesOffset);
6095b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
60963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
6097b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HObjectAccess ForPrototypeOrInitialMap() {
6098b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return HObjectAccess(kInobject, JSFunction::kPrototypeOrInitialMapOffset);
6099b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
6100b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
6101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HObjectAccess ForSharedFunctionInfoPointer() {
6102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return HObjectAccess(kInobject, JSFunction::kSharedFunctionInfoOffset);
6103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
6104e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
6105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HObjectAccess ForCodeEntryPointer() {
6106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return HObjectAccess(kInobject, JSFunction::kCodeEntryOffset);
6107b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
6108b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
6109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HObjectAccess ForCodeOffset() {
6110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return HObjectAccess(kInobject, SharedFunctionInfo::kCodeOffset);
6111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
6112e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
6113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HObjectAccess ForOptimizedCodeMap() {
6114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return HObjectAccess(kInobject,
6115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                         SharedFunctionInfo::kOptimizedCodeMapOffset);
6116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
6117257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
6118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HObjectAccess ForFunctionContextPointer() {
6119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return HObjectAccess(kInobject, JSFunction::kContextOffset);
6120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
61211e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
6122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HObjectAccess ForMap() {
6123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return HObjectAccess(kMaps, JSObject::kMapOffset);
61243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
61253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
6126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HObjectAccess ForMapAsInteger32() {
6127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return HObjectAccess(kMaps, JSObject::kMapOffset,
6128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                         Representation::Integer32());
6129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
61301e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
6131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HObjectAccess ForMapInObjectProperties() {
6132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return HObjectAccess(kInobject,
6133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                         Map::kInObjectPropertiesOffset,
6134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                         Representation::UInteger8());
6135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
61361e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
6137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HObjectAccess ForMapInstanceType() {
6138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return HObjectAccess(kInobject,
6139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                         Map::kInstanceTypeOffset,
6140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                         Representation::UInteger8());
61413fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
61423fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
6143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HObjectAccess ForMapInstanceSize() {
6144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return HObjectAccess(kInobject,
6145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                         Map::kInstanceSizeOffset,
6146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                         Representation::UInteger8());
6147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
61483fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
6149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HObjectAccess ForMapBitField() {
6150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return HObjectAccess(kInobject,
6151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                         Map::kBitFieldOffset,
6152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                         Representation::UInteger8());
61533fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
61543fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
6155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HObjectAccess ForMapBitField2() {
6156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return HObjectAccess(kInobject,
6157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                         Map::kBitField2Offset,
6158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                         Representation::UInteger8());
6159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
61603fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
6161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HObjectAccess ForNameHashField() {
6162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return HObjectAccess(kInobject,
6163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                         Name::kHashFieldOffset,
6164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                         Representation::Integer32());
6165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
61663fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
6167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HObjectAccess ForMapInstanceTypeAndBitField() {
6168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    STATIC_ASSERT((Map::kInstanceTypeAndBitFieldOffset & 1) == 0);
6169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // Ensure the two fields share one 16-bit word, endian-independent.
6170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    STATIC_ASSERT((Map::kBitFieldOffset & ~1) ==
6171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                  (Map::kInstanceTypeOffset & ~1));
6172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return HObjectAccess(kInobject,
6173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                         Map::kInstanceTypeAndBitFieldOffset,
6174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                         Representation::UInteger16());
6175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
61763fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
6177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HObjectAccess ForPropertyCellValue() {
6178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return HObjectAccess(kInobject, PropertyCell::kValueOffset);
6179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
61803fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
6181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HObjectAccess ForCellValue() {
6182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return HObjectAccess(kInobject, Cell::kValueOffset);
61831e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
61841e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
6185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HObjectAccess ForAllocationMementoSite() {
6186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return HObjectAccess(kInobject, AllocationMemento::kAllocationSiteOffset);
6187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
61881e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
6189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HObjectAccess ForCounter() {
6190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return HObjectAccess(kExternalMemory, 0, Representation::Integer32(),
6191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                         Handle<String>::null(), false, false);
61921e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
61931e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
6194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HObjectAccess ForExternalUInteger8() {
6195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return HObjectAccess(kExternalMemory, 0, Representation::UInteger8(),
6196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                         Handle<String>::null(), false, false);
6197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
61981e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
6199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Create an access to an offset in a fixed array header.
6200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HObjectAccess ForFixedArrayHeader(int offset);
62013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
6202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Create an access to an in-object property in a JSObject.
6203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // This kind of access must be used when the object |map| is known and
6204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // in-object properties are being accessed. Accesses of the in-object
6205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // properties can have different semantics depending on whether corresponding
6206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // property was added to the map or not.
6207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HObjectAccess ForMapAndOffset(Handle<Map> map, int offset,
6208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Representation representation = Representation::Tagged());
62091e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
6210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Create an access to an in-object property in a JSObject.
6211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // This kind of access can be used for accessing object header fields or
6212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // in-object properties if the map of the object is not known.
6213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HObjectAccess ForObservableJSObjectOffset(int offset,
6214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Representation representation = Representation::Tagged()) {
6215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return ForMapAndOffset(Handle<Map>::null(), offset, representation);
621644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
621744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
6218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Create an access to an in-object property in a JSArray.
6219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HObjectAccess ForJSArrayOffset(int offset);
6220b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
6221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HObjectAccess ForContextSlot(int index);
6222b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
6223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Create an access to the backing store of an object.
6224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HObjectAccess ForBackingStoreOffset(int offset,
6225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Representation representation = Representation::Tagged());
62261e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
6227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Create an access to a resolved field (in-object or backing store).
6228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HObjectAccess ForField(Handle<Map> map, int index,
6229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                Representation representation,
6230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                Handle<String> name);
62319fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block
6232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Create an access for the payload of a Cell or JSGlobalPropertyCell.
6233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HObjectAccess ForCellPayload(Isolate* isolate);
6234b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
6235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HObjectAccess ForJSTypedArrayLength() {
6236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return HObjectAccess::ForObservableJSObjectOffset(
6237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        JSTypedArray::kLengthOffset);
6238b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
6239b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
6240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HObjectAccess ForJSArrayBufferBackingStore() {
6241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return HObjectAccess::ForObservableJSObjectOffset(
6242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        JSArrayBuffer::kBackingStoreOffset, Representation::External());
6243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
62443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
6245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HObjectAccess ForJSArrayBufferByteLength() {
6246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return HObjectAccess::ForObservableJSObjectOffset(
6247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        JSArrayBuffer::kByteLengthOffset, Representation::Tagged());
6248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
6249b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
6250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HObjectAccess ForExternalArrayExternalPointer() {
6251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return HObjectAccess::ForObservableJSObjectOffset(
6252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        ExternalArray::kExternalPointerOffset, Representation::External());
6253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
6254b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
6255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HObjectAccess ForJSArrayBufferViewWeakNext() {
6256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return HObjectAccess::ForObservableJSObjectOffset(
6257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        JSArrayBufferView::kWeakNextOffset);
6258b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
6259b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
6260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HObjectAccess ForJSArrayBufferWeakFirstView() {
6261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return HObjectAccess::ForObservableJSObjectOffset(
6262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        JSArrayBuffer::kWeakFirstViewOffset);
6263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
6264b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
6265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HObjectAccess ForJSArrayBufferViewBuffer() {
6266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return HObjectAccess::ForObservableJSObjectOffset(
6267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        JSArrayBufferView::kBufferOffset);
6268b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
6269e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
6270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HObjectAccess ForJSArrayBufferViewByteOffset() {
6271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return HObjectAccess::ForObservableJSObjectOffset(
6272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        JSArrayBufferView::kByteOffsetOffset);
6273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
6274b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
6275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HObjectAccess ForJSArrayBufferViewByteLength() {
6276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return HObjectAccess::ForObservableJSObjectOffset(
6277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        JSArrayBufferView::kByteLengthOffset);
6278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
6279b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
6280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HObjectAccess ForGlobalObjectNativeContext() {
6281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return HObjectAccess(kInobject, GlobalObject::kNativeContextOffset);
62821e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
62831e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
6284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  inline bool Equals(HObjectAccess that) const {
6285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return value_ == that.value_;  // portion and offset must match
6286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
6287b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
6288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected:
6289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void SetGVNFlags(HValue *instr, PropertyAccessType access_type);
6290b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
6291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
6292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // internal use only; different parts of an object or array
6293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  enum Portion {
6294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    kMaps,             // map of an object
6295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    kArrayLengths,     // the length of an array
6296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    kStringLengths,    // the length of a string
6297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    kElementsPointer,  // elements pointer
6298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    kBackingStore,     // some field in the backing store
6299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    kDouble,           // some double field
6300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    kInobject,         // some other in-object field
6301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    kExternalMemory    // some field in external memory
6302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  };
63031e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
6304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HObjectAccess() : value_(0) {}
6305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HObjectAccess(Portion portion, int offset,
6307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                Representation representation = Representation::Tagged(),
6308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                Handle<String> name = Handle<String>::null(),
6309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                bool immutable = false,
6310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                bool existing_inobject_property = true)
6311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    : value_(PortionField::encode(portion) |
6312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch             RepresentationField::encode(representation.kind()) |
6313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch             ImmutableField::encode(immutable ? 1 : 0) |
6314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch             ExistingInobjectPropertyField::encode(
6315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                 existing_inobject_property ? 1 : 0) |
6316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch             OffsetField::encode(offset)),
6317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      name_(name) {
6318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // assert that the fields decode correctly
6319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(this->offset() == offset);
6320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(this->portion() == portion);
6321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(this->immutable() == immutable);
6322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(this->existing_inobject_property() == existing_inobject_property);
6323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(RepresentationField::decode(value_) == representation.kind());
6324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(!this->existing_inobject_property() || IsInobject());
6325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
6326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  class PortionField : public BitField<Portion, 0, 3> {};
6328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  class RepresentationField : public BitField<Representation::Kind, 3, 4> {};
6329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  class ImmutableField : public BitField<bool, 7, 1> {};
6330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  class ExistingInobjectPropertyField : public BitField<bool, 8, 1> {};
6331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  class OffsetField : public BitField<int, 9, 23> {};
6332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  uint32_t value_;  // encodes portion, representation, immutable, and offset
6334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<String> name_;
63351e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
6336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  friend class HLoadNamedField;
6337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  friend class HStoreNamedField;
6338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  friend class SideEffectsTracker;
6339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  friend OStream& operator<<(OStream& os, const HObjectAccess& access);
63401e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
6341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  inline Portion portion() const {
6342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return PortionField::decode(value_);
6343b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
6344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
6345b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
63461e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
6347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochOStream& operator<<(OStream& os, const HObjectAccess& access);
6348b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
6349b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
6350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HLoadNamedField FINAL : public HTemplateInstruction<2> {
6351b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
6352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P3(HLoadNamedField, HValue*,
6353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                 HValue*, HObjectAccess);
6354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P5(HLoadNamedField, HValue*, HValue*,
6355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                 HObjectAccess, const UniqueSet<Map>*, HType);
6356b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
6357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* object() const { return OperandAt(0); }
6358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* dependency() const {
6359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(HasDependency());
6360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return OperandAt(1);
6361b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
6362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool HasDependency() const { return OperandAt(0) != OperandAt(1); }
6363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HObjectAccess access() const { return access_; }
6364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Representation field_representation() const {
6365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return access_.representation();
63663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
6367b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
6368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const UniqueSet<Map>* maps() const { return maps_; }
6369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool HasEscapingOperandAt(int index) OVERRIDE { return false; }
6371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool HasOutOfBoundsAccess(int size) OVERRIDE {
6372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return !access().IsInobject() || access().offset() >= size;
6373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
6374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
6375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (index == 0 && access().IsExternalMemory()) {
6376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      // object must be external in case of external memory access
6377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return Representation::External();
63783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
6379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return Representation::Tagged();
6380592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch  }
6381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Range* InferRange(Zone* zone) OVERRIDE;
6382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual OStream& PrintDataTo(OStream& os) const OVERRIDE;  // NOLINT
6383592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
6384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool CanBeReplacedWith(HValue* other) const {
6385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (!CheckFlag(HValue::kCantBeReplaced)) return false;
6386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (!type().Equals(other->type())) return false;
6387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (!representation().Equals(other->representation())) return false;
6388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (!other->IsLoadNamedField()) return true;
6389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HLoadNamedField* that = HLoadNamedField::cast(other);
6390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (this->maps_ == that->maps_) return true;
6391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (this->maps_ == NULL || that->maps_ == NULL) return false;
6392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return this->maps_->IsSubset(that->maps_);
6393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
6394b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
6395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(LoadNamedField)
6396b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
6397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected:
6398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool DataEquals(HValue* other) OVERRIDE {
6399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HLoadNamedField* that = HLoadNamedField::cast(other);
6400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (!this->access_.Equals(that->access_)) return false;
6401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (this->maps_ == that->maps_) return true;
6402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return (this->maps_ != NULL &&
6403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            that->maps_ != NULL &&
6404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            this->maps_->Equals(that->maps_));
64053fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
64063fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
6407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
6408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HLoadNamedField(HValue* object,
6409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                  HValue* dependency,
6410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                  HObjectAccess access)
6411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : access_(access), maps_(NULL) {
6412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK_NOT_NULL(object);
6413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(0, object);
6414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(1, dependency ? dependency : object);
6415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Representation representation = access.representation();
6417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (representation.IsInteger8() ||
6418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        representation.IsUInteger8() ||
6419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        representation.IsInteger16() ||
6420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        representation.IsUInteger16()) {
6421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      set_representation(Representation::Integer32());
6422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else if (representation.IsSmi()) {
6423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      set_type(HType::Smi());
6424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (SmiValuesAre32Bits()) {
6425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        set_representation(Representation::Integer32());
6426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      } else {
6427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        set_representation(representation);
6428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
6429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else if (representation.IsDouble() ||
6430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch               representation.IsExternal() ||
6431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch               representation.IsInteger32()) {
6432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      set_representation(representation);
6433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else if (representation.IsHeapObject()) {
6434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      set_type(HType::HeapObject());
6435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      set_representation(Representation::Tagged());
64363fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    } else {
6437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      set_representation(Representation::Tagged());
64383fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    }
6439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    access.SetGVNFlags(this, LOAD);
64403fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
64413fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
6442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HLoadNamedField(HValue* object,
6443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                  HValue* dependency,
6444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                  HObjectAccess access,
6445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                  const UniqueSet<Map>* maps,
6446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                  HType type)
6447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : HTemplateInstruction<2>(type), access_(access), maps_(maps) {
6448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK_NOT_NULL(maps);
6449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK_NE(0, maps->size());
64503fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
6451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK_NOT_NULL(object);
6452b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(0, object);
6453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(1, dependency ? dependency : object);
6454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(access.representation().IsHeapObject());
6456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(type.IsHeapObject());
6457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    set_representation(Representation::Tagged());
6458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    access.SetGVNFlags(this, LOAD);
64603fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
64613fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
6462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool IsDeletable() const OVERRIDE { return true; }
64633fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
6464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HObjectAccess access_;
6465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const UniqueSet<Map>* maps_;
64663fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch};
64673fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
64683fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
6469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HLoadNamedGeneric FINAL : public HTemplateInstruction<2> {
6470b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
6471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P2(HLoadNamedGeneric, HValue*,
6472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                              Handle<Object>);
6473b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
6474b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* context() const { return OperandAt(0); }
6475b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* object() const { return OperandAt(1); }
6476b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Object> name() const { return name_; }
6477e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
6478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int slot() const {
6479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(FLAG_vector_ics &&
6480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch           slot_ != FeedbackSlotInterface::kInvalidFeedbackSlot);
6481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return slot_;
6482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
6483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<FixedArray> feedback_vector() const { return feedback_vector_; }
6484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void SetVectorAndSlot(Handle<FixedArray> vector, int slot) {
6485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(FLAG_vector_ics);
6486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    feedback_vector_ = vector;
6487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    slot_ = slot;
6488b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
6489b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
6490b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
6491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return Representation::Tagged();
6492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
6493e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
6494b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual OStream& PrintDataTo(OStream& os) const OVERRIDE;  // NOLINT
6495257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
6496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(LoadNamedGeneric)
6497b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
6498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
6499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HLoadNamedGeneric(HValue* context, HValue* object, Handle<Object> name)
6500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : name_(name),
6501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        slot_(FeedbackSlotInterface::kInvalidFeedbackSlot) {
6502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(0, context);
6503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(1, object);
6504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    set_representation(Representation::Tagged());
65051e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetAllSideEffects();
65061e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
65071e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
6508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Object> name_;
6509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<FixedArray> feedback_vector_;
6510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int slot_;
6511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
65121e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
6513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HLoadFunctionPrototype FINAL : public HUnaryOperation {
6515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
6516b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P1(HLoadFunctionPrototype, HValue*);
6517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* function() { return OperandAt(0); }
6519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
6521e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::Tagged();
6522b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
6523b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
6524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(LoadFunctionPrototype)
65251e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
6526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected:
6527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool DataEquals(HValue* other) OVERRIDE { return true; }
65288b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
65298b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch private:
6530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit HLoadFunctionPrototype(HValue* function)
6531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : HUnaryOperation(function) {
6532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    set_representation(Representation::Tagged());
6533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetFlag(kUseGVN);
6534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetDependsOnFlag(kCalls);
6535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
6536b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
6537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass ArrayInstructionInterface {
6539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
6540b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual HValue* GetKey() = 0;
6541b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual void SetKey(HValue* key) = 0;
6542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual ElementsKind elements_kind() const = 0;
6543b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // TryIncreaseBaseOffset returns false if overflow would result.
6544b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool TryIncreaseBaseOffset(uint32_t increase_by_value) = 0;
6545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool IsDehoisted() const = 0;
6546b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual void SetDehoisted(bool is_dehoisted) = 0;
6547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual ~ArrayInstructionInterface() { }
6548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static Representation KeyedAccessIndexRequirement(Representation r) {
6550b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return r.IsInteger32() || SmiValuesAre32Bits()
6551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        ? Representation::Integer32() : Representation::Smi();
6552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
65533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
65543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
65553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
6556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic const int kDefaultKeyedHeaderOffsetSentinel = -1;
6557b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6558b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum LoadKeyedHoleMode {
6559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  NEVER_RETURN_HOLE,
6560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ALLOW_RETURN_HOLE
6561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
6562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HLoadKeyed FINAL
6565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    : public HTemplateInstruction<3>, public ArrayInstructionInterface {
65663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
6567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P4(HLoadKeyed, HValue*, HValue*, HValue*,
6568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                 ElementsKind);
6569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P5(HLoadKeyed, HValue*, HValue*, HValue*,
6570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                 ElementsKind, LoadKeyedHoleMode);
6571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P6(HLoadKeyed, HValue*, HValue*, HValue*,
6572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                 ElementsKind, LoadKeyedHoleMode, int);
6573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool is_external() const {
6575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return IsExternalArrayElementsKind(elements_kind());
6576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
6577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool is_fixed_typed_array() const {
6578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return IsFixedTypedArrayElementsKind(elements_kind());
6579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
6580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool is_typed_elements() const {
6581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return is_external() || is_fixed_typed_array();
6582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
6583b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* elements() const { return OperandAt(0); }
6584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* key() const { return OperandAt(1); }
6585b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* dependency() const {
6586b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(HasDependency());
6587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return OperandAt(2);
6588b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
6589b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool HasDependency() const { return OperandAt(0) != OperandAt(2); }
6590b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  uint32_t base_offset() const { return BaseOffsetField::decode(bit_field_); }
6591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool TryIncreaseBaseOffset(uint32_t increase_by_value);
6592b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* GetKey() { return key(); }
6593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void SetKey(HValue* key) { SetOperandAt(1, key); }
6594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool IsDehoisted() const { return IsDehoistedField::decode(bit_field_); }
6595b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void SetDehoisted(bool is_dehoisted) {
6596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bit_field_ = IsDehoistedField::update(bit_field_, is_dehoisted);
6597b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
6598b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual ElementsKind elements_kind() const OVERRIDE {
6599b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return ElementsKindField::decode(bit_field_);
6600b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
6601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LoadKeyedHoleMode hole_mode() const {
6602b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return HoleModeField::decode(bit_field_);
66033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
66043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
6605b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
6606b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // kind_fast:                 tagged[int32] (none)
6607b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // kind_double:               tagged[int32] (none)
6608b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // kind_fixed_typed_array:    tagged[int32] (none)
6609b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // kind_external:             external[int32] (none)
6610b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (index == 0) {
6611b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return is_external() ? Representation::External()
6612b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          : Representation::Tagged();
6613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
6614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (index == 1) {
6615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return ArrayInstructionInterface::KeyedAccessIndexRequirement(
6616b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          OperandAt(1)->representation());
6617b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
6618b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return Representation::None();
66193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
66203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
6621b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation observed_input_representation(int index) OVERRIDE {
6622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return RequiredInputRepresentation(index);
6623b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
66243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
6625b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual OStream& PrintDataTo(OStream& os) const OVERRIDE;  // NOLINT
66263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
6627b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool UsesMustHandleHole() const;
6628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool AllUsesCanTreatHoleAsNaN() const;
6629b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool RequiresHoleCheck() const;
6630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6631b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Range* InferRange(Zone* zone) OVERRIDE;
6632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(LoadKeyed)
66343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
66353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch protected:
6636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool DataEquals(HValue* other) OVERRIDE {
6637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (!other->IsLoadKeyed()) return false;
6638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HLoadKeyed* other_load = HLoadKeyed::cast(other);
6639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (IsDehoisted() && base_offset() != other_load->base_offset())
6641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return false;
6642b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return elements_kind() == other_load->elements_kind();
66433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
66443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
66453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private:
6646b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HLoadKeyed(HValue* obj,
6647b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch             HValue* key,
6648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch             HValue* dependency,
6649b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch             ElementsKind elements_kind,
6650b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch             LoadKeyedHoleMode mode = NEVER_RETURN_HOLE,
6651b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch             int offset = kDefaultKeyedHeaderOffsetSentinel)
6652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : bit_field_(0) {
6653b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    offset = offset == kDefaultKeyedHeaderOffsetSentinel
6654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        ? GetDefaultHeaderSizeForElementsKind(elements_kind)
6655b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        : offset;
6656b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bit_field_ = ElementsKindField::encode(elements_kind) |
6657b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        HoleModeField::encode(mode) |
6658b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        BaseOffsetField::encode(offset);
66598b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
6660b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(0, obj);
6661b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(1, key);
6662b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(2, dependency != NULL ? dependency : obj);
6663b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (!is_typed_elements()) {
6665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      // I can detect the case between storing double (holey and fast) and
6666b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      // smi/object by looking at elements_kind_.
6667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      DCHECK(IsFastSmiOrObjectElementsKind(elements_kind) ||
6668b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch             IsFastDoubleElementsKind(elements_kind));
6669b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (IsFastSmiOrObjectElementsKind(elements_kind)) {
6671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        if (IsFastSmiElementsKind(elements_kind) &&
6672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            (!IsHoleyElementsKind(elements_kind) ||
6673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch             mode == NEVER_RETURN_HOLE)) {
6674b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          set_type(HType::Smi());
6675b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          if (SmiValuesAre32Bits() && !RequiresHoleCheck()) {
6676b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            set_representation(Representation::Integer32());
6677b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          } else {
6678b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            set_representation(Representation::Smi());
6679b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          }
6680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        } else {
6681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          set_representation(Representation::Tagged());
6682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        }
6683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        SetDependsOnFlag(kArrayElements);
6685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      } else {
6686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        set_representation(Representation::Double());
6687b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        SetDependsOnFlag(kDoubleArrayElements);
6688b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
6689b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else {
6690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (elements_kind == EXTERNAL_FLOAT32_ELEMENTS ||
6691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          elements_kind == EXTERNAL_FLOAT64_ELEMENTS ||
6692b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          elements_kind == FLOAT32_ELEMENTS ||
6693b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          elements_kind == FLOAT64_ELEMENTS) {
6694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        set_representation(Representation::Double());
6695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      } else {
6696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        set_representation(Representation::Integer32());
6697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
6698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (is_external()) {
6700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        SetDependsOnFlag(kExternalMemory);
6701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      } else if (is_fixed_typed_array()) {
6702b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        SetDependsOnFlag(kTypedArrayElements);
6703b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      } else {
6704b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        UNREACHABLE();
6705b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
6706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      // Native code could change the specialized array.
6707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      SetDependsOnFlag(kCalls);
6708b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
67098b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
6710257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    SetFlag(kUseGVN);
6711257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
6712257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
6713b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool IsDeletable() const OVERRIDE {
6714b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return !RequiresHoleCheck();
6715b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
6716b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6717b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Establish some checks around our packed fields
6718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  enum LoadKeyedBits {
6719b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    kBitsForElementsKind = 5,
6720b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    kBitsForHoleMode = 1,
6721b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    kBitsForBaseOffset = 25,
6722b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    kBitsForIsDehoisted = 1,
6723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6724b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    kStartElementsKind = 0,
6725b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    kStartHoleMode = kStartElementsKind + kBitsForElementsKind,
6726b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    kStartBaseOffset = kStartHoleMode + kBitsForHoleMode,
6727b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    kStartIsDehoisted = kStartBaseOffset + kBitsForBaseOffset
6728b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  };
6729b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6730b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  STATIC_ASSERT((kBitsForElementsKind + kBitsForBaseOffset +
6731b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                 kBitsForIsDehoisted) <= sizeof(uint32_t)*8);
6732b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  STATIC_ASSERT(kElementsKindCount <= (1 << kBitsForElementsKind));
6733b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  class ElementsKindField:
6734b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    public BitField<ElementsKind, kStartElementsKind, kBitsForElementsKind>
6735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {};  // NOLINT
6736b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  class HoleModeField:
6737b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    public BitField<LoadKeyedHoleMode, kStartHoleMode, kBitsForHoleMode>
6738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {};  // NOLINT
6739b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  class BaseOffsetField:
6740b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    public BitField<uint32_t, kStartBaseOffset, kBitsForBaseOffset>
6741b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {};  // NOLINT
6742b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  class IsDehoistedField:
6743b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    public BitField<bool, kStartIsDehoisted, kBitsForIsDehoisted>
6744b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {};  // NOLINT
6745b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  uint32_t bit_field_;
6746b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
6747b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6748b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6749b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HLoadKeyedGeneric FINAL : public HTemplateInstruction<3> {
6750b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
6751b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P2(HLoadKeyedGeneric, HValue*,
6752b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                              HValue*);
6753b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* object() const { return OperandAt(0); }
6754b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* key() const { return OperandAt(1); }
6755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* context() const { return OperandAt(2); }
6756b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int slot() const {
6757b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(FLAG_vector_ics &&
6758b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch           slot_ != FeedbackSlotInterface::kInvalidFeedbackSlot);
6759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return slot_;
6760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
6761b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<FixedArray> feedback_vector() const { return feedback_vector_; }
6762b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void SetVectorAndSlot(Handle<FixedArray> vector, int slot) {
6763b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(FLAG_vector_ics);
6764b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    feedback_vector_ = vector;
6765b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    slot_ = slot;
6766b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
6767b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6768b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual OStream& PrintDataTo(OStream& os) const OVERRIDE;  // NOLINT
6769b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6770b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
6771b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // tagged[tagged]
6772257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return Representation::Tagged();
6773257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
6774257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
6775b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual HValue* Canonicalize() OVERRIDE;
6776b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6777b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(LoadKeyedGeneric)
6778b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6779b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
6780b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HLoadKeyedGeneric(HValue* context, HValue* obj, HValue* key)
6781b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : slot_(FeedbackSlotInterface::kInvalidFeedbackSlot) {
6782b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    set_representation(Representation::Tagged());
6783b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(0, obj);
6784b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(1, key);
6785b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(2, context);
6786b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetAllSideEffects();
6787257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
6788257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
6789b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<FixedArray> feedback_vector_;
6790b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int slot_;
6791b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
6792257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
6793b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6794b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Indicates whether the store is a store to an entry that was previously
6795b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// initialized or not.
6796b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum StoreFieldOrKeyedMode {
6797b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // The entry could be either previously initialized or not.
6798b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  INITIALIZING_STORE,
6799b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // At the time of this store it is guaranteed that the entry is already
6800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // initialized.
6801b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  STORE_TO_INITIALIZED_ENTRY
6802257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
6803257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
6804257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
6805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HStoreNamedField FINAL : public HTemplateInstruction<3> {
68061e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public:
6807b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P3(HStoreNamedField, HValue*,
6808b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                 HObjectAccess, HValue*);
6809b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P4(HStoreNamedField, HValue*,
6810b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                 HObjectAccess, HValue*, StoreFieldOrKeyedMode);
6811b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(StoreNamedField)
6813b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6814b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool HasEscapingOperandAt(int index) OVERRIDE {
6815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return index == 1;
68161e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
6817b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool HasOutOfBoundsAccess(int size) OVERRIDE {
6818b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return !access().IsInobject() || access().offset() >= size;
6819b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
6820b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
6821b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (index == 0 && access().IsExternalMemory()) {
6822b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      // object must be external in case of external memory access
6823b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return Representation::External();
6824b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else if (index == 1) {
6825b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (field_representation().IsInteger8() ||
6826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          field_representation().IsUInteger8() ||
6827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          field_representation().IsInteger16() ||
6828b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          field_representation().IsUInteger16() ||
6829b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          field_representation().IsInteger32()) {
6830b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return Representation::Integer32();
6831b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      } else if (field_representation().IsDouble()) {
6832b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return field_representation();
6833b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      } else if (field_representation().IsSmi()) {
6834b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        if (SmiValuesAre32Bits() && store_mode_ == STORE_TO_INITIALIZED_ENTRY) {
6835b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          return Representation::Integer32();
6836b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        }
6837b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return field_representation();
6838b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      } else if (field_representation().IsExternal()) {
6839b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return Representation::External();
6840b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
6841b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
6842b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return Representation::Tagged();
6843b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
6844b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool HandleSideEffectDominator(GVNFlag side_effect,
6845b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                         HValue* dominator) OVERRIDE {
6846b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(side_effect == kNewSpacePromotion);
6847b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (!FLAG_use_write_barrier_elimination) return false;
6848b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    dominator_ = dominator;
6849b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return false;
6850b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
6851b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual OStream& PrintDataTo(OStream& os) const OVERRIDE;  // NOLINT
68521e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
6853b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* object() const { return OperandAt(0); }
6854b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* value() const { return OperandAt(1); }
6855b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* transition() const { return OperandAt(2); }
6856b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6857b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HObjectAccess access() const { return access_; }
6858b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* dominator() const { return dominator_; }
6859b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool has_transition() const { return has_transition_; }
6860b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  StoreFieldOrKeyedMode store_mode() const { return store_mode_; }
6861b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6862b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Map> transition_map() const {
6863b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (has_transition()) {
6864b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return Handle<Map>::cast(
6865b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          HConstant::cast(transition())->handle(Isolate::Current()));
6866b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else {
6867b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return Handle<Map>();
6868b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
68691e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
68701e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
6871b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void SetTransition(HConstant* transition) {
6872b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(!has_transition());  // Only set once.
6873b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(2, transition);
6874b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    has_transition_ = true;
6875b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetChangesFlag(kMaps);
6876b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
68771e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
6878b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool NeedsWriteBarrier() const {
6879b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(!field_representation().IsDouble() || !has_transition());
6880b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (field_representation().IsDouble()) return false;
6881b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (field_representation().IsSmi()) return false;
6882b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (field_representation().IsInteger32()) return false;
6883b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (field_representation().IsExternal()) return false;
6884b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return StoringValueNeedsWriteBarrier(value()) &&
6885b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        ReceiverObjectNeedsWriteBarrier(object(), value(), dominator());
6886b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
68871e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
6888b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool NeedsWriteBarrierForMap() {
6889b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return ReceiverObjectNeedsWriteBarrier(object(), transition(),
6890b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                           dominator());
6891b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
68921e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
6893b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SmiCheck SmiCheckForWriteBarrier() const {
6894b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (field_representation().IsHeapObject()) return OMIT_SMI_CHECK;
6895b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (value()->type().IsHeapObject()) return OMIT_SMI_CHECK;
6896b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return INLINE_SMI_CHECK;
6897b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
6898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6899b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  PointersToHereCheck PointersToHereCheckForValue() const {
6900b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return PointersToHereCheckForObject(value(), dominator());
6901b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
6902b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6903b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Representation field_representation() const {
6904b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return access_.representation();
6905b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
6906b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6907b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void UpdateValue(HValue* value) {
6908b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(1, value);
6909b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
6910b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6911b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool CanBeReplacedWith(HStoreNamedField* that) const {
6912b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (!this->access().Equals(that->access())) return false;
6913b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (SmiValuesAre32Bits() &&
6914b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        this->field_representation().IsSmi() &&
6915b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        this->store_mode() == INITIALIZING_STORE &&
6916b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        that->store_mode() == STORE_TO_INITIALIZED_ENTRY) {
6917b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      // We cannot replace an initializing store to a smi field with a store to
6918b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      // an initialized entry on 64-bit architectures (with 32-bit smis).
6919b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return false;
6920b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
6921b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return true;
69221e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
6923b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6924b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
6925b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HStoreNamedField(HValue* obj,
6926b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                   HObjectAccess access,
6927b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                   HValue* val,
6928b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                   StoreFieldOrKeyedMode store_mode = INITIALIZING_STORE)
6929b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : access_(access),
6930b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        dominator_(NULL),
6931b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        has_transition_(false),
6932b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        store_mode_(store_mode) {
6933b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // Stores to a non existing in-object property are allowed only to the
6934b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // newly allocated objects (via HAllocate or HInnerAllocatedObject).
6935b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(!access.IsInobject() || access.existing_inobject_property() ||
6936b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch           obj->IsAllocate() || obj->IsInnerAllocatedObject());
6937b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(0, obj);
6938b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(1, val);
6939b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(2, obj);
6940b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    access.SetGVNFlags(this, STORE);
6941b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
6942b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6943b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HObjectAccess access_;
6944b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* dominator_;
6945b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool has_transition_ : 1;
6946b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  StoreFieldOrKeyedMode store_mode_ : 1;
69471e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block};
69481e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
69491e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
6950b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HStoreNamedGeneric FINAL : public HTemplateInstruction<3> {
695144f0eee88ff00398ff7f715fab053374d808c90dSteve Block public:
6952b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P4(HStoreNamedGeneric, HValue*,
6953b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                              Handle<String>, HValue*,
6954b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                              StrictMode);
6955b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* object() const { return OperandAt(0); }
6956b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* value() const { return OperandAt(1); }
6957b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* context() const { return OperandAt(2); }
6958b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<String> name() const { return name_; }
6959b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  StrictMode strict_mode() const { return strict_mode_; }
696044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
6961b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual OStream& PrintDataTo(OStream& os) const OVERRIDE;  // NOLINT
6962b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6963b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
6964b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return Representation::Tagged();
696544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
696644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
6967b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(StoreNamedGeneric)
69683fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
6969b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
6970b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HStoreNamedGeneric(HValue* context,
6971b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                     HValue* object,
6972b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                     Handle<String> name,
6973b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                     HValue* value,
6974b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                     StrictMode strict_mode)
6975b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : name_(name),
6976b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        strict_mode_(strict_mode) {
6977b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(0, object);
6978b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(1, value);
6979b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(2, context);
6980b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetAllSideEffects();
6981b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
698244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
6983b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<String> name_;
6984b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  StrictMode strict_mode_;
698544f0eee88ff00398ff7f715fab053374d808c90dSteve Block};
698644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
698744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
6988b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HStoreKeyed FINAL
6989b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    : public HTemplateInstruction<3>, public ArrayInstructionInterface {
69901e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public:
6991b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P4(HStoreKeyed, HValue*, HValue*, HValue*,
6992b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                 ElementsKind);
6993b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P5(HStoreKeyed, HValue*, HValue*, HValue*,
6994b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                 ElementsKind, StoreFieldOrKeyedMode);
6995b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P6(HStoreKeyed, HValue*, HValue*, HValue*,
6996b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                 ElementsKind, StoreFieldOrKeyedMode, int);
6997b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6998b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
6999b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // kind_fast:               tagged[int32] = tagged
7000b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // kind_double:             tagged[int32] = double
7001b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // kind_smi   :             tagged[int32] = smi
7002b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // kind_fixed_typed_array:  tagged[int32] = (double | int32)
7003b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // kind_external:           external[int32] = (double | int32)
7004b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (index == 0) {
7005b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return is_external() ? Representation::External()
7006b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           : Representation::Tagged();
7007b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else if (index == 1) {
7008b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return ArrayInstructionInterface::KeyedAccessIndexRequirement(
7009b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          OperandAt(1)->representation());
7010b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
7011b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7012b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK_EQ(index, 2);
7013b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return RequiredValueRepresentation(elements_kind_, store_mode_);
70141e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
70151e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
7016b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static Representation RequiredValueRepresentation(
7017b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      ElementsKind kind, StoreFieldOrKeyedMode mode) {
7018b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (IsDoubleOrFloatElementsKind(kind)) {
7019b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return Representation::Double();
7020b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
7021b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7022b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (kind == FAST_SMI_ELEMENTS && SmiValuesAre32Bits() &&
7023b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        mode == STORE_TO_INITIALIZED_ENTRY) {
7024b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return Representation::Integer32();
7025b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
7026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7027b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (IsFastSmiElementsKind(kind)) {
7028b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return Representation::Smi();
7029b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
7030b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7031b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return IsExternalArrayElementsKind(kind) ||
7032b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                   IsFixedTypedArrayElementsKind(kind)
7033b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch               ? Representation::Integer32()
7034b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch               : Representation::Tagged();
7035b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
7036b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7037b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool is_external() const {
7038b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return IsExternalArrayElementsKind(elements_kind());
7039b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
7040b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7041b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool is_fixed_typed_array() const {
7042b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return IsFixedTypedArrayElementsKind(elements_kind());
7043b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
7044b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7045b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool is_typed_elements() const {
7046b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return is_external() || is_fixed_typed_array();
7047b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
7048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7049b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation observed_input_representation(int index) OVERRIDE {
7050b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (index < 2) return RequiredInputRepresentation(index);
7051b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (IsUninitialized()) {
7052b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return Representation::None();
7053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
7054b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Representation r = RequiredValueRepresentation(elements_kind_, store_mode_);
7055b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // For fast object elements kinds, don't assume anything.
7056b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (r.IsTagged()) return Representation::None();
7057b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return r;
7058b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
7059b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7060b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* elements() const { return OperandAt(0); }
7061b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* key() const { return OperandAt(1); }
7062b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* value() const { return OperandAt(2); }
7063b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool value_is_smi() const {
7064b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return IsFastSmiElementsKind(elements_kind_);
7065b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
7066b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  StoreFieldOrKeyedMode store_mode() const { return store_mode_; }
7067b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ElementsKind elements_kind() const { return elements_kind_; }
7068b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  uint32_t base_offset() const { return base_offset_; }
7069b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool TryIncreaseBaseOffset(uint32_t increase_by_value);
7070b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* GetKey() { return key(); }
7071b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void SetKey(HValue* key) { SetOperandAt(1, key); }
7072b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool IsDehoisted() const { return is_dehoisted_; }
7073b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void SetDehoisted(bool is_dehoisted) { is_dehoisted_ = is_dehoisted; }
7074b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool IsUninitialized() { return is_uninitialized_; }
7075b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void SetUninitialized(bool is_uninitialized) {
7076b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    is_uninitialized_ = is_uninitialized;
7077b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
7078b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7079b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool IsConstantHoleStore() {
7080b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return value()->IsConstant() && HConstant::cast(value())->IsTheHole();
7081b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
7082b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7083b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool HandleSideEffectDominator(GVNFlag side_effect,
7084b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                         HValue* dominator) OVERRIDE {
7085b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(side_effect == kNewSpacePromotion);
7086b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    dominator_ = dominator;
7087b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return false;
7088b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
7089b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7090b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* dominator() const { return dominator_; }
7091b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7092b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool NeedsWriteBarrier() {
7093b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (value_is_smi()) {
7094b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return false;
7095b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else {
7096b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return StoringValueNeedsWriteBarrier(value()) &&
7097b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          ReceiverObjectNeedsWriteBarrier(elements(), value(), dominator());
7098b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
7099b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
7100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  PointersToHereCheck PointersToHereCheckForValue() const {
7102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return PointersToHereCheckForObject(value(), dominator());
7103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
7104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool NeedsCanonicalization();
7106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual OStream& PrintDataTo(OStream& os) const OVERRIDE;  // NOLINT
7108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(StoreKeyed)
7110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
7112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HStoreKeyed(HValue* obj, HValue* key, HValue* val,
7113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch              ElementsKind elements_kind,
7114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch              StoreFieldOrKeyedMode store_mode = INITIALIZING_STORE,
7115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch              int offset = kDefaultKeyedHeaderOffsetSentinel)
7116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : elements_kind_(elements_kind),
7117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      base_offset_(offset == kDefaultKeyedHeaderOffsetSentinel
7118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          ? GetDefaultHeaderSizeForElementsKind(elements_kind)
7119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          : offset),
7120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      is_dehoisted_(false),
7121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      is_uninitialized_(false),
7122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      store_mode_(store_mode),
7123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      dominator_(NULL) {
7124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(0, obj);
7125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(1, key);
7126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(2, val);
7127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (IsFastObjectElementsKind(elements_kind)) {
7129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      SetFlag(kTrackSideEffectDominators);
7130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      SetDependsOnFlag(kNewSpacePromotion);
7131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
7132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (is_external()) {
7133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      SetChangesFlag(kExternalMemory);
7134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      SetFlag(kAllowUndefinedAsNaN);
7135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else if (IsFastDoubleElementsKind(elements_kind)) {
7136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      SetChangesFlag(kDoubleArrayElements);
7137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else if (IsFastSmiElementsKind(elements_kind)) {
7138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      SetChangesFlag(kArrayElements);
7139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else if (is_fixed_typed_array()) {
7140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      SetChangesFlag(kTypedArrayElements);
7141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      SetFlag(kAllowUndefinedAsNaN);
7142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else {
7143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      SetChangesFlag(kArrayElements);
7144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
7145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // EXTERNAL_{UNSIGNED_,}{BYTE,SHORT,INT}_ELEMENTS are truncating.
7147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if ((elements_kind >= EXTERNAL_INT8_ELEMENTS &&
7148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        elements_kind <= EXTERNAL_UINT32_ELEMENTS) ||
7149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        (elements_kind >= UINT8_ELEMENTS &&
7150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        elements_kind <= INT32_ELEMENTS)) {
7151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      SetFlag(kTruncatingToInt32);
7152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
7153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
7154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ElementsKind elements_kind_;
7156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  uint32_t base_offset_;
7157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool is_dehoisted_ : 1;
7158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool is_uninitialized_ : 1;
7159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  StoreFieldOrKeyedMode store_mode_: 1;
7160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* dominator_;
7161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
7162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HStoreKeyedGeneric FINAL : public HTemplateInstruction<4> {
7165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
7166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P4(HStoreKeyedGeneric, HValue*,
7167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                              HValue*, HValue*, StrictMode);
7168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* object() const { return OperandAt(0); }
7170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* key() const { return OperandAt(1); }
7171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* value() const { return OperandAt(2); }
7172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* context() const { return OperandAt(3); }
7173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  StrictMode strict_mode() const { return strict_mode_; }
7174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
7176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // tagged[tagged] = tagged
71771e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return Representation::Tagged();
71781e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
71791e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
7180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual OStream& PrintDataTo(OStream& os) const OVERRIDE;  // NOLINT
7181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(StoreKeyedGeneric)
7183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
7185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HStoreKeyedGeneric(HValue* context,
7186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                     HValue* object,
7187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                     HValue* key,
7188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                     HValue* value,
7189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                     StrictMode strict_mode)
7190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : strict_mode_(strict_mode) {
7191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(0, object);
7192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(1, key);
7193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(2, value);
7194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(3, context);
7195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetAllSideEffects();
71961e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
71971e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
7198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  StrictMode strict_mode_;
7199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
7200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HTransitionElementsKind FINAL : public HTemplateInstruction<2> {
7203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
7204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  inline static HTransitionElementsKind* New(Zone* zone,
7205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                             HValue* context,
7206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                             HValue* object,
7207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                             Handle<Map> original_map,
7208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                             Handle<Map> transitioned_map) {
7209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return new(zone) HTransitionElementsKind(context, object,
7210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                             original_map, transitioned_map);
7211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
7212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
7214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return Representation::Tagged();
7215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
7216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* object() const { return OperandAt(0); }
7218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* context() const { return OperandAt(1); }
7219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Unique<Map> original_map() const { return original_map_; }
7220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Unique<Map> transitioned_map() const { return transitioned_map_; }
7221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ElementsKind from_kind() const { return from_kind_; }
7222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ElementsKind to_kind() const { return to_kind_; }
7223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual OStream& PrintDataTo(OStream& os) const OVERRIDE;  // NOLINT
7225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(TransitionElementsKind)
72271e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
72281e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected:
7229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool DataEquals(HValue* other) OVERRIDE {
7230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HTransitionElementsKind* instr = HTransitionElementsKind::cast(other);
7231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return original_map_ == instr->original_map_ &&
7232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch           transitioned_map_ == instr->transitioned_map_;
7233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
7234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual int RedefinedOperandIndex() { return 0; }
72361e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
7237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
7238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HTransitionElementsKind(HValue* context,
7239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                          HValue* object,
7240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                          Handle<Map> original_map,
7241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                          Handle<Map> transitioned_map)
7242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : original_map_(Unique<Map>(original_map)),
7243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        transitioned_map_(Unique<Map>(transitioned_map)),
7244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        from_kind_(original_map->elements_kind()),
7245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        to_kind_(transitioned_map->elements_kind()) {
7246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(0, object);
7247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(1, context);
7248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetFlag(kUseGVN);
7249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetChangesFlag(kElementsKind);
7250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (!IsSimpleMapChangeTransition(from_kind_, to_kind_)) {
7251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      SetChangesFlag(kElementsPointer);
7252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      SetChangesFlag(kNewSpacePromotion);
7253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
7254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    set_representation(Representation::Tagged());
72553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
7256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Unique<Map> original_map_;
7258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Unique<Map> transitioned_map_;
7259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ElementsKind from_kind_;
7260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ElementsKind to_kind_;
72613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
72623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
72633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HStringAdd FINAL : public HBinaryOperation {
72653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
7266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HInstruction* New(Zone* zone,
7267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           HValue* context,
7268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           HValue* left,
7269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           HValue* right,
7270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           PretenureFlag pretenure_flag = NOT_TENURED,
7271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           StringAddFlags flags = STRING_ADD_CHECK_BOTH,
7272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           Handle<AllocationSite> allocation_site =
7273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                               Handle<AllocationSite>::null());
7274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  StringAddFlags flags() const { return flags_; }
7276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  PretenureFlag pretenure_flag() const { return pretenure_flag_; }
7277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
7279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return Representation::Tagged();
7280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
7281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual OStream& PrintDataTo(OStream& os) const OVERRIDE;  // NOLINT
7283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(StringAdd)
7285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected:
7287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool DataEquals(HValue* other) OVERRIDE {
7288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return flags_ == HStringAdd::cast(other)->flags_ &&
7289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        pretenure_flag_ == HStringAdd::cast(other)->pretenure_flag_;
7290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
7291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
7293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HStringAdd(HValue* context,
7294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch             HValue* left,
7295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch             HValue* right,
7296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch             PretenureFlag pretenure_flag,
7297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch             StringAddFlags flags,
7298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch             Handle<AllocationSite> allocation_site)
7299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : HBinaryOperation(context, left, right, HType::String()),
7300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        flags_(flags), pretenure_flag_(pretenure_flag) {
73013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    set_representation(Representation::Tagged());
7302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetFlag(kUseGVN);
7303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetDependsOnFlag(kMaps);
7304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetChangesFlag(kNewSpacePromotion);
7305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (FLAG_trace_pretenuring) {
7306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      PrintF("HStringAdd with AllocationSite %p %s\n",
7307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch             allocation_site.is_null()
7308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                 ? static_cast<void*>(NULL)
7309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                 : static_cast<void*>(*allocation_site),
7310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch             pretenure_flag == TENURED ? "tenured" : "not tenured");
7311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
73123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
73133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // No side-effects except possible allocation:
7315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool IsDeletable() const OVERRIDE { return true; }
7316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const StringAddFlags flags_;
7318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const PretenureFlag pretenure_flag_;
7319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
7320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HStringCharCodeAt FINAL : public HTemplateInstruction<3> {
7323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
7324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P2(HStringCharCodeAt,
7325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                              HValue*,
7326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                              HValue*);
73273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
73283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
7329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // The index is supposed to be Integer32.
7330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return index == 2
7331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        ? Representation::Integer32()
7332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        : Representation::Tagged();
73335d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch  }
73343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* context() const { return OperandAt(0); }
7336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* string() const { return OperandAt(1); }
7337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* index() const { return OperandAt(2); }
7338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(StringCharCodeAt)
7340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected:
7342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool DataEquals(HValue* other) OVERRIDE { return true; }
7343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Range* InferRange(Zone* zone) OVERRIDE {
7345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return new(zone) Range(0, String::kMaxUtf16CodeUnit);
7346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
7347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
7349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HStringCharCodeAt(HValue* context, HValue* string, HValue* index) {
7350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(0, context);
7351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(1, string);
7352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(2, index);
7353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    set_representation(Representation::Integer32());
7354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetFlag(kUseGVN);
7355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetDependsOnFlag(kMaps);
7356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetDependsOnFlag(kStringChars);
7357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetChangesFlag(kNewSpacePromotion);
7358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
73593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // No side effects: runtime function assumes string + number inputs.
7361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool IsDeletable() const OVERRIDE { return true; }
73625d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch};
73635d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch
73645d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch
7365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HStringCharFromCode FINAL : public HTemplateInstruction<2> {
7366b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
7367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HInstruction* New(Zone* zone,
7368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           HValue* context,
7369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           HValue* char_code);
7370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
7372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return index == 0
7373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        ? Representation::Tagged()
7374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        : Representation::Integer32();
7375b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
7376b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
7377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* context() const { return OperandAt(0); }
7378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* value() const { return OperandAt(1); }
7379b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
7380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool DataEquals(HValue* other) OVERRIDE { return true; }
7381b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
7382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(StringCharFromCode)
7383b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
7384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
7385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HStringCharFromCode(HValue* context, HValue* char_code)
7386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : HTemplateInstruction<2>(HType::String()) {
73873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    SetOperandAt(0, context);
7388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(1, char_code);
7389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    set_representation(Representation::Tagged());
7390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetFlag(kUseGVN);
7391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetChangesFlag(kNewSpacePromotion);
73923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
73933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool IsDeletable() const OVERRIDE {
7395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return !value()->ToNumberCanBeObserved();
73963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
73973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
73983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
73993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate <int V>
7401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HMaterializedLiteral : public HTemplateInstruction<V> {
7402b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
7403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HMaterializedLiteral<V>(int index, int depth, AllocationSiteMode mode)
7404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : literal_index_(index), depth_(depth), allocation_site_mode_(mode) {
7405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    this->set_representation(Representation::Tagged());
74063fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
7407b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
7408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HMaterializedLiteral<V>(int index, int depth)
7409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : literal_index_(index), depth_(depth),
7410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        allocation_site_mode_(DONT_TRACK_ALLOCATION_SITE) {
7411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    this->set_representation(Representation::Tagged());
74123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
7413b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
7414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int literal_index() const { return literal_index_; }
7415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int depth() const { return depth_; }
7416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  AllocationSiteMode allocation_site_mode() const {
7417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return allocation_site_mode_;
7418e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
7419b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
7420b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
7421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool IsDeletable() const FINAL OVERRIDE { return true; }
7422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int literal_index_;
7424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int depth_;
7425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  AllocationSiteMode allocation_site_mode_;
7426b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
7427b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
7428b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
7429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HRegExpLiteral FINAL : public HMaterializedLiteral<1> {
7430592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch public:
7431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P4(HRegExpLiteral,
7432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                              Handle<FixedArray>,
7433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                              Handle<String>,
7434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                              Handle<String>,
7435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                              int);
7436b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
7437e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  HValue* context() { return OperandAt(0); }
7438b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<FixedArray> literals() { return literals_; }
7439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<String> pattern() { return pattern_; }
7440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<String> flags() { return flags_; }
7441b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
7442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
7443e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return Representation::Tagged();
7444e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
74451e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
7446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(RegExpLiteral)
7447b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
7448b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
74493fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HRegExpLiteral(HValue* context,
7450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                 Handle<FixedArray> literals,
74513fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch                 Handle<String> pattern,
7452b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch                 Handle<String> flags,
7453b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch                 int literal_index)
74543fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      : HMaterializedLiteral<1>(literal_index, 0),
7455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        literals_(literals),
7456b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        pattern_(pattern),
74573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        flags_(flags) {
74583fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(0, context);
74592b4ba1175df6a5a6b9b5cda034189197bf6565ecBen Murdoch    SetAllSideEffects();
7460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    set_type(HType::JSObject());
74613fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
7462b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
7463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<FixedArray> literals_;
7464b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<String> pattern_;
7465b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<String> flags_;
7466b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
7467b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
7468b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
7469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HFunctionLiteral FINAL : public HTemplateInstruction<1> {
7470b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
7471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P2(HFunctionLiteral,
7472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                              Handle<SharedFunctionInfo>,
7473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                              bool);
74743fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* context() { return OperandAt(0); }
74753fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
7476b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
74773fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return Representation::Tagged();
7478e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
7479e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
7480257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(FunctionLiteral)
7481b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
7482b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<SharedFunctionInfo> shared_info() const { return shared_info_; }
7483b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool pretenure() const { return pretenure_; }
7484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool has_no_literals() const { return has_no_literals_; }
7485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool is_arrow() const { return IsArrowFunction(kind_); }
7486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool is_generator() const { return IsGeneratorFunction(kind_); }
7487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool is_concise_method() const { return IsConciseMethod(kind_); }
7488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FunctionKind kind() const { return kind_; }
7489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  StrictMode strict_mode() const { return strict_mode_; }
7490b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
7491b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private:
7492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HFunctionLiteral(HValue* context, Handle<SharedFunctionInfo> shared,
7493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                   bool pretenure)
7494b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : HTemplateInstruction<1>(HType::JSObject()),
7495b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        shared_info_(shared),
7496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        kind_(shared->kind()),
7497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        pretenure_(pretenure),
7498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        has_no_literals_(shared->num_literals() == 0),
7499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        strict_mode_(shared->strict_mode()) {
7500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(0, context);
7501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    set_representation(Representation::Tagged());
7502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetChangesFlag(kNewSpacePromotion);
7503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
7504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool IsDeletable() const OVERRIDE { return true; }
7506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7507b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Handle<SharedFunctionInfo> shared_info_;
7508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FunctionKind kind_;
7509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool pretenure_ : 1;
7510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool has_no_literals_ : 1;
7511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  StrictMode strict_mode_;
7512b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
7513b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
7514b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
7515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HTypeof FINAL : public HTemplateInstruction<2> {
7516b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
7517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P1(HTypeof, HValue*);
7518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* context() const { return OperandAt(0); }
7520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* value() const { return OperandAt(1); }
7521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual OStream& PrintDataTo(OStream& os) const OVERRIDE;  // NOLINT
7523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
7525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return Representation::Tagged();
7526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
7527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(Typeof)
7529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
75313fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  explicit HTypeof(HValue* context, HValue* value) {
75323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(0, context);
75333fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    SetOperandAt(1, value);
7534b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
7535b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
7536b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
7537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool IsDeletable() const OVERRIDE { return true; }
7538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
75393fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
75403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7541b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HTrapAllocationMemento FINAL : public HTemplateInstruction<1> {
7542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
7543b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P1(HTrapAllocationMemento, HValue*);
7544b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
75461e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    return Representation::Tagged();
75471e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
75481e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
7549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* object() { return OperandAt(0); }
7550b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(TrapAllocationMemento)
7552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7553b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
7554b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit HTrapAllocationMemento(HValue* obj) {
7555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(0, obj);
7556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
7557b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
7558b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
7559b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
7560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HToFastProperties FINAL : public HUnaryOperation {
756144f0eee88ff00398ff7f715fab053374d808c90dSteve Block public:
7562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P1(HToFastProperties, HValue*);
756344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
7564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
756544f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return Representation::Tagged();
756644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
756744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
7568257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(ToFastProperties)
756944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
7570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
7571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit HToFastProperties(HValue* value) : HUnaryOperation(value) {
7572b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    set_representation(Representation::Tagged());
7573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetChangesFlag(kNewSpacePromotion);
7574b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
7575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // This instruction is not marked as kChangesMaps, but does
7576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // change the map of the input operand. Use it only when creating
7577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // object literals via a runtime call.
7578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(value->IsCallRuntime());
7579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef DEBUG
7580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    const Runtime::Function* function = HCallRuntime::cast(value)->function();
7581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(function->function_id == Runtime::kCreateObjectLiteral);
7582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif
7583e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
7584e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
7585b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool IsDeletable() const OVERRIDE { return true; }
7586b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
7587b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
7588b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
7589b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HDateField FINAL : public HUnaryOperation {
75903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
7591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P2(HDateField, HValue*, Smi*);
75923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
75933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Smi* index() const { return index_; }
75943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7595b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
75963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return Representation::Tagged();
75973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
75983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
75993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(DateField)
76003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
76013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private:
7602b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HDateField(HValue* date, Smi* index)
7603b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : HUnaryOperation(date), index_(index) {
7604b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    set_representation(Representation::Tagged());
7605b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
7606b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
76073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Smi* index_;
76083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
76093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
76103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7611b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HSeqStringGetChar FINAL : public HTemplateInstruction<2> {
7612b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public:
7613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static HInstruction* New(Zone* zone,
7614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           HValue* context,
7615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           String::Encoding encoding,
7616b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           HValue* string,
7617b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           HValue* index);
7618b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7619b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
7620b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return (index == 0) ? Representation::Tagged()
7621b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        : Representation::Integer32();
7622b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
7623b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
7624b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  String::Encoding encoding() const { return encoding_; }
7625b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* string() const { return OperandAt(0); }
7626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* index() const { return OperandAt(1); }
7627b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(SeqStringGetChar)
7629b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected:
7631b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool DataEquals(HValue* other) OVERRIDE {
7632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return encoding() == HSeqStringGetChar::cast(other)->encoding();
7633b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
7634b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
7635b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Range* InferRange(Zone* zone) OVERRIDE {
7636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (encoding() == String::ONE_BYTE_ENCODING) {
7637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return new(zone) Range(0, String::kMaxOneByteCharCode);
7638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else {
7639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      DCHECK_EQ(String::TWO_BYTE_ENCODING, encoding());
7640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return  new(zone) Range(0, String::kMaxUtf16CodeUnit);
7641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
7642b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
7643b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7644b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
7645b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HSeqStringGetChar(String::Encoding encoding,
7646b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                    HValue* string,
7647b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                    HValue* index) : encoding_(encoding) {
7648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(0, string);
7649b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(1, index);
7650b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    set_representation(Representation::Integer32());
7651b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetFlag(kUseGVN);
7652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetDependsOnFlag(kStringChars);
7653b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
76543fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
7655b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool IsDeletable() const OVERRIDE { return true; }
7656b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
7657b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  String::Encoding encoding_;
7658b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
7659b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
7660257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
7661b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HSeqStringSetChar FINAL : public HTemplateInstruction<4> {
7662257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public:
7663b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P4(
7664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      HSeqStringSetChar, String::Encoding,
7665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      HValue*, HValue*, HValue*);
7666257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
7667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  String::Encoding encoding() { return encoding_; }
76683fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  HValue* context() { return OperandAt(0); }
7669b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* string() { return OperandAt(1); }
7670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* index() { return OperandAt(2); }
7671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* value() { return OperandAt(3); }
7672257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
7673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
7674b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return (index <= 1) ? Representation::Tagged()
7675b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        : Representation::Integer32();
7676257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
7677257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
7678b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(SeqStringSetChar)
7679257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
7680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
7681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HSeqStringSetChar(HValue* context,
7682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                    String::Encoding encoding,
7683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                    HValue* string,
7684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                    HValue* index,
7685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                    HValue* value) : encoding_(encoding) {
7686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(0, context);
7687b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(1, string);
7688b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(2, index);
7689b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(3, value);
7690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    set_representation(Representation::Tagged());
7691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetChangesFlag(kStringChars);
7692b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
7693257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
7694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  String::Encoding encoding_;
7695257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
7696257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
76973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HCheckMapValue FINAL : public HTemplateInstruction<2> {
76993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
7700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P2(HCheckMapValue, HValue*, HValue*);
77013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7702b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
77033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return Representation::Tagged();
77043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
77053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual OStream& PrintDataTo(OStream& os) const OVERRIDE;  // NOLINT
77073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7708b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual HType CalculateInferredType() OVERRIDE {
7709b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (value()->type().IsHeapObject()) return value()->type();
7710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return HType::HeapObject();
77113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
77123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7713b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* value() const { return OperandAt(0); }
7714b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* map() const { return OperandAt(1); }
7715b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7716b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual HValue* Canonicalize() OVERRIDE;
77173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
77183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(CheckMapValue)
77193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
77203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch protected:
7721b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual int RedefinedOperandIndex() { return 0; }
7722b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool DataEquals(HValue* other) OVERRIDE {
77243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return true;
77253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
7726b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7727b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
7728b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HCheckMapValue(HValue* value, HValue* map)
7729b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : HTemplateInstruction<2>(HType::HeapObject()) {
7730b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(0, value);
7731b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(1, map);
7732b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    set_representation(Representation::Tagged());
7733b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetFlag(kUseGVN);
7734b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetDependsOnFlag(kMaps);
7735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetDependsOnFlag(kElementsKind);
7736b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
77373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
77383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
77393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7740b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HForInPrepareMap FINAL : public HTemplateInstruction<2> {
77413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
7742b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P1(HForInPrepareMap, HValue*);
77433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7744b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
77453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return Representation::Tagged();
77463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
77473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7748b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* context() const { return OperandAt(0); }
7749b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* enumerable() const { return OperandAt(1); }
77503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7751b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual OStream& PrintDataTo(OStream& os) const OVERRIDE;  // NOLINT
77523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7753b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual HType CalculateInferredType() OVERRIDE {
77543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return HType::Tagged();
77553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
77563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
77573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(ForInPrepareMap);
7758b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
7760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HForInPrepareMap(HValue* context,
7761b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                   HValue* object) {
7762b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(0, context);
7763b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(1, object);
7764b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    set_representation(Representation::Tagged());
7765b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetAllSideEffects();
7766b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
77673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
77683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
77693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7770b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HForInCacheArray FINAL : public HTemplateInstruction<2> {
77713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
7772b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P3(HForInCacheArray, HValue*, HValue*, int);
77733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7774b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
77753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return Representation::Tagged();
77763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
77773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7778b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* enumerable() const { return OperandAt(0); }
7779b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* map() const { return OperandAt(1); }
7780b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int idx() const { return idx_; }
77813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
77823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HForInCacheArray* index_cache() {
77833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return index_cache_;
77843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
77853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
77863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  void set_index_cache(HForInCacheArray* index_cache) {
77873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    index_cache_ = index_cache;
77883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
77893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7790b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual OStream& PrintDataTo(OStream& os) const OVERRIDE;  // NOLINT
77913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7792b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual HType CalculateInferredType() OVERRIDE {
77933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return HType::Tagged();
77943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
77953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
77963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(ForInCacheArray);
77973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
77983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private:
7799b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HForInCacheArray(HValue* enumerable,
7800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                   HValue* keys,
7801b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                   int idx) : idx_(idx) {
7802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(0, enumerable);
7803b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(1, keys);
7804b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    set_representation(Representation::Tagged());
7805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
7806b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
78073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  int idx_;
78083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HForInCacheArray* index_cache_;
78093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
78103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
78113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HLoadFieldByIndex FINAL : public HTemplateInstruction<2> {
78133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
7814b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P2(HLoadFieldByIndex, HValue*, HValue*);
7815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
78163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HLoadFieldByIndex(HValue* object,
78173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                    HValue* index) {
78183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    SetOperandAt(0, object);
78193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    SetOperandAt(1, index);
7820b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetChangesFlag(kNewSpacePromotion);
78213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    set_representation(Representation::Tagged());
78223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
78233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7824b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) OVERRIDE {
7825b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (index == 1) {
7826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return Representation::Smi();
7827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else {
7828b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return Representation::Tagged();
7829b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
78303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
78313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7832b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* object() const { return OperandAt(0); }
7833b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* index() const { return OperandAt(1); }
78343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7835b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual OStream& PrintDataTo(OStream& os) const OVERRIDE;  // NOLINT
78363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7837b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual HType CalculateInferredType() OVERRIDE {
78383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return HType::Tagged();
78393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
78403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
78413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(LoadFieldByIndex);
7842b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7843b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
7844b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool IsDeletable() const OVERRIDE { return true; }
78453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
78463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
78473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7848b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HStoreFrameContext: public HUnaryOperation {
7849b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
7850b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P1(HStoreFrameContext, HValue*);
7851b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7852b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* context() { return OperandAt(0); }
7853b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7854b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
7855b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return Representation::Tagged();
7856b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
7857b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7858b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(StoreFrameContext)
7859b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
7860b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit HStoreFrameContext(HValue* context)
7861b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : HUnaryOperation(context) {
7862b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    set_representation(Representation::Tagged());
7863b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetChangesFlag(kContextSlots);
7864b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
7865b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
7866b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7867b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7868b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HAllocateBlockContext: public HTemplateInstruction<2> {
7869b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
7870b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_INSTRUCTION_FACTORY_P3(HAllocateBlockContext, HValue*,
7871b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                 HValue*, Handle<ScopeInfo>);
7872b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* context() const { return OperandAt(0); }
7873b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HValue* function() const { return OperandAt(1); }
7874b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<ScopeInfo> scope_info() const { return scope_info_; }
7875b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7876b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual Representation RequiredInputRepresentation(int index) {
7877b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return Representation::Tagged();
7878b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
7879b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7880b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual OStream& PrintDataTo(OStream& os) const;  // NOLINT
7881b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7882b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(AllocateBlockContext)
7883b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7884b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
7885b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HAllocateBlockContext(HValue* context,
7886b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        HValue* function,
7887b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        Handle<ScopeInfo> scope_info)
7888b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : scope_info_(scope_info) {
7889b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(0, context);
7890b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetOperandAt(1, function);
7891b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    set_representation(Representation::Tagged());
7892b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
7893b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7894b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<ScopeInfo> scope_info_;
7895b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
7896b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7897b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7899b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#undef DECLARE_INSTRUCTION
7900b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#undef DECLARE_CONCRETE_INSTRUCTION
7901b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
7902b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} }  // namespace v8::internal
7903b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
7904b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif  // V8_HYDROGEN_INSTRUCTIONS_H_
7905