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.
444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
5014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#ifndef V8_CRANKSHAFT_MIPS_LITHIUM_MIPS_H_
6014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define V8_CRANKSHAFT_MIPS_LITHIUM_MIPS_H_
744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
8014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/crankshaft/hydrogen.h"
9014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/crankshaft/lithium.h"
10014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/crankshaft/lithium-allocator.h"
11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/safepoint-table.h"
12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/utils.h"
1344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1444f0eee88ff00398ff7f715fab053374d808c90dSteve Blocknamespace v8 {
1544f0eee88ff00398ff7f715fab053374d808c90dSteve Blocknamespace internal {
1644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1744f0eee88ff00398ff7f715fab053374d808c90dSteve Block// Forward declarations.
1844f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass LCodeGen;
193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define LITHIUM_CONCRETE_INSTRUCTION_LIST(V) \
21b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(AccessArgumentsAt)                       \
22b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(AddI)                                    \
23b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(Allocate)                                \
24b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(ApplyArguments)                          \
25b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(ArgumentsElements)                       \
26b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(ArgumentsLength)                         \
27b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(ArithmeticD)                             \
28b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(ArithmeticT)                             \
29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(BitI)                                    \
30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(BoundsCheck)                             \
31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(Branch)                                  \
32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(CallWithDescriptor)                      \
33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(CallNewArray)                            \
34b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(CallRuntime)                             \
35014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(CheckArrayBufferNotNeutered)             \
36b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(CheckInstanceType)                       \
37b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(CheckMaps)                               \
38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(CheckMapValue)                           \
39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(CheckNonSmi)                             \
40b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(CheckSmi)                                \
41b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(CheckValue)                              \
42b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(ClampDToUint8)                           \
43b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(ClampIToUint8)                           \
44b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(ClampTToUint8)                           \
45b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(ClassOfTestAndBranch)                    \
46b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(CompareNumericAndBranch)                 \
47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(CmpObjectEqAndBranch)                    \
48b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(CmpHoleAndBranch)                        \
49b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(CmpMapAndBranch)                         \
50b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(CmpT)                                    \
51b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(ConstantD)                               \
52b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(ConstantE)                               \
53b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(ConstantI)                               \
54b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(ConstantS)                               \
55b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(ConstantT)                               \
56b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(Context)                                 \
57b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(DebugBreak)                              \
58b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(DeclareGlobals)                          \
59b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(Deoptimize)                              \
60b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(DivByConstI)                             \
61b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(DivByPowerOf2I)                          \
62b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(DivI)                                    \
63b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(DoubleToI)                               \
64b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(DoubleBits)                              \
65b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(DoubleToSmi)                             \
66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(Drop)                                    \
67b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(Dummy)                                   \
68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(DummyUse)                                \
69537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch  V(FastAllocate)                            \
70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(FlooringDivByConstI)                     \
71b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(FlooringDivByPowerOf2I)                  \
72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(FlooringDivI)                            \
73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(ForInCacheArray)                         \
74b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(ForInPrepareMap)                         \
75b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(GetCachedArrayIndex)                     \
76b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(Goto)                                    \
77b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(HasCachedArrayIndexAndBranch)            \
78014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(HasInPrototypeChainAndBranch)            \
79b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(HasInstanceTypeAndBranch)                \
80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(InnerAllocatedObject)                    \
81b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(InstructionGap)                          \
82b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(Integer32ToDouble)                       \
83b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(InvokeFunction)                          \
84b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(IsStringAndBranch)                       \
85b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(IsSmiAndBranch)                          \
86b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(IsUndetectableAndBranch)                 \
87b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(Label)                                   \
88b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(LazyBailout)                             \
89b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(LoadContextSlot)                         \
90b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(LoadRoot)                                \
91b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(LoadFieldByIndex)                        \
92b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(LoadFunctionPrototype)                   \
93b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(LoadGlobalGeneric)                       \
94b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(LoadKeyed)                               \
95b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(LoadKeyedGeneric)                        \
96b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(LoadNamedField)                          \
97b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(LoadNamedGeneric)                        \
98b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(MathAbs)                                 \
9921efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch  V(MathCos)                                 \
10021efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch  V(MathSin)                                 \
101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(MathExp)                                 \
102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(MathClz32)                               \
103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(MathFloor)                               \
104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(MathFround)                              \
105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(MathLog)                                 \
106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(MathMinMax)                              \
107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(MathPowHalf)                             \
108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(MathRound)                               \
109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(MathSqrt)                                \
110014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(MaybeGrowElements)                       \
111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(ModByConstI)                             \
112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(ModByPowerOf2I)                          \
113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(ModI)                                    \
114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(MulI)                                    \
115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(MultiplyAddD)                            \
116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(NumberTagD)                              \
117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(NumberTagI)                              \
118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(NumberTagU)                              \
119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(NumberUntagD)                            \
120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(OsrEntry)                                \
121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(Parameter)                               \
122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(Power)                                   \
123014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(Prologue)                                \
124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(PushArgument)                            \
125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(Return)                                  \
126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(SeqStringGetChar)                        \
127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(SeqStringSetChar)                        \
128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(ShiftI)                                  \
129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(SmiTag)                                  \
130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(SmiUntag)                                \
131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(StackCheck)                              \
132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(StoreCodeEntry)                          \
133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(StoreContextSlot)                        \
134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(StoreKeyed)                              \
135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(StoreKeyedGeneric)                       \
136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(StoreNamedField)                         \
137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(StoreNamedGeneric)                       \
138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(StringAdd)                               \
139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(StringCharCodeAt)                        \
140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(StringCharFromCode)                      \
141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(StringCompareAndBranch)                  \
142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(SubI)                                    \
143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(TaggedToI)                               \
144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(ThisFunction)                            \
145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(TransitionElementsKind)                  \
146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(TrapAllocationMemento)                   \
147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(Typeof)                                  \
148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(TypeofIsAndBranch)                       \
149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(Uint32ToDouble)                          \
150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(UnknownOSRValue)                         \
1513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  V(WrapReceiver)
1523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
153958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#define DECLARE_CONCRETE_INSTRUCTION(type, mnemonic)            \
154014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Opcode opcode() const final { return LInstruction::k##type; } \
155014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void CompileToNative(LCodeGen* generator) final;              \
156014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  const char* Mnemonic() const final { return mnemonic; }       \
157958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  static L##type* cast(LInstruction* instr) {                   \
158958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    DCHECK(instr->Is##type());                                  \
159958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    return reinterpret_cast<L##type*>(instr);                   \
1603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
1613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#define DECLARE_HYDROGEN_ACCESSOR(type)     \
1643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  H##type* hydrogen() const {               \
1653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return H##type::cast(hydrogen_value()); \
1663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
1673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
16844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass LInstruction : public ZoneObject {
17044f0eee88ff00398ff7f715fab053374d808c90dSteve Block public:
1713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LInstruction()
172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : environment_(NULL),
173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        hydrogen_value_(NULL),
174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        bit_field_(IsCallBits::encode(false)) {
175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual ~LInstruction() {}
17844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual void CompileToNative(LCodeGen* generator) = 0;
1803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual const char* Mnemonic() const = 0;
1813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual void PrintTo(StringStream* stream);
182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual void PrintDataTo(StringStream* stream);
183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual void PrintOutputOperandTo(StringStream* stream);
1843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  enum Opcode {
1863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // Declare a unique enum value for each instruction.
1873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#define DECLARE_OPCODE(type) k##type,
1883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LITHIUM_CONCRETE_INSTRUCTION_LIST(DECLARE_OPCODE)
1893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    kNumberOfInstructions
1903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#undef DECLARE_OPCODE
1913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  };
1923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual Opcode opcode() const = 0;
1943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Declare non-virtual type testers for all leaf IR classes.
1963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#define DECLARE_PREDICATE(type) \
1973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool Is##type() const { return opcode() == k##type; }
1983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LITHIUM_CONCRETE_INSTRUCTION_LIST(DECLARE_PREDICATE)
1993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#undef DECLARE_PREDICATE
2003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Declare virtual predicates for instructions that don't have
2023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // an opcode.
2033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual bool IsGap() const { return false; }
2043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  virtual bool IsControl() const { return false; }
2063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Try deleting this instruction if possible.
208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool TryDelete() { return false; }
209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  void set_environment(LEnvironment* env) { environment_ = env; }
2113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LEnvironment* environment() const { return environment_; }
2123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool HasEnvironment() const { return environment_ != NULL; }
2133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  void set_pointer_map(LPointerMap* p) { pointer_map_.set(p); }
2153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LPointerMap* pointer_map() const { return pointer_map_.get(); }
2163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool HasPointerMap() const { return pointer_map_.is_set(); }
2173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  void set_hydrogen_value(HValue* value) { hydrogen_value_ = value; }
2193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HValue* hydrogen_value() const { return hydrogen_value_; }
2203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void MarkAsCall() { bit_field_ = IsCallBits::update(bit_field_, true); }
222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool IsCall() const { return IsCallBits::decode(bit_field_); }
2233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2241b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  void MarkAsSyntacticTailCall() {
2251b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    bit_field_ = IsSyntacticTailCallBits::update(bit_field_, true);
2261b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
2271b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  bool IsSyntacticTailCall() const {
2281b268ca467c924004286c97bac133db489cf43d0Ben Murdoch    return IsSyntacticTailCallBits::decode(bit_field_);
2291b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  }
2301b268ca467c924004286c97bac133db489cf43d0Ben Murdoch
2313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Interface to the register allocator and iterators.
232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool ClobbersTemps() const { return IsCall(); }
233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool ClobbersRegisters() const { return IsCall(); }
234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool ClobbersDoubleRegisters(Isolate* isolate) const {
235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return IsCall();
236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Interface to the register allocator and iterators.
239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool IsMarkedAsCall() const { return IsCall(); }
2403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool HasResult() const = 0;
242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual LOperand* result() const = 0;
2433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* FirstInput() { return InputAt(0); }
2453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* Output() { return HasResult() ? result() : NULL; }
2463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual bool HasInterestingComment(LCodeGen* gen) const { return true; }
248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#ifdef DEBUG
2503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  void VerifyCall();
2513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#endif
2523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual int InputCount() = 0;
254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual LOperand* InputAt(int i) = 0;
255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private:
257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Iterator interface.
258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  friend class InputIterator;
259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  friend class TempIterator;
261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual int TempCount() = 0;
262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  virtual LOperand* TempAt(int i) = 0;
263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  class IsCallBits: public BitField<bool, 0, 1> {};
2651b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  class IsSyntacticTailCallBits : public BitField<bool, IsCallBits::kNext, 1> {
2661b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  };
267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LEnvironment* environment_;
2693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  SetOncePointer<LPointerMap> pointer_map_;
2703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HValue* hydrogen_value_;
271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int bit_field_;
2723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
273592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
2743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// R = number of result operands (0 or 1).
276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<int R>
277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass LTemplateResultInstruction : public LInstruction {
2783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
2793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Allow 0 or 1 output operands.
2803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  STATIC_ASSERT(R == 0 || R == 1);
281014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool HasResult() const final { return R != 0 && result() != NULL; }
2823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  void set_result(LOperand* operand) { results_[0] = operand; }
283014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* result() const override { return results_[0]; }
2843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected:
286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EmbeddedContainer<LOperand*, R> results_;
287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
2883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// R = number of result operands (0 or 1).
291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// I = number of input operands.
292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// T = number of temporary operands.
293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<int R, int I, int T>
294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass LTemplateInstruction : public LTemplateResultInstruction<R> {
2953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch protected:
2963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EmbeddedContainer<LOperand*, I> inputs_;
2973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EmbeddedContainer<LOperand*, T> temps_;
298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Iterator support.
301014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int InputCount() final { return I; }
302014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* InputAt(int i) final { return inputs_[i]; }
303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
304014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int TempCount() final { return T; }
305014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* TempAt(int i) final { return temps_[i]; }
3063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
3073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass LGap : public LTemplateInstruction<0, 0, 0> {
3103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
3113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  explicit LGap(HBasicBlock* block)
3123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      : block_(block) {
3133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    parallel_moves_[BEFORE] = NULL;
3143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    parallel_moves_[START] = NULL;
3153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    parallel_moves_[END] = NULL;
3163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    parallel_moves_[AFTER] = NULL;
31744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
31844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
3193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Can't use the DECLARE-macro here because of sub-classes.
320014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool IsGap() const final { return true; }
321014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void PrintDataTo(StringStream* stream) override;
3223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  static LGap* cast(LInstruction* instr) {
323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(instr->IsGap());
3243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return reinterpret_cast<LGap*>(instr);
32544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
32644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
3273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool IsRedundant() const;
3283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HBasicBlock* block() const { return block_; }
3303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  enum InnerPosition {
3323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    BEFORE,
3333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    START,
3343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    END,
3353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    AFTER,
3363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    FIRST_INNER_POSITION = BEFORE,
3373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LAST_INNER_POSITION = AFTER
3383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  };
33944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LParallelMove* GetOrCreateParallelMove(InnerPosition pos, Zone* zone)  {
341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (parallel_moves_[pos] == NULL) {
342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      parallel_moves_[pos] = new(zone) LParallelMove(zone);
343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return parallel_moves_[pos];
34544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
34644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
3473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LParallelMove* GetParallelMove(InnerPosition pos)  {
3483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return parallel_moves_[pos];
34944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
35044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
3513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private:
3523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LParallelMove* parallel_moves_[LAST_INNER_POSITION + 1];
3533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HBasicBlock* block_;
3543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
3553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
357014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LInstructionGap final : public LGap {
3583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
3593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  explicit LInstructionGap(HBasicBlock* block) : LGap(block) { }
3603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
361014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool HasInterestingComment(LCodeGen* gen) const override {
362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return !IsRedundant();
363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(InstructionGap, "gap")
3663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
3673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
369014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LGoto final : public LTemplateInstruction<0, 0, 0> {
3703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit LGoto(HBasicBlock* block) : block_(block) { }
3723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
373014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool HasInterestingComment(LCodeGen* gen) const override;
3743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(Goto, "goto")
375014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void PrintDataTo(StringStream* stream) override;
376014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool IsControl() const override { return true; }
3773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int block_id() const { return block_->block_id(); }
379592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
3803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private:
381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HBasicBlock* block_;
3823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
3833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
385014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LPrologue final : public LTemplateInstruction<0, 0, 0> {
386014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public:
387014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Prologue, "prologue")
388014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch};
389014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
390014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
391014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LLazyBailout final : public LTemplateInstruction<0, 0, 0> {
3923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
3933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LLazyBailout() : gap_instructions_size_(0) { }
3943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(LazyBailout, "lazy-bailout")
3963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  void set_gap_instructions_size(int gap_instructions_size) {
3983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    gap_instructions_size_ = gap_instructions_size;
39944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
4003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  int gap_instructions_size() { return gap_instructions_size_; }
401592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
4023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private:
4033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  int gap_instructions_size_;
4043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
405592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
4063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
407014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LDummy final : public LTemplateInstruction<1, 0, 0> {
408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LDummy() {}
410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(Dummy, "dummy")
411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
414014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LDummyUse final : public LTemplateInstruction<1, 1, 0> {
415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit LDummyUse(LOperand* value) {
417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[0] = value;
418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(DummyUse, "dummy-use")
420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
423014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LDeoptimize final : public LTemplateInstruction<0, 0, 0> {
4243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
425014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool IsControl() const override { return true; }
4263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(Deoptimize, "deoptimize")
427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(Deoptimize)
4283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
4293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
431014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LLabel final : public LGap {
4323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
4333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  explicit LLabel(HBasicBlock* block)
4343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      : LGap(block), replacement_(NULL) { }
4353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
436014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool HasInterestingComment(LCodeGen* gen) const override { return false; }
4373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(Label, "label")
4383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
439014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void PrintDataTo(StringStream* stream) override;
4403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  int block_id() const { return block()->block_id(); }
4423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool is_loop_header() const { return block()->IsLoopHeader(); }
443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool is_osr_entry() const { return block()->is_osr_entry(); }
4443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Label* label() { return &label_; }
4453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LLabel* replacement() const { return replacement_; }
4463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  void set_replacement(LLabel* label) { replacement_ = label; }
4473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool HasReplacement() const { return replacement_ != NULL; }
4483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private:
4503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Label label_;
4513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LLabel* replacement_;
4523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
4533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
455014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LParameter final : public LTemplateInstruction<1, 0, 0> {
4563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
457014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool HasInterestingComment(LCodeGen* gen) const override { return false; }
4583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(Parameter, "parameter")
4593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
4603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
462014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LUnknownOSRValue final : public LTemplateInstruction<1, 0, 0> {
4633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
464014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool HasInterestingComment(LCodeGen* gen) const override { return false; }
4653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(UnknownOSRValue, "unknown-osr-value")
4663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
4673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochtemplate<int I, int T>
470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass LControlInstruction : public LTemplateInstruction<0, I, T> {
4713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LControlInstruction() : false_label_(NULL), true_label_(NULL) { }
473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
474014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool IsControl() const final { return true; }
475592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
4763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  int SuccessorCount() { return hydrogen()->SuccessorCount(); }
4773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HBasicBlock* SuccessorAt(int i) { return hydrogen()->SuccessorAt(i); }
478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int TrueDestination(LChunk* chunk) {
480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return chunk->LookupDestination(true_block_id());
481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int FalseDestination(LChunk* chunk) {
483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return chunk->LookupDestination(false_block_id());
484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Label* TrueLabel(LChunk* chunk) {
487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (true_label_ == NULL) {
488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      true_label_ = chunk->GetAssemblyLabel(TrueDestination(chunk));
489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
490b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return true_label_;
491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Label* FalseLabel(LChunk* chunk) {
493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (false_label_ == NULL) {
494b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      false_label_ = chunk->GetAssemblyLabel(FalseDestination(chunk));
495b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return false_label_;
497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected:
500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int true_block_id() { return SuccessorAt(0)->block_id(); }
501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int false_block_id() { return SuccessorAt(1)->block_id(); }
5023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private:
5043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HControlInstruction* hydrogen() {
5053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return HControlInstruction::cast(this->hydrogen_value());
50644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Label* false_label_;
509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Label* true_label_;
5103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
511592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
5123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
513014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LWrapReceiver final : public LTemplateInstruction<1, 2, 0> {
5143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
5153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LWrapReceiver(LOperand* receiver, LOperand* function) {
5163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[0] = receiver;
5173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[1] = function;
5185d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch  }
5195d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch
5203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(WrapReceiver, "wrap-receiver")
521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(WrapReceiver)
5223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* receiver() { return inputs_[0]; }
5243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* function() { return inputs_[1]; }
5253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
5263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
528014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LApplyArguments final : public LTemplateInstruction<1, 4, 0> {
5293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
5303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LApplyArguments(LOperand* function,
5313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                  LOperand* receiver,
5323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                  LOperand* length,
5333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                  LOperand* elements) {
5343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[0] = function;
5353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[1] = receiver;
5363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[2] = length;
5373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[3] = elements;
53844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
53944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
5403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(ApplyArguments, "apply-arguments")
5411b268ca467c924004286c97bac133db489cf43d0Ben Murdoch  DECLARE_HYDROGEN_ACCESSOR(ApplyArguments)
5423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* function() { return inputs_[0]; }
5443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* receiver() { return inputs_[1]; }
5453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* length() { return inputs_[2]; }
5463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* elements() { return inputs_[3]; }
5473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
5483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
550014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LAccessArgumentsAt final : public LTemplateInstruction<1, 3, 0> {
5513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
5523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LAccessArgumentsAt(LOperand* arguments, LOperand* length, LOperand* index) {
5533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[0] = arguments;
5543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[1] = length;
5553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[2] = index;
55644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
55744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
5583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(AccessArgumentsAt, "access-arguments-at")
5593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* arguments() { return inputs_[0]; }
5613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* length() { return inputs_[1]; }
5623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* index() { return inputs_[2]; }
5633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
564014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void PrintDataTo(StringStream* stream) override;
5653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
5663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
568014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LArgumentsLength final : public LTemplateInstruction<1, 1, 0> {
5693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
5703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  explicit LArgumentsLength(LOperand* elements) {
5713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[0] = elements;
57244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
57344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* elements() { return inputs_[0]; }
575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(ArgumentsLength, "arguments-length")
5773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
5783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
580014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LArgumentsElements final : public LTemplateInstruction<1, 0, 0> {
5813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
5823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(ArgumentsElements, "arguments-elements")
583b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(ArgumentsElements)
5843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
5853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
587014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LModByPowerOf2I final : public LTemplateInstruction<1, 1, 0> {
5883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
589b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LModByPowerOf2I(LOperand* dividend, int32_t divisor) {
590b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[0] = dividend;
591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    divisor_ = divisor;
59244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
59344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* dividend() { return inputs_[0]; }
595b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t divisor() const { return divisor_; }
59644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
597b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(ModByPowerOf2I, "mod-by-power-of-2-i")
5983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(Mod)
599b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
600b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t divisor_;
6023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
6033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
6043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
605014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LModByConstI final : public LTemplateInstruction<1, 1, 0> {
6063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
607b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LModByConstI(LOperand* dividend, int32_t divisor) {
608b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[0] = dividend;
609b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    divisor_ = divisor;
61044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
61144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
612b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* dividend() { return inputs_[0]; }
613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t divisor() const { return divisor_; }
614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(ModByConstI, "mod-by-const-i")
616b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(Mod)
617b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
618b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
619b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t divisor_;
6203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
6213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
6223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
623014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LModI final : public LTemplateInstruction<1, 2, 3> {
6243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
625b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LModI(LOperand* left,
626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        LOperand* right) {
6273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[0] = left;
6283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[1] = right;
62944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
63044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
631b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* left() { return inputs_[0]; }
632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* right() { return inputs_[1]; }
633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
634b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(ModI, "mod-i")
635b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(Mod)
63644f0eee88ff00398ff7f715fab053374d808c90dSteve Block};
63744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
63844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
639014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LDivByPowerOf2I final : public LTemplateInstruction<1, 1, 0> {
64044f0eee88ff00398ff7f715fab053374d808c90dSteve Block public:
641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LDivByPowerOf2I(LOperand* dividend, int32_t divisor) {
642b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[0] = dividend;
643b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    divisor_ = divisor;
6443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
64544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
646b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* dividend() { return inputs_[0]; }
647b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t divisor() const { return divisor_; }
6483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
649b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(DivByPowerOf2I, "div-by-power-of-2-i")
650b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(Div)
65144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
653b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t divisor_;
6543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
655592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
6563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
657014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LDivByConstI final : public LTemplateInstruction<1, 1, 0> {
6583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
659b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LDivByConstI(LOperand* dividend, int32_t divisor) {
660b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[0] = dividend;
661b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    divisor_ = divisor;
66244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
66344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* dividend() { return inputs_[0]; }
665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t divisor() const { return divisor_; }
6663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(DivByConstI, "div-by-const-i")
668b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(Div)
669b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t divisor_;
6723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
6733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
6743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
675014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LDivI final : public LTemplateInstruction<1, 2, 1> {
6763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
677b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LDivI(LOperand* dividend, LOperand* divisor, LOperand* temp) {
678b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[0] = dividend;
679b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[1] = divisor;
680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    temps_[0] = temp;
68144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
6823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* dividend() { return inputs_[0]; }
684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* divisor() { return inputs_[1]; }
685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* temp() { return temps_[0]; }
686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
687b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(DivI, "div-i")
688b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(BinaryOperation)
68944f0eee88ff00398ff7f715fab053374d808c90dSteve Block};
69044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
69144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
692014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LFlooringDivByPowerOf2I final : public LTemplateInstruction<1, 1, 0> {
69344f0eee88ff00398ff7f715fab053374d808c90dSteve Block public:
694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LFlooringDivByPowerOf2I(LOperand* dividend, int32_t divisor) {
695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[0] = dividend;
696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    divisor_ = divisor;
6973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
6983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* dividend() { return inputs_[0]; }
700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t divisor() { return divisor_; }
701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
702b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(FlooringDivByPowerOf2I,
703b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                               "flooring-div-by-power-of-2-i")
704b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(MathFloorOfDiv)
705b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t divisor_;
70844f0eee88ff00398ff7f715fab053374d808c90dSteve Block};
70944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
71044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
711014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LFlooringDivByConstI final : public LTemplateInstruction<1, 1, 2> {
71244f0eee88ff00398ff7f715fab053374d808c90dSteve Block public:
713b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LFlooringDivByConstI(LOperand* dividend, int32_t divisor, LOperand* temp) {
714b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[0] = dividend;
715b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    divisor_ = divisor;
716b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    temps_[0] = temp;
71744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
71844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
719b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* dividend() { return inputs_[0]; }
720b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t divisor() const { return divisor_; }
721b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* temp() { return temps_[0]; }
7223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(FlooringDivByConstI, "flooring-div-by-const-i")
724b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(MathFloorOfDiv)
7253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
726b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
727b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int32_t divisor_;
7283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
7293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
731014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LFlooringDivI final : public LTemplateInstruction<1, 2, 0> {
7323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
733b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LFlooringDivI(LOperand* dividend, LOperand* divisor) {
734b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[0] = dividend;
735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[1] = divisor;
73644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
7373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* dividend() { return inputs_[0]; }
739b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* divisor() { return inputs_[1]; }
7403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
741b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(FlooringDivI, "flooring-div-i")
742b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(MathFloorOfDiv)
7433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
7443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
746014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LMulI final : public LTemplateInstruction<1, 2, 0> {
7473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
748b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LMulI(LOperand* left, LOperand* right) {
749b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[0] = left;
750b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[1] = right;
75144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
75244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
753b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* left() { return inputs_[0]; }
754b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* right() { return inputs_[1]; }
7553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
756b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(MulI, "mul-i")
757b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(Mul)
7583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
7593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
761b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Instruction for computing multiplier * multiplicand + addend.
762014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LMultiplyAddD final : public LTemplateInstruction<1, 3, 0> {
7633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
764b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LMultiplyAddD(LOperand* addend, LOperand* multiplier,
765b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                LOperand* multiplicand) {
766b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[0] = addend;
767b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[1] = multiplier;
768b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[2] = multiplicand;
76944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
7703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
771b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* addend() { return inputs_[0]; }
772b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* multiplier() { return inputs_[1]; }
773b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* multiplicand() { return inputs_[2]; }
7743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
775b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(MultiplyAddD, "multiply-add-d")
7763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
7773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
779014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LDebugBreak final : public LTemplateInstruction<0, 0, 0> {
7803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
781b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(DebugBreak, "break")
78244f0eee88ff00398ff7f715fab053374d808c90dSteve Block};
78344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
78444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
785014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LCompareNumericAndBranch final : public LControlInstruction<2, 0> {
78644f0eee88ff00398ff7f715fab053374d808c90dSteve Block public:
787b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LCompareNumericAndBranch(LOperand* left, LOperand* right) {
7883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[0] = left;
7893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[1] = right;
7903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
7913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
792b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* left() { return inputs_[0]; }
793b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* right() { return inputs_[1]; }
794b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
795b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(CompareNumericAndBranch,
796b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                               "compare-numeric-and-branch")
797b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(CompareNumericAndBranch)
7983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Token::Value op() const { return hydrogen()->token(); }
800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool is_double() const {
801b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return hydrogen()->representation().IsDouble();
802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
80344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
804014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void PrintDataTo(StringStream* stream) override;
8053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
8063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
8073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
808014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LMathFloor final : public LTemplateInstruction<1, 1, 1> {
8093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
810b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LMathFloor(LOperand* value, LOperand* temp) {
8113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[0] = value;
812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    temps_[0] = temp;
81344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
81444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* value() { return inputs_[0]; }
816b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* temp() { return temps_[0]; }
8173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
818b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(MathFloor, "math-floor")
819b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(UnaryMathOperation)
8203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
8213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
8223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
823014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LMathRound final : public LTemplateInstruction<1, 1, 1> {
8243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
825b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LMathRound(LOperand* value, LOperand* temp) {
8263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[0] = value;
827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    temps_[0] = temp;
82844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
82944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
830b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* value() { return inputs_[0]; }
831b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* temp() { return temps_[0]; }
832b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
833b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(MathRound, "math-round")
834b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(UnaryMathOperation)
8353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
8363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
8373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
838014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LMathFround final : public LTemplateInstruction<1, 1, 0> {
8393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
840b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit LMathFround(LOperand* value) { inputs_[0] = value; }
84144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
842b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* value() { return inputs_[0]; }
8433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
844b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(MathFround, "math-fround")
8453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
8463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
8473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
848014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LMathAbs final : public LTemplateInstruction<1, 2, 0> {
8493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
850b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LMathAbs(LOperand* context, LOperand* value) {
851b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[1] = context;
8523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[0] = value;
85344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
85444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
855b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context() { return inputs_[1]; }
856b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* value() { return inputs_[0]; }
8573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
858b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(MathAbs, "math-abs")
859b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(UnaryMathOperation)
8603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
8613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
8623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
863014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LMathLog final : public LTemplateInstruction<1, 1, 0> {
8643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
865b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit LMathLog(LOperand* value) {
866b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[0] = value;
86744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
86844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
869b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* value() { return inputs_[0]; }
8703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
871b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(MathLog, "math-log")
8723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
8733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
8743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
875014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LMathClz32 final : public LTemplateInstruction<1, 1, 0> {
8763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
877b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit LMathClz32(LOperand* value) {
878b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[0] = value;
87944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
88044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
881b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* value() { return inputs_[0]; }
882b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
883b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(MathClz32, "math-clz32")
8843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
8853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
88621efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdochclass LMathCos final : public LTemplateInstruction<1, 1, 0> {
88721efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch public:
88821efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch  explicit LMathCos(LOperand* value) { inputs_[0] = value; }
88921efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch
89021efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch  LOperand* value() { return inputs_[0]; }
8913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
89221efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(MathCos, "math-cos")
89321efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch};
89421efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch
89521efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdochclass LMathSin final : public LTemplateInstruction<1, 1, 0> {
8963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
89721efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch  explicit LMathSin(LOperand* value) { inputs_[0] = value; }
89821efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch
89921efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch  LOperand* value() { return inputs_[0]; }
90021efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch
90121efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(MathSin, "math-sin")
90221efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch};
90321efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch
90421efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdochclass LMathExp final : public LTemplateInstruction<1, 1, 0> {
90521efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch public:
90621efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch  explicit LMathExp(LOperand* value) { inputs_[0] = value; }
90744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
908b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* value() { return inputs_[0]; }
9093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
910b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(MathExp, "math-exp")
9113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
9123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
91344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
914014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LMathSqrt final : public LTemplateInstruction<1, 1, 0> {
9153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
916b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit LMathSqrt(LOperand* value) {
917b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[0] = value;
91844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
91944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
920b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* value() { return inputs_[0]; }
9213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
922b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(MathSqrt, "math-sqrt")
9233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
9243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
9253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
926014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LMathPowHalf final : public LTemplateInstruction<1, 1, 1> {
9273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
928b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LMathPowHalf(LOperand* value, LOperand* temp) {
929b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[0] = value;
930b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    temps_[0] = temp;
931b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
932b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
933b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* value() { return inputs_[0]; }
934b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* temp() { return temps_[0]; }
935b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
936b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(MathPowHalf, "math-pow-half")
937b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
938b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
939b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
940014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LCmpObjectEqAndBranch final : public LControlInstruction<2, 0> {
941b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
942b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LCmpObjectEqAndBranch(LOperand* left, LOperand* right) {
943b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[0] = left;
944b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[1] = right;
945b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
946b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
947b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* left() { return inputs_[0]; }
948b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* right() { return inputs_[1]; }
949b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
950b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(CmpObjectEqAndBranch, "cmp-object-eq-and-branch")
951b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(CompareObjectEqAndBranch)
952b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
953b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
954b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
955014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LCmpHoleAndBranch final : public LControlInstruction<1, 0> {
956b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
957b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit LCmpHoleAndBranch(LOperand* object) {
958b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[0] = object;
959b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
960b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
961b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* object() { return inputs_[0]; }
962b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
963b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(CmpHoleAndBranch, "cmp-hole-and-branch")
964b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(CompareHoleAndBranch)
965b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
966b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
967b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
968014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LIsStringAndBranch final : public LControlInstruction<1, 1> {
969b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
970b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LIsStringAndBranch(LOperand* value, LOperand* temp) {
971b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[0] = value;
972b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    temps_[0] = temp;
973b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
974b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
975b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* value() { return inputs_[0]; }
976b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* temp() { return temps_[0]; }
977b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
978b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(IsStringAndBranch, "is-string-and-branch")
979b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(IsStringAndBranch)
980b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
981014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void PrintDataTo(StringStream* stream) override;
982b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
983b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
984b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
985014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LIsSmiAndBranch final : public LControlInstruction<1, 0> {
986b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
987b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit LIsSmiAndBranch(LOperand* value) {
988b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[0] = value;
989b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
990b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
991b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* value() { return inputs_[0]; }
992b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
993b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(IsSmiAndBranch, "is-smi-and-branch")
994b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(IsSmiAndBranch)
995b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
996014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void PrintDataTo(StringStream* stream) override;
997b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
998b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
999b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1000014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LIsUndetectableAndBranch final : public LControlInstruction<1, 1> {
1001b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
1002b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit LIsUndetectableAndBranch(LOperand* value, LOperand* temp) {
1003b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[0] = value;
1004b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    temps_[0] = temp;
1005b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1006b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1007b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* value() { return inputs_[0]; }
1008b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* temp() { return temps_[0]; }
1009b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1010b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(IsUndetectableAndBranch,
1011b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                               "is-undetectable-and-branch")
1012b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(IsUndetectableAndBranch)
1013b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1014014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void PrintDataTo(StringStream* stream) override;
1015b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
1016b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1017b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1018014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LStringCompareAndBranch final : public LControlInstruction<3, 0> {
1019b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
1020b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LStringCompareAndBranch(LOperand* context, LOperand* left, LOperand* right) {
1021b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[0] = context;
1022b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[1] = left;
1023b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[2] = right;
1024b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1025b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context() { return inputs_[0]; }
1027b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* left() { return inputs_[1]; }
1028b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* right() { return inputs_[2]; }
1029b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1030b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(StringCompareAndBranch,
1031b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                               "string-compare-and-branch")
1032b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(StringCompareAndBranch)
1033b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1034b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Token::Value op() const { return hydrogen()->token(); }
1035b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1036014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void PrintDataTo(StringStream* stream) override;
1037b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
1038b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1039b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1040014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LHasInstanceTypeAndBranch final : public LControlInstruction<1, 0> {
1041b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
1042b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit LHasInstanceTypeAndBranch(LOperand* value) {
1043b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[0] = value;
1044b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1045b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1046b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* value() { return inputs_[0]; }
1047b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(HasInstanceTypeAndBranch,
1049b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                               "has-instance-type-and-branch")
1050b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(HasInstanceTypeAndBranch)
1051b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1052014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void PrintDataTo(StringStream* stream) override;
1053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
1054b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1055b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1056014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LGetCachedArrayIndex final : public LTemplateInstruction<1, 1, 0> {
1057b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
1058b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit LGetCachedArrayIndex(LOperand* value) {
1059b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[0] = value;
1060b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1061b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1062b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* value() { return inputs_[0]; }
1063b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1064b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(GetCachedArrayIndex, "get-cached-array-index")
1065b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(GetCachedArrayIndex)
1066b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
1067b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1068b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1069014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LHasCachedArrayIndexAndBranch final : public LControlInstruction<1, 0> {
1070b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
1071b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit LHasCachedArrayIndexAndBranch(LOperand* value) {
1072b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[0] = value;
1073b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1074b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1075b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* value() { return inputs_[0]; }
1076b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1077b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(HasCachedArrayIndexAndBranch,
1078b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                               "has-cached-array-index-and-branch")
1079b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(HasCachedArrayIndexAndBranch)
1080b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1081014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void PrintDataTo(StringStream* stream) override;
1082b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
1083b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1084b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1085014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LClassOfTestAndBranch final : public LControlInstruction<1, 1> {
1086b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
1087b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LClassOfTestAndBranch(LOperand* value, LOperand* temp) {
1088b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[0] = value;
1089b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    temps_[0] = temp;
1090b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1091b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1092b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* value() { return inputs_[0]; }
1093b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* temp() { return temps_[0]; }
1094b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1095b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(ClassOfTestAndBranch,
1096b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                               "class-of-test-and-branch")
1097b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(ClassOfTestAndBranch)
1098b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1099014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void PrintDataTo(StringStream* stream) override;
1100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
1101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1103014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LCmpT final : public LTemplateInstruction<1, 3, 0> {
1104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
1105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LCmpT(LOperand* context, LOperand* left, LOperand* right) {
1106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[0] = context;
1107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[1] = left;
1108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[2] = right;
1109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context() { return inputs_[0]; }
1112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* left() { return inputs_[1]; }
1113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* right() { return inputs_[2]; }
1114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(CmpT, "cmp-t")
1116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(CompareGeneric)
1117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Token::Value op() const { return hydrogen()->token(); }
1119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
1120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1122014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LHasInPrototypeChainAndBranch final : public LControlInstruction<2, 0> {
1123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
1124014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LHasInPrototypeChainAndBranch(LOperand* object, LOperand* prototype) {
1125014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    inputs_[0] = object;
1126014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    inputs_[1] = prototype;
1127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1129014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* object() const { return inputs_[0]; }
1130014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* prototype() const { return inputs_[1]; }
1131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1132014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(HasInPrototypeChainAndBranch,
1133014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                               "has-in-prototype-chain-and-branch")
1134014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DECLARE_HYDROGEN_ACCESSOR(HasInPrototypeChainAndBranch)
1135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
1136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1138014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LBoundsCheck final : public LTemplateInstruction<0, 2, 0> {
1139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
1140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LBoundsCheck(LOperand* index, LOperand* length) {
1141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[0] = index;
1142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[1] = length;
1143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* index() { return inputs_[0]; }
1146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* length() { return inputs_[1]; }
1147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(BoundsCheck, "bounds-check")
1149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(BoundsCheck)
1150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
1151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1153014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LBitI final : public LTemplateInstruction<1, 2, 0> {
1154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
1155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LBitI(LOperand* left, LOperand* right) {
1156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[0] = left;
11573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[1] = right;
115844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
115944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* left() { return inputs_[0]; }
1161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* right() { return inputs_[1]; }
1162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
11633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Token::Value op() const { return hydrogen()->op(); }
11643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
11653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(BitI, "bit-i")
11663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(Bitwise)
11673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
11683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
11693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1170014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LShiftI final : public LTemplateInstruction<1, 2, 0> {
11713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
11723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LShiftI(Token::Value op, LOperand* left, LOperand* right, bool can_deopt)
11733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      : op_(op), can_deopt_(can_deopt) {
11743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[0] = left;
11753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[1] = right;
117644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
117744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
11783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Token::Value op() const { return op_; }
1179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* left() { return inputs_[0]; }
1180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* right() { return inputs_[1]; }
11813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool can_deopt() const { return can_deopt_; }
1182592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
11833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(ShiftI, "shift-i")
11843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
11853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private:
11863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Token::Value op_;
11873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool can_deopt_;
11883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
11893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
11903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1191014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LSubI final : public LTemplateInstruction<1, 2, 0> {
11923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
11933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LSubI(LOperand* left, LOperand* right) {
11943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[0] = left;
11953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[1] = right;
1196257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
1197257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* left() { return inputs_[0]; }
1199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* right() { return inputs_[1]; }
1200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
12013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(SubI, "sub-i")
12023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(Sub)
1203592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch};
120444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1205592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
1206014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LConstantI final : public LTemplateInstruction<1, 0, 0> {
1207592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch public:
12083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(ConstantI, "constant-i")
12093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(Constant)
1210592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
12113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  int32_t value() const { return hydrogen()->Integer32Value(); }
12123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
1213592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
12143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1215014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LConstantS final : public LTemplateInstruction<1, 0, 0> {
12163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
1217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(ConstantS, "constant-s")
12183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(Constant)
12193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Smi* value() const { return Smi::FromInt(hydrogen()->Integer32Value()); }
12213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
12223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
12233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1224014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LConstantD final : public LTemplateInstruction<1, 0, 0> {
12253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
1226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(ConstantD, "constant-d")
12273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(Constant)
12283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  double value() const { return hydrogen()->DoubleValue(); }
1230014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  uint64_t bits() const { return hydrogen()->DoubleValueAsBits(); }
12313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
12323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
12333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1234014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LConstantE final : public LTemplateInstruction<1, 0, 0> {
12353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
1236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(ConstantE, "constant-e")
1237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(Constant)
12383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ExternalReference value() const {
1240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return hydrogen()->ExternalReferenceValue();
1241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
12423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
12433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
12443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1245014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LConstantT final : public LTemplateInstruction<1, 0, 0> {
12463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
1247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(ConstantT, "constant-t")
1248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(Constant)
12493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Object> value(Isolate* isolate) const {
1251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return hydrogen()->handle(isolate);
12523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
12533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
12543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
12553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1256014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LBranch final : public LControlInstruction<1, 0> {
12573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
1258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit LBranch(LOperand* value) {
12593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[0] = value;
12603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
12613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* value() { return inputs_[0]; }
12633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(Branch, "branch")
1265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(Branch)
12663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1267014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void PrintDataTo(StringStream* stream) override;
12683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
12693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
12703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1271014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LCmpMapAndBranch final : public LControlInstruction<1, 1> {
12723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
1273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LCmpMapAndBranch(LOperand* value, LOperand* temp) {
12743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[0] = value;
1275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    temps_[0] = temp;
12763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
12773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* value() { return inputs_[0]; }
1279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* temp() { return temps_[0]; }
1280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(CmpMapAndBranch, "cmp-map-and-branch")
1282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(CompareMap)
1283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Map> map() const { return hydrogen()->map().handle(); }
12853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
12863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
12873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1288014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LSeqStringGetChar final : public LTemplateInstruction<1, 2, 0> {
12893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
1290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LSeqStringGetChar(LOperand* string, LOperand* index) {
1291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[0] = string;
1292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[1] = index;
12933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
12943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* string() const { return inputs_[0]; }
1296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* index() const { return inputs_[1]; }
1297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(SeqStringGetChar, "seq-string-get-char")
1299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(SeqStringGetChar)
13003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
13013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
13023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1303014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LSeqStringSetChar final : public LTemplateInstruction<1, 4, 0> {
13043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
1305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LSeqStringSetChar(LOperand* context,
1306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                    LOperand* string,
1307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                    LOperand* index,
1308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                    LOperand* value) {
1309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[0] = context;
1310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[1] = string;
1311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[2] = index;
1312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[3] = value;
13133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
13143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* string() { return inputs_[1]; }
1316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* index() { return inputs_[2]; }
1317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* value() { return inputs_[3]; }
1318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(SeqStringSetChar, "seq-string-set-char")
1320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(SeqStringSetChar)
13213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
13223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
13233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1324014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LAddI final : public LTemplateInstruction<1, 2, 0> {
13253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
13263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LAddI(LOperand* left, LOperand* right) {
13273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[0] = left;
13283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[1] = right;
13293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
13303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* left() { return inputs_[0]; }
1332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* right() { return inputs_[1]; }
1333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
13343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(AddI, "add-i")
13353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(Add)
13363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
13373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
13383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1339014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LMathMinMax final : public LTemplateInstruction<1, 2, 0> {
13403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
1341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LMathMinMax(LOperand* left, LOperand* right) {
13423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[0] = left;
13433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[1] = right;
13443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
13453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* left() { return inputs_[0]; }
1347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* right() { return inputs_[1]; }
1348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(MathMinMax, "math-min-max")
1350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(MathMinMax)
13513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
13523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
13533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1354014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LPower final : public LTemplateInstruction<1, 2, 0> {
13553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
1356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LPower(LOperand* left, LOperand* right) {
1357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[0] = left;
1358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[1] = right;
13593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
13603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* left() { return inputs_[0]; }
1362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* right() { return inputs_[1]; }
1363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(Power, "power")
1365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(Power)
13663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
13673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
13683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1369014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LArithmeticD final : public LTemplateInstruction<1, 2, 0> {
13703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
13713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LArithmeticD(Token::Value op, LOperand* left, LOperand* right)
13723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      : op_(op) {
13733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[0] = left;
13743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[1] = right;
13753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
13763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
13773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Token::Value op() const { return op_; }
1378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* left() { return inputs_[0]; }
1379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* right() { return inputs_[1]; }
13803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1381014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Opcode opcode() const override { return LInstruction::kArithmeticD; }
1382014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void CompileToNative(LCodeGen* generator) override;
1383014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  const char* Mnemonic() const override;
13843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
13853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private:
13863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Token::Value op_;
13873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
13883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
13893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1390014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LArithmeticT final : public LTemplateInstruction<1, 3, 0> {
13913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
1392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LArithmeticT(Token::Value op,
1393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch               LOperand* context,
1394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch               LOperand* left,
1395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch               LOperand* right)
13963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      : op_(op) {
1397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[0] = context;
1398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[1] = left;
1399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[2] = right;
14003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
14013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context() { return inputs_[0]; }
1403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* left() { return inputs_[1]; }
1404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* right() { return inputs_[2]; }
14053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Token::Value op() const { return op_; }
14063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1407014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Opcode opcode() const final { return LInstruction::kArithmeticT; }
1408014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void CompileToNative(LCodeGen* generator) override;
1409014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  const char* Mnemonic() const override;
1410014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1411014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DECLARE_HYDROGEN_ACCESSOR(BinaryOperation)
1412014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
14133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private:
14143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Token::Value op_;
14153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
14163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
14173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1418014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LReturn final : public LTemplateInstruction<0, 3, 0> {
14193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
1420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LReturn(LOperand* value, LOperand* context, LOperand* parameter_count) {
14213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[0] = value;
1422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[1] = context;
1423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[2] = parameter_count;
14243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
14253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* value() { return inputs_[0]; }
1427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool has_constant_parameter_count() {
1429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return parameter_count()->IsConstantOperand();
1430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LConstantOperand* constant_parameter_count() {
1432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(has_constant_parameter_count());
1433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return LConstantOperand::cast(parameter_count());
1434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* parameter_count() { return inputs_[2]; }
1436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
14373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(Return, "return")
14383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
14393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
14403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1441014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LLoadNamedField final : public LTemplateInstruction<1, 1, 0> {
14423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
14433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  explicit LLoadNamedField(LOperand* object) {
14443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[0] = object;
14453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
14463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* object() { return inputs_[0]; }
1448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
14493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(LoadNamedField, "load-named-field")
14503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(LoadNamedField)
14513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
14523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
14533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1454014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LLoadNamedGeneric final : public LTemplateInstruction<1, 2, 1> {
14553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
1456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LLoadNamedGeneric(LOperand* context, LOperand* object, LOperand* vector) {
1457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[0] = context;
1458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[1] = object;
1459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    temps_[0] = vector;
14603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
14613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context() { return inputs_[0]; }
1463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* object() { return inputs_[1]; }
1464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* temp_vector() { return temps_[0]; }
14653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
14663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(LoadNamedGeneric, "load-named-generic")
14673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(LoadNamedGeneric)
14683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
14693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Handle<Object> name() const { return hydrogen()->name(); }
14703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
14713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
14723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1473014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LLoadFunctionPrototype final : public LTemplateInstruction<1, 1, 0> {
14743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
14753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  explicit LLoadFunctionPrototype(LOperand* function) {
14763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[0] = function;
14773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
14783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
14793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* function() { return inputs_[0]; }
14803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(LoadFunctionPrototype, "load-function-prototype")
1482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(LoadFunctionPrototype)
14833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
14843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
14853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1486014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LLoadRoot final : public LTemplateInstruction<1, 0, 0> {
14873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
1488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(LoadRoot, "load-root")
1489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(LoadRoot)
14903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Heap::RootListIndex index() const { return hydrogen()->index(); }
14923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
14933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
14943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1495014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LLoadKeyed final : public LTemplateInstruction<1, 3, 0> {
14963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
1497014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LLoadKeyed(LOperand* elements, LOperand* key, LOperand* backing_store_owner) {
14983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[0] = elements;
14993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[1] = key;
1500014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    inputs_[2] = backing_store_owner;
15013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
15023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
15033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* elements() { return inputs_[0]; }
15043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* key() { return inputs_[1]; }
1505014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* backing_store_owner() { return inputs_[2]; }
1506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ElementsKind elements_kind() const {
1507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return hydrogen()->elements_kind();
15083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
1509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool is_fixed_typed_array() const {
1510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return hydrogen()->is_fixed_typed_array();
1511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
15123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(LoadKeyed, "load-keyed")
1514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(LoadKeyed)
15153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1516014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void PrintDataTo(StringStream* stream) override;
1517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  uint32_t base_offset() const { return hydrogen()->base_offset(); }
15183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
15193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
15203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1521014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LLoadKeyedGeneric final : public LTemplateInstruction<1, 3, 1> {
15223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
1523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LLoadKeyedGeneric(LOperand* context, LOperand* object, LOperand* key,
1524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                    LOperand* vector) {
1525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[0] = context;
1526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[1] = object;
1527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[2] = key;
1528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    temps_[0] = vector;
15293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
15303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context() { return inputs_[0]; }
1532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* object() { return inputs_[1]; }
1533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* key() { return inputs_[2]; }
1534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* temp_vector() { return temps_[0]; }
15353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1536b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(LoadKeyedGeneric, "load-keyed-generic")
1537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(LoadKeyedGeneric)
15383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
15393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
154021efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdochclass LLoadGlobalGeneric final : public LTemplateInstruction<1, 1, 1> {
15413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
154221efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch  LLoadGlobalGeneric(LOperand* context, LOperand* vector) {
1543b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[0] = context;
1544b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    temps_[0] = vector;
15453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
15463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context() { return inputs_[0]; }
1548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* temp_vector() { return temps_[0]; }
1549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
15503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(LoadGlobalGeneric, "load-global-generic")
15513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(LoadGlobalGeneric)
15523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
15533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Handle<Object> name() const { return hydrogen()->name(); }
1554014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  TypeofMode typeof_mode() const { return hydrogen()->typeof_mode(); }
15553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
15563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
15573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1558014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LLoadContextSlot final : public LTemplateInstruction<1, 1, 0> {
15593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
15603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  explicit LLoadContextSlot(LOperand* context) {
15613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[0] = context;
15623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
15633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context() { return inputs_[0]; }
1565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
15663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(LoadContextSlot, "load-context-slot")
15673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(LoadContextSlot)
15683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
15693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  int slot_index() { return hydrogen()->slot_index(); }
15703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1571014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void PrintDataTo(StringStream* stream) override;
15723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
15733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
15743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1575014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LStoreContextSlot final : public LTemplateInstruction<0, 2, 0> {
15763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
15773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LStoreContextSlot(LOperand* context, LOperand* value) {
15783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[0] = context;
15793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[1] = value;
15803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
15813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context() { return inputs_[0]; }
1583b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* value() { return inputs_[1]; }
1584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
15853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(StoreContextSlot, "store-context-slot")
15863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(StoreContextSlot)
15873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
15883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  int slot_index() { return hydrogen()->slot_index(); }
15893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1590014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void PrintDataTo(StringStream* stream) override;
15913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
15923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
15933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1594014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LPushArgument final : public LTemplateInstruction<0, 1, 0> {
15953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
15963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  explicit LPushArgument(LOperand* value) {
15973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[0] = value;
15983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
15993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1600b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* value() { return inputs_[0]; }
1601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
16023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(PushArgument, "push-argument")
16033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
16043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
16053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1606014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LDrop final : public LTemplateInstruction<0, 0, 0> {
16073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
1608b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit LDrop(int count) : count_(count) { }
1609b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1610b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int count() const { return count_; }
1611b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1612b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(Drop, "drop")
1613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
1615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int count_;
16163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
16173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
16183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1619014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LStoreCodeEntry final : public LTemplateInstruction<0, 2, 0> {
16203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
1621b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LStoreCodeEntry(LOperand* function, LOperand* code_object) {
1622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[0] = function;
1623b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[1] = code_object;
1624b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1625b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* function() { return inputs_[0]; }
1627b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* code_object() { return inputs_[1]; }
1628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1629014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void PrintDataTo(StringStream* stream) override;
1630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1631b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(StoreCodeEntry, "store-code-entry")
1632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(StoreCodeEntry)
16333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
16343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
16353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1636014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LInnerAllocatedObject final : public LTemplateInstruction<1, 2, 0> {
16373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
1638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInnerAllocatedObject(LOperand* base_object, LOperand* offset) {
1639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[0] = base_object;
1640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[1] = offset;
16413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
16423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1643b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* base_object() const { return inputs_[0]; }
1644b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* offset() const { return inputs_[1]; }
16453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1646014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void PrintDataTo(StringStream* stream) override;
1647b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(InnerAllocatedObject, "inner-allocated-object")
16493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
16503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
16513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1652014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LThisFunction final : public LTemplateInstruction<1, 0, 0> {
16533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
1654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(ThisFunction, "this-function")
1655b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(ThisFunction)
16563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
16573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
16583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1659014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LContext final : public LTemplateInstruction<1, 0, 0> {
16603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
1661b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(Context, "context")
1662b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(Context)
1663b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
1664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1666014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LDeclareGlobals final : public LTemplateInstruction<0, 1, 0> {
1667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
1668b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit LDeclareGlobals(LOperand* context) {
16693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[0] = context;
16703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
16713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context() { return inputs_[0]; }
16733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1674b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(DeclareGlobals, "declare-globals")
1675b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(DeclareGlobals)
16763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
16773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
16783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1679014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LCallWithDescriptor final : public LTemplateResultInstruction<1> {
16803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
1681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LCallWithDescriptor(CallInterfaceDescriptor descriptor,
1682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                      const ZoneList<LOperand*>& operands, Zone* zone)
1683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : descriptor_(descriptor),
1684014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        inputs_(descriptor.GetRegisterParameterCount() +
1685014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                    kImplicitRegisterParameterCount,
1686014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                zone) {
1687014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    DCHECK(descriptor.GetRegisterParameterCount() +
1688014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch               kImplicitRegisterParameterCount ==
1689014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch           operands.length());
1690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_.AddAll(operands, zone);
1691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
16923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1693b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* target() const { return inputs_[0]; }
1694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const CallInterfaceDescriptor descriptor() { return descriptor_; }
1696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1697958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(CallWithDescriptor)
1698958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1699014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // The target and context are passed as implicit parameters that are not
1700014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // explicitly listed in the descriptor.
1701014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const int kImplicitRegisterParameterCount = 2;
1702014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1703b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
1704b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(CallWithDescriptor, "call-with-descriptor")
1705b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1706014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void PrintDataTo(StringStream* stream) override;
17073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
17083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  int arity() const { return hydrogen()->argument_count() - 1; }
1709b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CallInterfaceDescriptor descriptor_;
1711b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ZoneList<LOperand*> inputs_;
1712b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1713b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Iterator support.
1714014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int InputCount() final { return inputs_.length(); }
1715014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* InputAt(int i) final { return inputs_[i]; }
1716b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1717014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int TempCount() final { return 0; }
1718014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* TempAt(int i) final { return NULL; }
17193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
17203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
17213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1722014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LInvokeFunction final : public LTemplateInstruction<1, 2, 0> {
17233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
1724b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInvokeFunction(LOperand* context, LOperand* function) {
1725b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[0] = context;
1726b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[1] = function;
17273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
17283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1729b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context() { return inputs_[0]; }
1730b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* function() { return inputs_[1]; }
1731b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
17323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(InvokeFunction, "invoke-function")
17333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(InvokeFunction)
17343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1735014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void PrintDataTo(StringStream* stream) override;
17363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
17373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  int arity() const { return hydrogen()->argument_count() - 1; }
17383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
17393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
17403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1741014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LCallNewArray final : public LTemplateInstruction<1, 2, 0> {
17423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
1743b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LCallNewArray(LOperand* context, LOperand* constructor) {
1744b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[0] = context;
1745b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[1] = constructor;
17463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
17473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1748b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context() { return inputs_[0]; }
1749b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* constructor() { return inputs_[1]; }
1750b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1751b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(CallNewArray, "call-new-array")
1752b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(CallNewArray)
1753b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1754014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void PrintDataTo(StringStream* stream) override;
17553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
17563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  int arity() const { return hydrogen()->argument_count() - 1; }
17573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
17583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
17593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1760014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LCallRuntime final : public LTemplateInstruction<1, 1, 0> {
17613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
1762b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit LCallRuntime(LOperand* context) {
1763b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[0] = context;
1764b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
17653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1766b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context() { return inputs_[0]; }
17673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1768b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(CallRuntime, "call-runtime")
1769b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(CallRuntime)
1770b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1771014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool ClobbersDoubleRegisters(Isolate* isolate) const override {
1772b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return save_doubles() == kDontSaveFPRegs;
1773b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1774b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1775b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const Runtime::Function* function() const { return hydrogen()->function(); }
1776b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int arity() const { return hydrogen()->argument_count(); }
1777b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SaveFPRegsMode save_doubles() const { return hydrogen()->save_doubles(); }
17783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
17793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
17803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1781014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LInteger32ToDouble final : public LTemplateInstruction<1, 1, 0> {
17823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
1783b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit LInteger32ToDouble(LOperand* value) {
1784b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[0] = value;
1785b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
17863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1787b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* value() { return inputs_[0]; }
17883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1789b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(Integer32ToDouble, "int32-to-double")
17903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
17913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
17923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1793014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LUint32ToDouble final : public LTemplateInstruction<1, 1, 0> {
17943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
1795b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit LUint32ToDouble(LOperand* value) {
1796b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[0] = value;
17973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
17983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1799b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* value() { return inputs_[0]; }
18003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1801b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(Uint32ToDouble, "uint32-to-double")
18023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
18033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
18043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1805014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LNumberTagI final : public LTemplateInstruction<1, 1, 2> {
1806b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
1807b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LNumberTagI(LOperand* value, LOperand* temp1, LOperand* temp2) {
1808b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[0] = value;
1809b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    temps_[0] = temp1;
1810b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    temps_[1] = temp2;
1811b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1813b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* value() { return inputs_[0]; }
1814b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* temp1() { return temps_[0]; }
1815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* temp2() { return temps_[1]; }
18163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1817b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(NumberTagI, "number-tag-i")
18183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
18193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
18203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1821014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LNumberTagU final : public LTemplateInstruction<1, 1, 2> {
18223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
1823b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LNumberTagU(LOperand* value, LOperand* temp1, LOperand* temp2) {
18243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[0] = value;
1825b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    temps_[0] = temp1;
1826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    temps_[1] = temp2;
18273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
18283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1829b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* value() { return inputs_[0]; }
1830b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* temp1() { return temps_[0]; }
1831b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* temp2() { return temps_[1]; }
1832b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1833b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(NumberTagU, "number-tag-u")
18343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
18353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
18363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1837014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LNumberTagD final : public LTemplateInstruction<1, 1, 2> {
18383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
1839b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LNumberTagD(LOperand* value, LOperand* temp, LOperand* temp2) {
18403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[0] = value;
1841b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    temps_[0] = temp;
1842b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    temps_[1] = temp2;
18433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
18443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1845b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* value() { return inputs_[0]; }
1846b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* temp() { return temps_[0]; }
1847b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* temp2() { return temps_[1]; }
1848b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1849b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(NumberTagD, "number-tag-d")
1850b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(Change)
18513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
18523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
18533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1854014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LDoubleToSmi final : public LTemplateInstruction<1, 1, 0> {
18553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
1856b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit LDoubleToSmi(LOperand* value) {
18573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[0] = value;
18583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
18593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1860b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* value() { return inputs_[0]; }
1861b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1862b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(DoubleToSmi, "double-to-smi")
1863b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(UnaryOperation)
1864b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1865b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool truncating() { return hydrogen()->CanTruncateToInt32(); }
18663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
18673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
18683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
18693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Sometimes truncating conversion from a tagged value to an int32.
1870014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LDoubleToI final : public LTemplateInstruction<1, 1, 0> {
18713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
1872b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit LDoubleToI(LOperand* value) {
18733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[0] = value;
18743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
18753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1876b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* value() { return inputs_[0]; }
1877b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
18783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(DoubleToI, "double-to-i")
18793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(UnaryOperation)
18803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
18813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool truncating() { return hydrogen()->CanTruncateToInt32(); }
18823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
18833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
18843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
18853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Truncating conversion from a tagged value to an int32.
1886014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LTaggedToI final : public LTemplateInstruction<1, 1, 2> {
18873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
18883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LTaggedToI(LOperand* value,
1889b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch             LOperand* temp,
1890b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch             LOperand* temp2) {
18913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[0] = value;
1892b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    temps_[0] = temp;
18933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    temps_[1] = temp2;
18943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
18953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1896b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* value() { return inputs_[0]; }
1897b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* temp() { return temps_[0]; }
1898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* temp2() { return temps_[1]; }
1899b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
19003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(TaggedToI, "tagged-to-i")
1901b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(Change)
19023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
19033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool truncating() { return hydrogen()->CanTruncateToInt32(); }
19043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
19053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
19063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1907014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LSmiTag final : public LTemplateInstruction<1, 1, 0> {
19083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
19093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  explicit LSmiTag(LOperand* value) {
19103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[0] = value;
19113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
19123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1913b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* value() { return inputs_[0]; }
1914b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
19153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(SmiTag, "smi-tag")
1916b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(Change)
19173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
19183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
19193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1920014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LNumberUntagD final : public LTemplateInstruction<1, 1, 0> {
19213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
19223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  explicit LNumberUntagD(LOperand* value) {
19233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[0] = value;
19243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
19253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1926b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* value() { return inputs_[0]; }
1927b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
19283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(NumberUntagD, "double-untag")
19293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(Change)
19303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
19313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
19323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1933014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LSmiUntag final : public LTemplateInstruction<1, 1, 0> {
19343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
19353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LSmiUntag(LOperand* value, bool needs_check)
19363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      : needs_check_(needs_check) {
19373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[0] = value;
19383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
19393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1940b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* value() { return inputs_[0]; }
19413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool needs_check() const { return needs_check_; }
19423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1943b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(SmiUntag, "smi-untag")
1944b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
19453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private:
19463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool needs_check_;
19473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
19483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
19493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1950014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LStoreNamedField final : public LTemplateInstruction<0, 2, 1> {
19513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
1952b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LStoreNamedField(LOperand* object, LOperand* value, LOperand* temp) {
1953b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[0] = object;
1954b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[1] = value;
1955b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    temps_[0] = temp;
19563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
19573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1958b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* object() { return inputs_[0]; }
1959b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* value() { return inputs_[1]; }
1960b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* temp() { return temps_[0]; }
1961b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
19623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(StoreNamedField, "store-named-field")
19633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(StoreNamedField)
19643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1965014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void PrintDataTo(StringStream* stream) override;
19663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1967b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Representation representation() const {
1968b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return hydrogen()->field_representation();
1969b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
19703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
19713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
19723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1973014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LStoreNamedGeneric final : public LTemplateInstruction<0, 3, 2> {
19743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
1975014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LStoreNamedGeneric(LOperand* context, LOperand* object, LOperand* value,
1976014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                     LOperand* slot, LOperand* vector) {
1977b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[0] = context;
1978b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[1] = object;
1979b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[2] = value;
1980014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    temps_[0] = slot;
1981014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    temps_[1] = vector;
19823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
19833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1984b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context() { return inputs_[0]; }
1985b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* object() { return inputs_[1]; }
1986b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* value() { return inputs_[2]; }
1987014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* temp_slot() { return temps_[0]; }
1988014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* temp_vector() { return temps_[1]; }
1989b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
19903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(StoreNamedGeneric, "store-named-generic")
19913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(StoreNamedGeneric)
19923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1993014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void PrintDataTo(StringStream* stream) override;
19943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
19953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Handle<Object> name() const { return hydrogen()->name(); }
1996014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LanguageMode language_mode() { return hydrogen()->language_mode(); }
19973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
19983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
19993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2000014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LStoreKeyed final : public LTemplateInstruction<0, 4, 0> {
20013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
2002014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LStoreKeyed(LOperand* object, LOperand* key, LOperand* value,
2003014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              LOperand* backing_store_owner) {
2004b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[0] = object;
20053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[1] = key;
2006b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[2] = value;
2007014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    inputs_[3] = backing_store_owner;
20083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
20093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2010b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool is_fixed_typed_array() const {
2011b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return hydrogen()->is_fixed_typed_array();
2012b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2013b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* elements() { return inputs_[0]; }
20143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* key() { return inputs_[1]; }
20153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* value() { return inputs_[2]; }
2016014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* backing_store_owner() { return inputs_[3]; }
2017b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ElementsKind elements_kind() const {
2018b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return hydrogen()->elements_kind();
20193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
20203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2021b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(StoreKeyed, "store-keyed")
2022b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(StoreKeyed)
20233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2024014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void PrintDataTo(StringStream* stream) override;
2025b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool NeedsCanonicalization() { return hydrogen()->NeedsCanonicalization(); }
2026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  uint32_t base_offset() const { return hydrogen()->base_offset(); }
20273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
20283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
20293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2030014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LStoreKeyedGeneric final : public LTemplateInstruction<0, 4, 2> {
20313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
2032014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LStoreKeyedGeneric(LOperand* context, LOperand* object, LOperand* key,
2033014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                     LOperand* value, LOperand* slot, LOperand* vector) {
2034b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[0] = context;
2035014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    inputs_[1] = object;
2036b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[2] = key;
2037b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[3] = value;
2038014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    temps_[0] = slot;
2039014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    temps_[1] = vector;
20403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
20413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2042b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context() { return inputs_[0]; }
2043b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* object() { return inputs_[1]; }
2044b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* key() { return inputs_[2]; }
2045b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* value() { return inputs_[3]; }
2046014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* temp_slot() { return temps_[0]; }
2047014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* temp_vector() { return temps_[1]; }
2048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
20493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(StoreKeyedGeneric, "store-keyed-generic")
20503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(StoreKeyedGeneric)
20513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2052014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void PrintDataTo(StringStream* stream) override;
20533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2054014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LanguageMode language_mode() { return hydrogen()->language_mode(); }
20553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
20563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
20573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2058014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LTransitionElementsKind final : public LTemplateInstruction<0, 2, 1> {
20593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
20603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LTransitionElementsKind(LOperand* object,
2061b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                          LOperand* context,
2062b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                          LOperand* new_map_temp) {
20633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[0] = object;
2064b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[1] = context;
20653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    temps_[0] = new_map_temp;
20663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
20673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2068b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context() { return inputs_[1]; }
2069b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* object() { return inputs_[0]; }
2070b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* new_map_temp() { return temps_[0]; }
2071b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
20723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(TransitionElementsKind,
20733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                               "transition-elements-kind")
20743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(TransitionElementsKind)
20753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2076014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void PrintDataTo(StringStream* stream) override;
20773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2078b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Map> original_map() { return hydrogen()->original_map().handle(); }
2079b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Map> transitioned_map() {
2080b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return hydrogen()->transitioned_map().handle();
2081b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2082b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ElementsKind from_kind() { return hydrogen()->from_kind(); }
2083b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ElementsKind to_kind() { return hydrogen()->to_kind(); }
20843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
20853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
20863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2087014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LTrapAllocationMemento final : public LTemplateInstruction<0, 1, 1> {
20883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
2089b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LTrapAllocationMemento(LOperand* object,
2090b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                         LOperand* temp) {
2091b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[0] = object;
2092b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    temps_[0] = temp;
20933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
20943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2095b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* object() { return inputs_[0]; }
2096b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* temp() { return temps_[0]; }
20973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2098b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(TrapAllocationMemento,
2099b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                               "trap-allocation-memento")
21003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
21013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2103014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LMaybeGrowElements final : public LTemplateInstruction<1, 5, 0> {
2104014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public:
2105014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LMaybeGrowElements(LOperand* context, LOperand* object, LOperand* elements,
2106014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                     LOperand* key, LOperand* current_capacity) {
2107014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    inputs_[0] = context;
2108014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    inputs_[1] = object;
2109014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    inputs_[2] = elements;
2110014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    inputs_[3] = key;
2111014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    inputs_[4] = current_capacity;
2112014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
2113014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2114014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* context() { return inputs_[0]; }
2115014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* object() { return inputs_[1]; }
2116014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* elements() { return inputs_[2]; }
2117014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* key() { return inputs_[3]; }
2118014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* current_capacity() { return inputs_[4]; }
2119014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2120014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DECLARE_HYDROGEN_ACCESSOR(MaybeGrowElements)
2121014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(MaybeGrowElements, "maybe-grow-elements")
2122014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch};
2123014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2124014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2125014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LStringAdd final : public LTemplateInstruction<1, 3, 0> {
21263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
2127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LStringAdd(LOperand* context, LOperand* left, LOperand* right) {
2128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[0] = context;
2129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[1] = left;
2130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[2] = right;
21313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
21323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context() { return inputs_[0]; }
2134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* left() { return inputs_[1]; }
2135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* right() { return inputs_[2]; }
21363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(StringAdd, "string-add")
2138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(StringAdd)
21393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
21403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2142014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LStringCharCodeAt final : public LTemplateInstruction<1, 3, 0> {
21433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
2144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LStringCharCodeAt(LOperand* context, LOperand* string, LOperand* index) {
2145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[0] = context;
2146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[1] = string;
2147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[2] = index;
21483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
21493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context() { return inputs_[0]; }
2151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* string() { return inputs_[1]; }
2152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* index() { return inputs_[2]; }
21533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(StringCharCodeAt, "string-char-code-at")
2155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(StringCharCodeAt)
21563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
21573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2159014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LStringCharFromCode final : public LTemplateInstruction<1, 2, 0> {
21603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
2161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit LStringCharFromCode(LOperand* context, LOperand* char_code) {
2162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[0] = context;
2163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[1] = char_code;
21643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
21653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context() { return inputs_[0]; }
2167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* char_code() { return inputs_[1]; }
21683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(StringCharFromCode, "string-char-from-code")
2170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(StringCharFromCode)
21713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
21723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2174014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LCheckValue final : public LTemplateInstruction<0, 1, 0> {
21753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
2176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit LCheckValue(LOperand* value) {
21773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[0] = value;
21783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
21793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* value() { return inputs_[0]; }
21813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(CheckValue, "check-value")
2183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(CheckValue)
21843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
21853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2187014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LCheckArrayBufferNotNeutered final
2188014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    : public LTemplateInstruction<0, 1, 0> {
2189014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public:
2190014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  explicit LCheckArrayBufferNotNeutered(LOperand* view) { inputs_[0] = view; }
2191014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2192014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* view() { return inputs_[0]; }
2193014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2194014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CheckArrayBufferNotNeutered,
2195014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                               "check-array-buffer-not-neutered")
2196014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DECLARE_HYDROGEN_ACCESSOR(CheckArrayBufferNotNeutered)
2197014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch};
2198014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2199014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2200014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LCheckInstanceType final : public LTemplateInstruction<0, 1, 0> {
22013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
22023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  explicit LCheckInstanceType(LOperand* value) {
22033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[0] = value;
22043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
22053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* value() { return inputs_[0]; }
2207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
22083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(CheckInstanceType, "check-instance-type")
22093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(CheckInstanceType)
22103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
22113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
22123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2213014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LCheckMaps final : public LTemplateInstruction<0, 1, 0> {
22143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
2215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit LCheckMaps(LOperand* value = NULL) {
22163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[0] = value;
22173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
22183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* value() { return inputs_[0]; }
22203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(CheckMaps, "check-maps")
2222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(CheckMaps)
22233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
22243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
22253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2226014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LCheckSmi final : public LTemplateInstruction<1, 1, 0> {
22273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
22283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  explicit LCheckSmi(LOperand* value) {
22293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[0] = value;
22303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
22313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* value() { return inputs_[0]; }
2233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
22343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(CheckSmi, "check-smi")
22353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
22363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
22373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2238014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LCheckNonSmi final : public LTemplateInstruction<0, 1, 0> {
22393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
22403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  explicit LCheckNonSmi(LOperand* value) {
22413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[0] = value;
22423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
22433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* value() { return inputs_[0]; }
2245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
22463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(CheckNonSmi, "check-non-smi")
2247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(CheckHeapObject)
22483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
22493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
22503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2251014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LClampDToUint8 final : public LTemplateInstruction<1, 1, 1> {
22523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
2253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LClampDToUint8(LOperand* unclamped, LOperand* temp) {
2254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[0] = unclamped;
22553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    temps_[0] = temp;
22563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
22573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
22583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* unclamped() { return inputs_[0]; }
2259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* temp() { return temps_[0]; }
22603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
22613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(ClampDToUint8, "clamp-d-to-uint8")
22623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
22633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
22643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2265014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LClampIToUint8 final : public LTemplateInstruction<1, 1, 0> {
22663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
2267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit LClampIToUint8(LOperand* unclamped) {
2268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[0] = unclamped;
22693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
22703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
22713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* unclamped() { return inputs_[0]; }
22723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
22733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(ClampIToUint8, "clamp-i-to-uint8")
22743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
22753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
22763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2277014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LClampTToUint8 final : public LTemplateInstruction<1, 1, 1> {
22783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
2279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LClampTToUint8(LOperand* unclamped, LOperand* temp) {
2280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[0] = unclamped;
22813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    temps_[0] = temp;
22823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
22833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
22843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* unclamped() { return inputs_[0]; }
2285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* temp() { return temps_[0]; }
22863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
22873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(ClampTToUint8, "clamp-t-to-uint8")
22883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
22893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
22903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2291014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LDoubleBits final : public LTemplateInstruction<1, 1, 0> {
22923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
2293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit LDoubleBits(LOperand* value) {
2294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[0] = value;
22953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
22963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* value() { return inputs_[0]; }
2298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(DoubleBits, "double-bits")
2300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(DoubleBits)
23013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
23023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
23033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2304014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LAllocate final : public LTemplateInstruction<1, 2, 2> {
23053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
2306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LAllocate(LOperand* context,
2307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            LOperand* size,
2308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            LOperand* temp1,
2309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            LOperand* temp2) {
2310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[0] = context;
2311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[1] = size;
2312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    temps_[0] = temp1;
2313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    temps_[1] = temp2;
2314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context() { return inputs_[0]; }
2317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* size() { return inputs_[1]; }
2318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* temp1() { return temps_[0]; }
2319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* temp2() { return temps_[1]; }
2320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(Allocate, "allocate")
2322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(Allocate)
23233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
23243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2325537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdochclass LFastAllocate final : public LTemplateInstruction<1, 1, 2> {
2326537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch public:
2327537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch  LFastAllocate(LOperand* size, LOperand* temp1, LOperand* temp2) {
2328537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch    inputs_[0] = size;
2329537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch    temps_[0] = temp1;
2330537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch    temps_[1] = temp2;
2331537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch  }
2332537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch
2333537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch  LOperand* size() { return inputs_[0]; }
2334537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch  LOperand* temp1() { return temps_[0]; }
2335537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch  LOperand* temp2() { return temps_[1]; }
2336537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch
2337537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(FastAllocate, "fast-allocate")
2338537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch  DECLARE_HYDROGEN_ACCESSOR(Allocate)
2339537ba893e2530051ec7f296e769fdd37bb4ae4a0Ben Murdoch};
23403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2341014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LTypeof final : public LTemplateInstruction<1, 2, 0> {
23423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
2343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LTypeof(LOperand* context, LOperand* value) {
2344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[0] = context;
2345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[1] = value;
23463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
23473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context() { return inputs_[0]; }
2349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* value() { return inputs_[1]; }
2350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
23513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(Typeof, "typeof")
23523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
23533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
23543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2355014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LTypeofIsAndBranch final : public LControlInstruction<1, 0> {
23563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
23573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  explicit LTypeofIsAndBranch(LOperand* value) {
23583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[0] = value;
23593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
23603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* value() { return inputs_[0]; }
2362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
23633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(TypeofIsAndBranch, "typeof-is-and-branch")
23643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(TypeofIsAndBranch)
23653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
23663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Handle<String> type_literal() { return hydrogen()->type_literal(); }
23673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2368014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void PrintDataTo(StringStream* stream) override;
23693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
23703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
23713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2372014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LOsrEntry final : public LTemplateInstruction<0, 0, 0> {
23733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
2374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOsrEntry() {}
23753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2376014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool HasInterestingComment(LCodeGen* gen) const override { return false; }
2377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(OsrEntry, "osr-entry")
23783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
23793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
23803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2381014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LStackCheck final : public LTemplateInstruction<0, 1, 0> {
23823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
2383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit LStackCheck(LOperand* context) {
2384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[0] = context;
2385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
23863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context() { return inputs_[0]; }
23883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
23893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(StackCheck, "stack-check")
23903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_HYDROGEN_ACCESSOR(StackCheck)
23913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
23923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Label* done_label() { return &done_label_; }
23933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
23943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private:
23953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Label done_label_;
23963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
23973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
23983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2399014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LForInPrepareMap final : public LTemplateInstruction<1, 2, 0> {
24003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
2401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LForInPrepareMap(LOperand* context, LOperand* object) {
2402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    inputs_[0] = context;
24033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[1] = object;
24043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
24053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* context() { return inputs_[0]; }
24073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* object() { return inputs_[1]; }
24083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
24093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(ForInPrepareMap, "for-in-prepare-map")
24103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
24113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
24123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2413014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LForInCacheArray final : public LTemplateInstruction<1, 1, 0> {
24143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
24153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  explicit LForInCacheArray(LOperand* map) {
24163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[0] = map;
24173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
24183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
24193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* map() { return inputs_[0]; }
24203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
24213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(ForInCacheArray, "for-in-cache-array")
24223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
24233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  int idx() {
24243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return HForInCacheArray::cast(this->hydrogen_value())->idx();
24253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
24263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
24273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
24283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2429014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LCheckMapValue final : public LTemplateInstruction<0, 2, 0> {
24303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
24313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LCheckMapValue(LOperand* value, LOperand* map) {
24323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[0] = value;
24333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[1] = map;
24343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
24353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
24363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* value() { return inputs_[0]; }
24373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* map() { return inputs_[1]; }
24383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
24393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(CheckMapValue, "check-map-value")
24403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
24413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
24423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2443014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LLoadFieldByIndex final : public LTemplateInstruction<1, 2, 0> {
24443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
24453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LLoadFieldByIndex(LOperand* object, LOperand* index) {
24463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[0] = object;
24473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    inputs_[1] = index;
24483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
24493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
24503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* object() { return inputs_[0]; }
24513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LOperand* index() { return inputs_[1]; }
24523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
24533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(LoadFieldByIndex, "load-field-by-index")
24543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
24553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
24563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass LChunkBuilder;
2458014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LPlatformChunk final : public LChunk {
2459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
2460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LPlatformChunk(CompilationInfo* info, HGraph* graph)
2461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : LChunk(info, graph) { }
2462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int GetNextSpillIndex(RegisterKind kind);
2464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LOperand* GetNextSpillSlot(RegisterKind kind);
2465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
2466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2468014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LChunkBuilder final : public LChunkBuilderBase {
24693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public:
24703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LChunkBuilder(CompilationInfo* info, HGraph* graph, LAllocator* allocator)
2471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : LChunkBuilderBase(info, graph),
24723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        current_instruction_(NULL),
24733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        current_block_(NULL),
24743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        next_block_(NULL),
2475b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        allocator_(allocator) {}
24763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
24773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Build the sequence for the graph.
2478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LPlatformChunk* Build();
24793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
24803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Declare methods that deal with the individual node types.
24813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#define DECLARE_DO(type) LInstruction* Do##type(H##type* node);
24823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HYDROGEN_CONCRETE_INSTRUCTION_LIST(DECLARE_DO)
24833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#undef DECLARE_DO
24843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* DoMultiplyAdd(HMul* mul, HValue* addend);
2486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static bool HasMagicNumberForDivisor(int32_t divisor);
2488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* DoMathFloor(HUnaryMathOperation* instr);
2490b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* DoMathRound(HUnaryMathOperation* instr);
2491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* DoMathFround(HUnaryMathOperation* instr);
2492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* DoMathAbs(HUnaryMathOperation* instr);
2493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* DoMathLog(HUnaryMathOperation* instr);
249421efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch  LInstruction* DoMathCos(HUnaryMathOperation* instr);
249521efce637eb329c94f1323b6a2334a1c977e1a9dBen Murdoch  LInstruction* DoMathSin(HUnaryMathOperation* instr);
2496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* DoMathExp(HUnaryMathOperation* instr);
2497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* DoMathSqrt(HUnaryMathOperation* instr);
2498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* DoMathPowHalf(HUnaryMathOperation* instr);
2499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* DoMathClz32(HUnaryMathOperation* instr);
2500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* DoDivByPowerOf2I(HDiv* instr);
2501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* DoDivByConstI(HDiv* instr);
2502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* DoDivI(HDiv* instr);
2503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* DoModByPowerOf2I(HMod* instr);
2504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* DoModByConstI(HMod* instr);
2505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* DoModI(HMod* instr);
2506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* DoFlooringDivByPowerOf2I(HMathFloorOfDiv* instr);
2507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* DoFlooringDivByConstI(HMathFloorOfDiv* instr);
2508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* DoFlooringDivI(HMathFloorOfDiv* instr);
25093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
25113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Methods for getting operands for Use / Define / Temp.
25123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LUnallocated* ToUnallocated(Register reg);
25133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LUnallocated* ToUnallocated(DoubleRegister reg);
25143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
25153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Methods for setting up define-use relationships.
25163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  MUST_USE_RESULT LOperand* Use(HValue* value, LUnallocated* operand);
25173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  MUST_USE_RESULT LOperand* UseFixed(HValue* value, Register fixed_register);
25183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  MUST_USE_RESULT LOperand* UseFixedDouble(HValue* value,
25193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                           DoubleRegister fixed_register);
25203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
25213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // A value that is guaranteed to be allocated to a register.
25223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Operand created by UseRegister is guaranteed to be live until the end of
25233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // instruction. This means that register allocator will not reuse it's
25243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // register for any other operand inside instruction.
25253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Operand created by UseRegisterAtStart is guaranteed to be live only at
25263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // instruction start. Register allocator is free to assign the same register
25273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // to some other operand used inside instruction (i.e. temporary or
25283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // output).
25293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  MUST_USE_RESULT LOperand* UseRegister(HValue* value);
25303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  MUST_USE_RESULT LOperand* UseRegisterAtStart(HValue* value);
25313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
25323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // An input operand in a register that may be trashed.
25333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  MUST_USE_RESULT LOperand* UseTempRegister(HValue* value);
25343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
25353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // An input operand in a register or stack slot.
25363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  MUST_USE_RESULT LOperand* Use(HValue* value);
25373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  MUST_USE_RESULT LOperand* UseAtStart(HValue* value);
25383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
25393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // An input operand in a register, stack slot or a constant operand.
25403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  MUST_USE_RESULT LOperand* UseOrConstant(HValue* value);
25413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  MUST_USE_RESULT LOperand* UseOrConstantAtStart(HValue* value);
25423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
25433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // An input operand in a register or a constant operand.
25443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  MUST_USE_RESULT LOperand* UseRegisterOrConstant(HValue* value);
25453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  MUST_USE_RESULT LOperand* UseRegisterOrConstantAtStart(HValue* value);
25463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // An input operand in a constant operand.
2548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MUST_USE_RESULT LOperand* UseConstant(HValue* value);
2549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
25503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // An input operand in register, stack slot or a constant operand.
25513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Will not be moved to a register even if one is freely available.
2552014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  MUST_USE_RESULT LOperand* UseAny(HValue* value) override;
25533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
25543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Temporary operand that must be in a register.
25553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  MUST_USE_RESULT LUnallocated* TempRegister();
2556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MUST_USE_RESULT LUnallocated* TempDoubleRegister();
25573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  MUST_USE_RESULT LOperand* FixedTemp(Register reg);
25583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  MUST_USE_RESULT LOperand* FixedTemp(DoubleRegister reg);
25593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
25603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Methods for setting up define-use relationships.
25613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Return the same instruction that they are passed.
2562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* Define(LTemplateResultInstruction<1>* instr,
2563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                       LUnallocated* result);
2564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* DefineAsRegister(LTemplateResultInstruction<1>* instr);
2565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* DefineAsSpilled(LTemplateResultInstruction<1>* instr,
2566b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                int index);
2567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* DefineSameAsFirst(LTemplateResultInstruction<1>* instr);
2568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* DefineFixed(LTemplateResultInstruction<1>* instr,
2569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                            Register reg);
2570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  LInstruction* DefineFixedDouble(LTemplateResultInstruction<1>* instr,
2571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                  DoubleRegister reg);
25723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LInstruction* AssignEnvironment(LInstruction* instr);
25733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LInstruction* AssignPointerMap(LInstruction* instr);
25743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
25753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  enum CanDeoptimize { CAN_DEOPTIMIZE_EAGERLY, CANNOT_DEOPTIMIZE_EAGERLY };
25763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
25773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // By default we assume that instruction sequences generated for calls
25783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // cannot deoptimize eagerly and we do not attach environment to this
25793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // instruction.
25803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LInstruction* MarkAsCall(
25813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      LInstruction* instr,
25823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      HInstruction* hinstr,
25833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      CanDeoptimize can_deoptimize = CANNOT_DEOPTIMIZE_EAGERLY);
25843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
25853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  void VisitInstruction(HInstruction* current);
2586b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void AddInstruction(LInstruction* instr, HInstruction* current);
25873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
25883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  void DoBasicBlock(HBasicBlock* block, HBasicBlock* next_block);
25893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LInstruction* DoBit(Token::Value op, HBitwiseBinaryOperation* instr);
25903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LInstruction* DoShift(Token::Value op, HBitwiseBinaryOperation* instr);
25913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LInstruction* DoArithmeticD(Token::Value op,
25923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                              HArithmeticBinaryOperation* instr);
25933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LInstruction* DoArithmeticT(Token::Value op,
2594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                              HBinaryOperation* instr);
25953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
25963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HInstruction* current_instruction_;
25973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HBasicBlock* current_block_;
25983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HBasicBlock* next_block_;
25993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LAllocator* allocator_;
2600592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
260144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  DISALLOW_COPY_AND_ASSIGN(LChunkBuilder);
260244f0eee88ff00398ff7f715fab053374d808c90dSteve Block};
260344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
26043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#undef DECLARE_HYDROGEN_ACCESSOR
26053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#undef DECLARE_CONCRETE_INSTRUCTION
260644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
2607014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace internal
2608014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace v8
260944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
2610014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif  // V8_CRANKSHAFT_MIPS_LITHIUM_MIPS_H_
2611