1958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Copyright 2014 the V8 project authors. All rights reserved.
2958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Use of this source code is governed by a BSD-style license that can be
3958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// found in the LICENSE file.
4958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
5014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#ifndef V8_CRANKSHAFT_PPC_LITHIUM_PPC_H_
6014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define V8_CRANKSHAFT_PPC_LITHIUM_PPC_H_
7958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
8014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/crankshaft/hydrogen.h"
9014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/crankshaft/lithium.h"
10014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/crankshaft/lithium-allocator.h"
11958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#include "src/safepoint-table.h"
12958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#include "src/utils.h"
13958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
14958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniernamespace v8 {
15958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniernamespace internal {
16958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
17958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Forward declarations.
18958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierclass LCodeGen;
19958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
20958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#define LITHIUM_CONCRETE_INSTRUCTION_LIST(V) \
21958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(AccessArgumentsAt)                       \
22958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(AddI)                                    \
23958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(Allocate)                                \
24958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(ApplyArguments)                          \
25958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(ArgumentsElements)                       \
26958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(ArgumentsLength)                         \
27958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(ArithmeticD)                             \
28958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(ArithmeticT)                             \
29958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(BitI)                                    \
30958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(BoundsCheck)                             \
31958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(Branch)                                  \
32958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(CallWithDescriptor)                      \
33958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(CallNewArray)                            \
34958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(CallRuntime)                             \
35014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(CheckArrayBufferNotNeutered)             \
36958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(CheckInstanceType)                       \
37958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(CheckNonSmi)                             \
38958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(CheckMaps)                               \
39958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(CheckMapValue)                           \
40958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(CheckSmi)                                \
41958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(CheckValue)                              \
42958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(ClampDToUint8)                           \
43958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(ClampIToUint8)                           \
44958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(ClampTToUint8)                           \
45958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(ClassOfTestAndBranch)                    \
46958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(CompareNumericAndBranch)                 \
47958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(CmpObjectEqAndBranch)                    \
48958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(CmpHoleAndBranch)                        \
49958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(CmpMapAndBranch)                         \
50958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(CmpT)                                    \
51958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(ConstantD)                               \
52958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(ConstantE)                               \
53958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(ConstantI)                               \
54958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(ConstantS)                               \
55958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(ConstantT)                               \
56958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(Context)                                 \
57958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(DebugBreak)                              \
58958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(DeclareGlobals)                          \
59958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(Deoptimize)                              \
60958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(DivByConstI)                             \
61958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(DivByPowerOf2I)                          \
62958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(DivI)                                    \
63958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(DoubleToI)                               \
64958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(DoubleToSmi)                             \
65958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(Drop)                                    \
66958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(Dummy)                                   \
67958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(DummyUse)                                \
68bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  V(FastAllocate)                            \
69958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(FlooringDivByConstI)                     \
70958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(FlooringDivByPowerOf2I)                  \
71958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(FlooringDivI)                            \
72958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(ForInCacheArray)                         \
73958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(ForInPrepareMap)                         \
74958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(Goto)                                    \
75014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(HasInPrototypeChainAndBranch)            \
76958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(HasInstanceTypeAndBranch)                \
77958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(InnerAllocatedObject)                    \
78958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(InstructionGap)                          \
79958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(Integer32ToDouble)                       \
80958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(InvokeFunction)                          \
81958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(IsStringAndBranch)                       \
82958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(IsSmiAndBranch)                          \
83958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(IsUndetectableAndBranch)                 \
84958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(Label)                                   \
85958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(LazyBailout)                             \
86958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(LoadContextSlot)                         \
87958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(LoadRoot)                                \
88958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(LoadFieldByIndex)                        \
89958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(LoadFunctionPrototype)                   \
90958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(LoadKeyed)                               \
91958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(LoadNamedField)                          \
92958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(MathAbs)                                 \
93958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(MathClz32)                               \
9413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V(MathCos)                                 \
9513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V(MathSin)                                 \
96958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(MathExp)                                 \
97bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  V(MathFloorD)                              \
98bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  V(MathFloorI)                              \
99958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(MathFround)                              \
100958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(MathLog)                                 \
101958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(MathMinMax)                              \
102958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(MathPowHalf)                             \
103bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  V(MathRoundD)                              \
104bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  V(MathRoundI)                              \
105958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(MathSqrt)                                \
106014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(MaybeGrowElements)                       \
107958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(ModByConstI)                             \
108958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(ModByPowerOf2I)                          \
109958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(ModI)                                    \
110958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(MulI)                                    \
111958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(MultiplyAddD)                            \
112958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(MultiplySubD)                            \
113958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(NumberTagD)                              \
114958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(NumberTagI)                              \
115958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(NumberTagU)                              \
116958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(NumberUntagD)                            \
117958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(OsrEntry)                                \
118958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(Parameter)                               \
119958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(Power)                                   \
120014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(Prologue)                                \
121958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(PushArgument)                            \
122958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(Return)                                  \
123958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(SeqStringGetChar)                        \
124958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(SeqStringSetChar)                        \
125958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(ShiftI)                                  \
126958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(SmiTag)                                  \
127958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(SmiUntag)                                \
128958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(StackCheck)                              \
129958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(StoreCodeEntry)                          \
130958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(StoreContextSlot)                        \
131958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(StoreKeyed)                              \
132958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(StoreNamedField)                         \
133958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(StringAdd)                               \
134958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(StringCharCodeAt)                        \
135958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(StringCharFromCode)                      \
136958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(StringCompareAndBranch)                  \
137958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(SubI)                                    \
138958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(RSubI)                                   \
139958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(TaggedToI)                               \
140958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(ThisFunction)                            \
141958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(TransitionElementsKind)                  \
142958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(TrapAllocationMemento)                   \
143958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(Typeof)                                  \
144958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(TypeofIsAndBranch)                       \
145958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(Uint32ToDouble)                          \
146958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(UnknownOSRValue)                         \
147958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(WrapReceiver)
148958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
149958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#define DECLARE_CONCRETE_INSTRUCTION(type, mnemonic)            \
150014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Opcode opcode() const final { return LInstruction::k##type; } \
151014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void CompileToNative(LCodeGen* generator) final;              \
152014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  const char* Mnemonic() const final { return mnemonic; }       \
153958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  static L##type* cast(LInstruction* instr) {                   \
154958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    DCHECK(instr->Is##type());                                  \
155958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    return reinterpret_cast<L##type*>(instr);                   \
156958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
157958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
158958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
159958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#define DECLARE_HYDROGEN_ACCESSOR(type) \
160958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  H##type* hydrogen() const { return H##type::cast(hydrogen_value()); }
161958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
162958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
163958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierclass LInstruction : public ZoneObject {
164958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
165958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LInstruction()
166958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      : environment_(NULL),
167958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        hydrogen_value_(NULL),
168958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        bit_field_(IsCallBits::encode(false)) {}
169958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
170958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  virtual ~LInstruction() {}
171958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
172958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  virtual void CompileToNative(LCodeGen* generator) = 0;
173958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  virtual const char* Mnemonic() const = 0;
174958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  virtual void PrintTo(StringStream* stream);
175958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  virtual void PrintDataTo(StringStream* stream);
176958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  virtual void PrintOutputOperandTo(StringStream* stream);
177958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
178958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  enum Opcode {
179958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Declare a unique enum value for each instruction.
180958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#define DECLARE_OPCODE(type) k##type,
181958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    LITHIUM_CONCRETE_INSTRUCTION_LIST(DECLARE_OPCODE) kNumberOfInstructions
182958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#undef DECLARE_OPCODE
183958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  };
184958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
185958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  virtual Opcode opcode() const = 0;
186958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
187958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Declare non-virtual type testers for all leaf IR classes.
188958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#define DECLARE_PREDICATE(type) \
189958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  bool Is##type() const { return opcode() == k##type; }
190958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LITHIUM_CONCRETE_INSTRUCTION_LIST(DECLARE_PREDICATE)
191958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#undef DECLARE_PREDICATE
192958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
193958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // Declare virtual predicates for instructions that don't have
194958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // an opcode.
195958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  virtual bool IsGap() const { return false; }
196958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
197958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  virtual bool IsControl() const { return false; }
198958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
199958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // Try deleting this instruction if possible.
200958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  virtual bool TryDelete() { return false; }
201958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
202958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  void set_environment(LEnvironment* env) { environment_ = env; }
203958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LEnvironment* environment() const { return environment_; }
204958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  bool HasEnvironment() const { return environment_ != NULL; }
205958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
206958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  void set_pointer_map(LPointerMap* p) { pointer_map_.set(p); }
207958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LPointerMap* pointer_map() const { return pointer_map_.get(); }
208958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  bool HasPointerMap() const { return pointer_map_.is_set(); }
209958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
210958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  void set_hydrogen_value(HValue* value) { hydrogen_value_ = value; }
211958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  HValue* hydrogen_value() const { return hydrogen_value_; }
212958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
213958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  void MarkAsCall() { bit_field_ = IsCallBits::update(bit_field_, true); }
214958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  bool IsCall() const { return IsCallBits::decode(bit_field_); }
215958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2163b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  void MarkAsSyntacticTailCall() {
2173b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    bit_field_ = IsSyntacticTailCallBits::update(bit_field_, true);
2183b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  }
2193b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  bool IsSyntacticTailCall() const {
2203b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    return IsSyntacticTailCallBits::decode(bit_field_);
2213b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  }
2223b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
223958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // Interface to the register allocator and iterators.
224958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  bool ClobbersTemps() const { return IsCall(); }
225958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  bool ClobbersRegisters() const { return IsCall(); }
226958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  virtual bool ClobbersDoubleRegisters(Isolate* isolate) const {
227958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    return IsCall();
228958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
229958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
230958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // Interface to the register allocator and iterators.
231958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  bool IsMarkedAsCall() const { return IsCall(); }
232958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
233958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  virtual bool HasResult() const = 0;
234958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  virtual LOperand* result() const = 0;
235958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
236958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* FirstInput() { return InputAt(0); }
237958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* Output() { return HasResult() ? result() : NULL; }
238958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
239958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  virtual bool HasInterestingComment(LCodeGen* gen) const { return true; }
240958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
241958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#ifdef DEBUG
242958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  void VerifyCall();
243958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif
244958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
245958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  virtual int InputCount() = 0;
246958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  virtual LOperand* InputAt(int i) = 0;
247958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
248958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier private:
249958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // Iterator support.
250958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  friend class InputIterator;
251958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
252958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  friend class TempIterator;
253958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  virtual int TempCount() = 0;
254958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  virtual LOperand* TempAt(int i) = 0;
255958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
256958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  class IsCallBits : public BitField<bool, 0, 1> {};
2573b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  class IsSyntacticTailCallBits : public BitField<bool, IsCallBits::kNext, 1> {
2583b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  };
259958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
260958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LEnvironment* environment_;
261958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  SetOncePointer<LPointerMap> pointer_map_;
262958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  HValue* hydrogen_value_;
263958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  int bit_field_;
264958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
265958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
266958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
267958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// R = number of result operands (0 or 1).
268958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniertemplate <int R>
269958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierclass LTemplateResultInstruction : public LInstruction {
270958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
271958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // Allow 0 or 1 output operands.
272958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  STATIC_ASSERT(R == 0 || R == 1);
273014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool HasResult() const final { return R != 0 && result() != NULL; }
274958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  void set_result(LOperand* operand) { results_[0] = operand; }
275014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* result() const override { return results_[0]; }
276958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
277958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier protected:
278958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EmbeddedContainer<LOperand*, R> results_;
279958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
280958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
281958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
282958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// R = number of result operands (0 or 1).
283958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// I = number of input operands.
284958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// T = number of temporary operands.
285958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniertemplate <int R, int I, int T>
286958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierclass LTemplateInstruction : public LTemplateResultInstruction<R> {
287958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier protected:
288958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EmbeddedContainer<LOperand*, I> inputs_;
289958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  EmbeddedContainer<LOperand*, T> temps_;
290958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
291958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier private:
292958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // Iterator support.
293014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int InputCount() final { return I; }
294014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* InputAt(int i) final { return inputs_[i]; }
295958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
296014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int TempCount() final { return T; }
297014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* TempAt(int i) final { return temps_[i]; }
298958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
299958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
300958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
301958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierclass LGap : public LTemplateInstruction<0, 0, 0> {
302958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
303958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  explicit LGap(HBasicBlock* block) : block_(block) {
304958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    parallel_moves_[BEFORE] = NULL;
305958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    parallel_moves_[START] = NULL;
306958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    parallel_moves_[END] = NULL;
307958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    parallel_moves_[AFTER] = NULL;
308958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
309958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
310958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // Can't use the DECLARE-macro here because of sub-classes.
311014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool IsGap() const override { return true; }
312014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void PrintDataTo(StringStream* stream) override;
313958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  static LGap* cast(LInstruction* instr) {
314958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    DCHECK(instr->IsGap());
315958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    return reinterpret_cast<LGap*>(instr);
316958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
317958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
318958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  bool IsRedundant() const;
319958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
320958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  HBasicBlock* block() const { return block_; }
321958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
322958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  enum InnerPosition {
323958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    BEFORE,
324958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    START,
325958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    END,
326958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    AFTER,
327958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    FIRST_INNER_POSITION = BEFORE,
328958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    LAST_INNER_POSITION = AFTER
329958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  };
330958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
331958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LParallelMove* GetOrCreateParallelMove(InnerPosition pos, Zone* zone) {
332958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    if (parallel_moves_[pos] == NULL) {
333958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      parallel_moves_[pos] = new (zone) LParallelMove(zone);
334958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
335958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    return parallel_moves_[pos];
336958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
337958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
338958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LParallelMove* GetParallelMove(InnerPosition pos) {
339958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    return parallel_moves_[pos];
340958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
341958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
342958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier private:
343958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LParallelMove* parallel_moves_[LAST_INNER_POSITION + 1];
344958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  HBasicBlock* block_;
345958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
346958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
347958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
348014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LInstructionGap final : public LGap {
349958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
350958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  explicit LInstructionGap(HBasicBlock* block) : LGap(block) {}
351958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
352014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool HasInterestingComment(LCodeGen* gen) const override {
353958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    return !IsRedundant();
354958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
355958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
356958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(InstructionGap, "gap")
357958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
358958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
359958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
360014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LGoto final : public LTemplateInstruction<0, 0, 0> {
361958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
362958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  explicit LGoto(HBasicBlock* block) : block_(block) {}
363958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
364014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool HasInterestingComment(LCodeGen* gen) const override;
365958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(Goto, "goto")
366014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void PrintDataTo(StringStream* stream) override;
367014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool IsControl() const override { return true; }
368958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
369958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  int block_id() const { return block_->block_id(); }
370958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
371958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier private:
372958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  HBasicBlock* block_;
373958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
374958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
375958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
376014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LPrologue final : public LTemplateInstruction<0, 0, 0> {
377014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public:
378014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(Prologue, "prologue")
379014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch};
380014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
381014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
382014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LLazyBailout final : public LTemplateInstruction<0, 0, 0> {
383958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
384958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LLazyBailout() : gap_instructions_size_(0) {}
385958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
386958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(LazyBailout, "lazy-bailout")
387958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
388958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  void set_gap_instructions_size(int gap_instructions_size) {
389958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    gap_instructions_size_ = gap_instructions_size;
390958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
391958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  int gap_instructions_size() { return gap_instructions_size_; }
392958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
393958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier private:
394958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  int gap_instructions_size_;
395958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
396958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
397958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
398014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LDummy final : public LTemplateInstruction<1, 0, 0> {
399958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
400958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LDummy() {}
401958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(Dummy, "dummy")
402958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
403958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
404958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
405014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LDummyUse final : public LTemplateInstruction<1, 1, 0> {
406958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
407958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  explicit LDummyUse(LOperand* value) { inputs_[0] = value; }
408958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(DummyUse, "dummy-use")
409958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
410958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
411958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
412014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LDeoptimize final : public LTemplateInstruction<0, 0, 0> {
413958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
414014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool IsControl() const override { return true; }
415958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(Deoptimize, "deoptimize")
416958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(Deoptimize)
417958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
418958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
419958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
420014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LLabel final : public LGap {
421958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
422958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  explicit LLabel(HBasicBlock* block) : LGap(block), replacement_(NULL) {}
423958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
424014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool HasInterestingComment(LCodeGen* gen) const override { return false; }
425958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(Label, "label")
426958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
427014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void PrintDataTo(StringStream* stream) override;
428958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
429958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  int block_id() const { return block()->block_id(); }
430958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  bool is_loop_header() const { return block()->IsLoopHeader(); }
431958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  bool is_osr_entry() const { return block()->is_osr_entry(); }
432958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Label* label() { return &label_; }
433958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LLabel* replacement() const { return replacement_; }
434958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  void set_replacement(LLabel* label) { replacement_ = label; }
435958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  bool HasReplacement() const { return replacement_ != NULL; }
436958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
437958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier private:
438958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Label label_;
439958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LLabel* replacement_;
440958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
441958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
442958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
443014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LParameter final : public LTemplateInstruction<1, 0, 0> {
444958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
445958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  virtual bool HasInterestingComment(LCodeGen* gen) const { return false; }
446958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(Parameter, "parameter")
447958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
448958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
449958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
450014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LUnknownOSRValue final : public LTemplateInstruction<1, 0, 0> {
451958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
452014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool HasInterestingComment(LCodeGen* gen) const override { return false; }
453958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(UnknownOSRValue, "unknown-osr-value")
454958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
455958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
456958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
457958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniertemplate <int I, int T>
458958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierclass LControlInstruction : public LTemplateInstruction<0, I, T> {
459958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
460958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LControlInstruction() : false_label_(NULL), true_label_(NULL) {}
461958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
462014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool IsControl() const final { return true; }
463958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
464958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  int SuccessorCount() { return hydrogen()->SuccessorCount(); }
465958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  HBasicBlock* SuccessorAt(int i) { return hydrogen()->SuccessorAt(i); }
466958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
467958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  int TrueDestination(LChunk* chunk) {
468958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    return chunk->LookupDestination(true_block_id());
469958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
470958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  int FalseDestination(LChunk* chunk) {
471958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    return chunk->LookupDestination(false_block_id());
472958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
473958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
474958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Label* TrueLabel(LChunk* chunk) {
475958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    if (true_label_ == NULL) {
476958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      true_label_ = chunk->GetAssemblyLabel(TrueDestination(chunk));
477958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
478958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    return true_label_;
479958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
480958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Label* FalseLabel(LChunk* chunk) {
481958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    if (false_label_ == NULL) {
482958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      false_label_ = chunk->GetAssemblyLabel(FalseDestination(chunk));
483958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
484958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    return false_label_;
485958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
486958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
487958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier protected:
488958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  int true_block_id() { return SuccessorAt(0)->block_id(); }
489958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  int false_block_id() { return SuccessorAt(1)->block_id(); }
490958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
491958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier private:
492958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  HControlInstruction* hydrogen() {
493958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    return HControlInstruction::cast(this->hydrogen_value());
494958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
495958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
496958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Label* false_label_;
497958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Label* true_label_;
498958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
499958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
500958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
501014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LWrapReceiver final : public LTemplateInstruction<1, 2, 0> {
502958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
503958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LWrapReceiver(LOperand* receiver, LOperand* function) {
504958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[0] = receiver;
505958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[1] = function;
506958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
507958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
508958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(WrapReceiver, "wrap-receiver")
509958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(WrapReceiver)
510958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
511958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* receiver() { return inputs_[0]; }
512958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* function() { return inputs_[1]; }
513958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
514958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
515958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
516014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LApplyArguments final : public LTemplateInstruction<1, 4, 0> {
517958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
518958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LApplyArguments(LOperand* function, LOperand* receiver, LOperand* length,
519958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                  LOperand* elements) {
520958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[0] = function;
521958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[1] = receiver;
522958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[2] = length;
523958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[3] = elements;
524958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
525958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
526958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(ApplyArguments, "apply-arguments")
5273b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  DECLARE_HYDROGEN_ACCESSOR(ApplyArguments)
528958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
529958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* function() { return inputs_[0]; }
530958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* receiver() { return inputs_[1]; }
531958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* length() { return inputs_[2]; }
532958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* elements() { return inputs_[3]; }
533958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
534958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
535958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
536014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LAccessArgumentsAt final : public LTemplateInstruction<1, 3, 0> {
537958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
538958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LAccessArgumentsAt(LOperand* arguments, LOperand* length, LOperand* index) {
539958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[0] = arguments;
540958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[1] = length;
541958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[2] = index;
542958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
543958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
544958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(AccessArgumentsAt, "access-arguments-at")
545958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
546958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* arguments() { return inputs_[0]; }
547958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* length() { return inputs_[1]; }
548958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* index() { return inputs_[2]; }
549958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
550014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void PrintDataTo(StringStream* stream) override;
551958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
552958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
553958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
554014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LArgumentsLength final : public LTemplateInstruction<1, 1, 0> {
555958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
556958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  explicit LArgumentsLength(LOperand* elements) { inputs_[0] = elements; }
557958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
558958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* elements() { return inputs_[0]; }
559958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
560958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(ArgumentsLength, "arguments-length")
561958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
562958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
563958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
564014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LArgumentsElements final : public LTemplateInstruction<1, 0, 0> {
565958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
566958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(ArgumentsElements, "arguments-elements")
567958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(ArgumentsElements)
568958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
569958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
570958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
571014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LModByPowerOf2I final : public LTemplateInstruction<1, 1, 0> {
572958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
573958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LModByPowerOf2I(LOperand* dividend, int32_t divisor) {
574958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[0] = dividend;
575958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    divisor_ = divisor;
576958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
577958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
578958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* dividend() { return inputs_[0]; }
579958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  int32_t divisor() const { return divisor_; }
580958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
581958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(ModByPowerOf2I, "mod-by-power-of-2-i")
582958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(Mod)
583958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
584958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier private:
585958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  int32_t divisor_;
586958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
587958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
588958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
589014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LModByConstI final : public LTemplateInstruction<1, 1, 0> {
590958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
591958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LModByConstI(LOperand* dividend, int32_t divisor) {
592958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[0] = dividend;
593958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    divisor_ = divisor;
594958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
595958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
596958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* dividend() { return inputs_[0]; }
597958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  int32_t divisor() const { return divisor_; }
598958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
599958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(ModByConstI, "mod-by-const-i")
600958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(Mod)
601958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
602958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier private:
603958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  int32_t divisor_;
604958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
605958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
606958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
607014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LModI final : public LTemplateInstruction<1, 2, 0> {
608958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
609958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LModI(LOperand* left, LOperand* right) {
610958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[0] = left;
611958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[1] = right;
612958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
613958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
614958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* left() { return inputs_[0]; }
615958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* right() { return inputs_[1]; }
616958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
617958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(ModI, "mod-i")
618958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(Mod)
619958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
620958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
621958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
622014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LDivByPowerOf2I final : public LTemplateInstruction<1, 1, 0> {
623958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
624958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LDivByPowerOf2I(LOperand* dividend, int32_t divisor) {
625958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[0] = dividend;
626958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    divisor_ = divisor;
627958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
628958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
629958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* dividend() { return inputs_[0]; }
630958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  int32_t divisor() const { return divisor_; }
631958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
632958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(DivByPowerOf2I, "div-by-power-of-2-i")
633958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(Div)
634958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
635958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier private:
636958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  int32_t divisor_;
637958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
638958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
639958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
640014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LDivByConstI final : public LTemplateInstruction<1, 1, 0> {
641958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
642958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LDivByConstI(LOperand* dividend, int32_t divisor) {
643958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[0] = dividend;
644958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    divisor_ = divisor;
645958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
646958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
647958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* dividend() { return inputs_[0]; }
648958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  int32_t divisor() const { return divisor_; }
649958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
650958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(DivByConstI, "div-by-const-i")
651958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(Div)
652958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
653958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier private:
654958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  int32_t divisor_;
655958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
656958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
657958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
658014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LDivI final : public LTemplateInstruction<1, 2, 0> {
659958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
660958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LDivI(LOperand* dividend, LOperand* divisor) {
661958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[0] = dividend;
662958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[1] = divisor;
663958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
664958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
665958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* dividend() { return inputs_[0]; }
666958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* divisor() { return inputs_[1]; }
667958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
668958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(DivI, "div-i")
669958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(BinaryOperation)
670958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
671958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
672958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
673014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LFlooringDivByPowerOf2I final : public LTemplateInstruction<1, 1, 0> {
674958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
675958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LFlooringDivByPowerOf2I(LOperand* dividend, int32_t divisor) {
676958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[0] = dividend;
677958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    divisor_ = divisor;
678958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
679958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
680958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* dividend() { return inputs_[0]; }
681958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  int32_t divisor() { return divisor_; }
682958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
683958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(FlooringDivByPowerOf2I,
684958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                               "flooring-div-by-power-of-2-i")
685958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(MathFloorOfDiv)
686958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
687958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier private:
688958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  int32_t divisor_;
689958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
690958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
691958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
692014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LFlooringDivByConstI final : public LTemplateInstruction<1, 1, 1> {
693958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
694958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LFlooringDivByConstI(LOperand* dividend, int32_t divisor, LOperand* temp) {
695958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[0] = dividend;
696958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    divisor_ = divisor;
697958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    temps_[0] = temp;
698958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
699958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
700958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* dividend() { return inputs_[0]; }
701958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  int32_t divisor() const { return divisor_; }
702958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* temp() { return temps_[0]; }
703958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
704958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(FlooringDivByConstI, "flooring-div-by-const-i")
705958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(MathFloorOfDiv)
706958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
707958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier private:
708958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  int32_t divisor_;
709958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
710958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
711958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
712014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LFlooringDivI final : public LTemplateInstruction<1, 2, 0> {
713958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
714958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LFlooringDivI(LOperand* dividend, LOperand* divisor) {
715958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[0] = dividend;
716958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[1] = divisor;
717958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
718958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
719958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* dividend() { return inputs_[0]; }
720958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* divisor() { return inputs_[1]; }
721958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
722958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(FlooringDivI, "flooring-div-i")
723958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(MathFloorOfDiv)
724958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
725958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
726958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
727014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LMulI final : public LTemplateInstruction<1, 2, 0> {
728958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
729958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LMulI(LOperand* left, LOperand* right) {
730958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[0] = left;
731958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[1] = right;
732958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
733958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
734958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* left() { return inputs_[0]; }
735958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* right() { return inputs_[1]; }
736958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
737958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(MulI, "mul-i")
738958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(Mul)
739958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
740958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
741958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
742958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Instruction for computing multiplier * multiplicand + addend.
743014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LMultiplyAddD final : public LTemplateInstruction<1, 3, 0> {
744958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
745958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LMultiplyAddD(LOperand* addend, LOperand* multiplier,
746958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                LOperand* multiplicand) {
747958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[0] = addend;
748958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[1] = multiplier;
749958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[2] = multiplicand;
750958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
751958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
752958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* addend() { return inputs_[0]; }
753958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* multiplier() { return inputs_[1]; }
754958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* multiplicand() { return inputs_[2]; }
755958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
756958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(MultiplyAddD, "multiply-add-d")
757958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
758958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
759958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
760958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Instruction for computing minuend - multiplier * multiplicand.
761014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LMultiplySubD final : public LTemplateInstruction<1, 3, 0> {
762958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
763958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LMultiplySubD(LOperand* minuend, LOperand* multiplier,
764958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                LOperand* multiplicand) {
765958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[0] = minuend;
766958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[1] = multiplier;
767958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[2] = multiplicand;
768958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
769958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
770958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* minuend() { return inputs_[0]; }
771958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* multiplier() { return inputs_[1]; }
772958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* multiplicand() { return inputs_[2]; }
773958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
774958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(MultiplySubD, "multiply-sub-d")
775958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
776958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
777958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
778014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LDebugBreak final : public LTemplateInstruction<0, 0, 0> {
779958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
780958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(DebugBreak, "break")
781958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
782958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
783958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
784014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LCompareNumericAndBranch final : public LControlInstruction<2, 0> {
785958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
786958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LCompareNumericAndBranch(LOperand* left, LOperand* right) {
787958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[0] = left;
788958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[1] = right;
789958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
790958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
791958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* left() { return inputs_[0]; }
792958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* right() { return inputs_[1]; }
793958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
794958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(CompareNumericAndBranch,
795958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                               "compare-numeric-and-branch")
796958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(CompareNumericAndBranch)
797958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
798958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Token::Value op() const { return hydrogen()->token(); }
799958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  bool is_double() const { return hydrogen()->representation().IsDouble(); }
800958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
801014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void PrintDataTo(StringStream* stream) override;
802958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
803958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
804bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch// Math.floor with a double result.
805bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochclass LMathFloorD final : public LTemplateInstruction<1, 1, 0> {
806bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch public:
807bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  explicit LMathFloorD(LOperand* value) { inputs_[0] = value; }
808958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
809bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  LOperand* value() { return inputs_[0]; }
810bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
811bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(MathFloorD, "math-floor-d")
812bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  DECLARE_HYDROGEN_ACCESSOR(UnaryMathOperation)
813bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch};
814bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
815bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch// Math.floor with an integer result.
816bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochclass LMathFloorI final : public LTemplateInstruction<1, 1, 0> {
817958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
818bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  explicit LMathFloorI(LOperand* value) { inputs_[0] = value; }
819958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
820958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* value() { return inputs_[0]; }
821958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
822bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(MathFloorI, "math-floor-i")
823958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(UnaryMathOperation)
824958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
825958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
826bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch// Math.round with a double result.
827bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochclass LMathRoundD final : public LTemplateInstruction<1, 1, 0> {
828bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch public:
829bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  explicit LMathRoundD(LOperand* value) { inputs_[0] = value; }
830958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
831bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  LOperand* value() { return inputs_[0]; }
832bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
833bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(MathRoundD, "math-round-d")
834bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  DECLARE_HYDROGEN_ACCESSOR(UnaryMathOperation)
835bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch};
836bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
837bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch// Math.round with an integer result.
838bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochclass LMathRoundI final : public LTemplateInstruction<1, 1, 1> {
839958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
840bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  LMathRoundI(LOperand* value, LOperand* temp) {
841958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[0] = value;
842958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    temps_[0] = temp;
843958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
844958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
845958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* value() { return inputs_[0]; }
846958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* temp() { return temps_[0]; }
847958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
848bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(MathRoundI, "math-round-i")
849958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(UnaryMathOperation)
850958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
851958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
852958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
853014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LMathFround final : public LTemplateInstruction<1, 1, 0> {
854958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
855958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  explicit LMathFround(LOperand* value) { inputs_[0] = value; }
856958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
857958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* value() { return inputs_[0]; }
858958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
859958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(MathFround, "math-fround")
860958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
861958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
862958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
863014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LMathAbs final : public LTemplateInstruction<1, 2, 0> {
864958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
865958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LMathAbs(LOperand* context, LOperand* value) {
866958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[1] = context;
867958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[0] = value;
868958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
869958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
870958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* context() { return inputs_[1]; }
871958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* value() { return inputs_[0]; }
872958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
873958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(MathAbs, "math-abs")
874958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(UnaryMathOperation)
875958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
876958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
877958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
878014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LMathLog final : public LTemplateInstruction<1, 1, 0> {
879958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
880958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  explicit LMathLog(LOperand* value) { inputs_[0] = value; }
881958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
882958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* value() { return inputs_[0]; }
883958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
884958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(MathLog, "math-log")
885958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
886958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
887958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
888014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LMathClz32 final : public LTemplateInstruction<1, 1, 0> {
889958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
890958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  explicit LMathClz32(LOperand* value) { inputs_[0] = value; }
891958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
892958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* value() { return inputs_[0]; }
893958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
894958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(MathClz32, "math-clz32")
895958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
896958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
89713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochclass LMathCos final : public LTemplateInstruction<1, 1, 0> {
89813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch public:
89913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  explicit LMathCos(LOperand* value) { inputs_[0] = value; }
90013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
90113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  LOperand* value() { return inputs_[0]; }
902958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
90313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(MathCos, "math-cos")
90413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch};
90513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
90613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
90713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochclass LMathSin final : public LTemplateInstruction<1, 1, 0> {
908958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
90913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  explicit LMathSin(LOperand* value) { inputs_[0] = value; }
91013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
91113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  LOperand* value() { return inputs_[0]; }
91213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
91313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  DECLARE_CONCRETE_INSTRUCTION(MathSin, "math-sin")
91413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch};
91513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
91613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
91713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochclass LMathExp final : public LTemplateInstruction<1, 1, 0> {
91813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch public:
91913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  explicit LMathExp(LOperand* value) { inputs_[0] = value; }
920958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
921958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* value() { return inputs_[0]; }
922958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
923958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(MathExp, "math-exp")
924958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
925958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
926958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
927014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LMathSqrt final : public LTemplateInstruction<1, 1, 0> {
928958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
929958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  explicit LMathSqrt(LOperand* value) { inputs_[0] = value; }
930958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
931958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* value() { return inputs_[0]; }
932958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
933958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(MathSqrt, "math-sqrt")
934958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
935958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
936958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
937014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LMathPowHalf final : public LTemplateInstruction<1, 1, 0> {
938958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
939958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  explicit LMathPowHalf(LOperand* value) { inputs_[0] = value; }
940958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
941958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* value() { return inputs_[0]; }
942958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
943958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(MathPowHalf, "math-pow-half")
944958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
945958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
946958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
947014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LCmpObjectEqAndBranch final : public LControlInstruction<2, 0> {
948958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
949958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LCmpObjectEqAndBranch(LOperand* left, LOperand* right) {
950958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[0] = left;
951958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[1] = right;
952958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
953958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
954958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* left() { return inputs_[0]; }
955958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* right() { return inputs_[1]; }
956958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
957958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(CmpObjectEqAndBranch, "cmp-object-eq-and-branch")
958958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(CompareObjectEqAndBranch)
959958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
960958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
961958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
962014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LCmpHoleAndBranch final : public LControlInstruction<1, 0> {
963958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
964958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  explicit LCmpHoleAndBranch(LOperand* object) { inputs_[0] = object; }
965958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
966958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* object() { return inputs_[0]; }
967958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
968958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(CmpHoleAndBranch, "cmp-hole-and-branch")
969958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(CompareHoleAndBranch)
970958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
971958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
972958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
973014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LIsStringAndBranch final : public LControlInstruction<1, 1> {
974958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
975958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LIsStringAndBranch(LOperand* value, LOperand* temp) {
976958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[0] = value;
977958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    temps_[0] = temp;
978958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
979958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
980958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* value() { return inputs_[0]; }
981958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* temp() { return temps_[0]; }
982958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
983958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(IsStringAndBranch, "is-string-and-branch")
984958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(IsStringAndBranch)
985958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
986014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void PrintDataTo(StringStream* stream) override;
987958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
988958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
989958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
990014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LIsSmiAndBranch final : public LControlInstruction<1, 0> {
991958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
992958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  explicit LIsSmiAndBranch(LOperand* value) { inputs_[0] = value; }
993958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
994958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* value() { return inputs_[0]; }
995958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
996958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(IsSmiAndBranch, "is-smi-and-branch")
997958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(IsSmiAndBranch)
998958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
999014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void PrintDataTo(StringStream* stream) override;
1000958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1001958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1002958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1003014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LIsUndetectableAndBranch final : public LControlInstruction<1, 1> {
1004958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
1005958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  explicit LIsUndetectableAndBranch(LOperand* value, LOperand* temp) {
1006958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[0] = value;
1007958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    temps_[0] = temp;
1008958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1009958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1010958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* value() { return inputs_[0]; }
1011958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* temp() { return temps_[0]; }
1012958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1013958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(IsUndetectableAndBranch,
1014958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                               "is-undetectable-and-branch")
1015958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(IsUndetectableAndBranch)
1016958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1017014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void PrintDataTo(StringStream* stream) override;
1018958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1019958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1020958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1021014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LStringCompareAndBranch final : public LControlInstruction<3, 0> {
1022958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
1023958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LStringCompareAndBranch(LOperand* context, LOperand* left, LOperand* right) {
1024958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[0] = context;
1025958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[1] = left;
1026958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[2] = right;
1027958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1028958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1029958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* context() { return inputs_[0]; }
1030958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* left() { return inputs_[1]; }
1031958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* right() { return inputs_[2]; }
1032958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1033958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(StringCompareAndBranch,
1034958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                               "string-compare-and-branch")
1035958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(StringCompareAndBranch)
1036958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1037958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Token::Value op() const { return hydrogen()->token(); }
1038958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1039014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void PrintDataTo(StringStream* stream) override;
1040958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1041958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1042958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1043014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LHasInstanceTypeAndBranch final : public LControlInstruction<1, 0> {
1044958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
1045958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  explicit LHasInstanceTypeAndBranch(LOperand* value) { inputs_[0] = value; }
1046958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1047958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* value() { return inputs_[0]; }
1048958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1049958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(HasInstanceTypeAndBranch,
1050958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                               "has-instance-type-and-branch")
1051958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(HasInstanceTypeAndBranch)
1052958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1053014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void PrintDataTo(StringStream* stream) override;
1054958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1055958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1056014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LClassOfTestAndBranch final : public LControlInstruction<1, 1> {
1057958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
1058958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LClassOfTestAndBranch(LOperand* value, LOperand* temp) {
1059958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[0] = value;
1060958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    temps_[0] = temp;
1061958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1062958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1063958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* value() { return inputs_[0]; }
1064958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* temp() { return temps_[0]; }
1065958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1066958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(ClassOfTestAndBranch, "class-of-test-and-branch")
1067958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(ClassOfTestAndBranch)
1068958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1069014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void PrintDataTo(StringStream* stream) override;
1070958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1071958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1072958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1073014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LCmpT final : public LTemplateInstruction<1, 3, 0> {
1074958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
1075958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LCmpT(LOperand* context, LOperand* left, LOperand* right) {
1076958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[0] = context;
1077958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[1] = left;
1078958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[2] = right;
1079958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1080958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1081958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* context() { return inputs_[0]; }
1082958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* left() { return inputs_[1]; }
1083958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* right() { return inputs_[2]; }
1084958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1085958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(CmpT, "cmp-t")
1086958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(CompareGeneric)
1087958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1088958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Token::Value op() const { return hydrogen()->token(); }
1089958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1090958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1091958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1092014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LHasInPrototypeChainAndBranch final : public LControlInstruction<2, 0> {
1093958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
1094014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LHasInPrototypeChainAndBranch(LOperand* object, LOperand* prototype) {
1095014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    inputs_[0] = object;
1096014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    inputs_[1] = prototype;
1097958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1098958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1099014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* object() const { return inputs_[0]; }
1100014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* prototype() const { return inputs_[1]; }
1101958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1102014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(HasInPrototypeChainAndBranch,
1103014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                               "has-in-prototype-chain-and-branch")
1104014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DECLARE_HYDROGEN_ACCESSOR(HasInPrototypeChainAndBranch)
1105958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1106958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1107958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1108014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LBoundsCheck final : public LTemplateInstruction<0, 2, 0> {
1109958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
1110958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LBoundsCheck(LOperand* index, LOperand* length) {
1111958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[0] = index;
1112958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[1] = length;
1113958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1114958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1115958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* index() { return inputs_[0]; }
1116958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* length() { return inputs_[1]; }
1117958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1118958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(BoundsCheck, "bounds-check")
1119958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(BoundsCheck)
1120958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1121958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1122958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1123014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LBitI final : public LTemplateInstruction<1, 2, 0> {
1124958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
1125958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LBitI(LOperand* left, LOperand* right) {
1126958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[0] = left;
1127958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[1] = right;
1128958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1129958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1130958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* left() { return inputs_[0]; }
1131958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* right() { return inputs_[1]; }
1132958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1133958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Token::Value op() const { return hydrogen()->op(); }
1134958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1135958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(BitI, "bit-i")
1136958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(Bitwise)
1137958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1138958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1139958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1140014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LShiftI final : public LTemplateInstruction<1, 2, 0> {
1141958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
1142958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LShiftI(Token::Value op, LOperand* left, LOperand* right, bool can_deopt)
1143958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      : op_(op), can_deopt_(can_deopt) {
1144958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[0] = left;
1145958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[1] = right;
1146958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1147958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1148958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Token::Value op() const { return op_; }
1149958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* left() { return inputs_[0]; }
1150958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* right() { return inputs_[1]; }
1151958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  bool can_deopt() const { return can_deopt_; }
1152958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1153958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(ShiftI, "shift-i")
1154958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1155958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier private:
1156958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Token::Value op_;
1157958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  bool can_deopt_;
1158958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1159958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1160958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1161014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LSubI final : public LTemplateInstruction<1, 2, 0> {
1162958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
1163958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LSubI(LOperand* left, LOperand* right) {
1164958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[0] = left;
1165958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[1] = right;
1166958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1167958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1168958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* left() { return inputs_[0]; }
1169958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* right() { return inputs_[1]; }
1170958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1171958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(SubI, "sub-i")
1172958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(Sub)
1173958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1174958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1175958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1176014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LRSubI final : public LTemplateInstruction<1, 2, 0> {
1177958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
1178958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LRSubI(LOperand* left, LOperand* right) {
1179958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[0] = left;
1180958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[1] = right;
1181958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1182958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1183958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* left() { return inputs_[0]; }
1184958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* right() { return inputs_[1]; }
1185958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1186958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(RSubI, "rsub-i")
1187958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(Sub)
1188958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1189958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1190958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1191014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LConstantI final : public LTemplateInstruction<1, 0, 0> {
1192958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
1193958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(ConstantI, "constant-i")
1194958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(Constant)
1195958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1196958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  int32_t value() const { return hydrogen()->Integer32Value(); }
1197958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1198958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1199958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1200014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LConstantS final : public LTemplateInstruction<1, 0, 0> {
1201958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
1202958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(ConstantS, "constant-s")
1203958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(Constant)
1204958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1205958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Smi* value() const { return Smi::FromInt(hydrogen()->Integer32Value()); }
1206958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1207958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1208958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1209014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LConstantD final : public LTemplateInstruction<1, 0, 0> {
1210958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
1211958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(ConstantD, "constant-d")
1212958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(Constant)
1213958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1214958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  double value() const { return hydrogen()->DoubleValue(); }
1215014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  uint64_t bits() const { return hydrogen()->DoubleValueAsBits(); }
1216958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1217958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1218958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1219014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LConstantE final : public LTemplateInstruction<1, 0, 0> {
1220958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
1221958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(ConstantE, "constant-e")
1222958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(Constant)
1223958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1224958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  ExternalReference value() const {
1225958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    return hydrogen()->ExternalReferenceValue();
1226958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1227958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1228958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1229958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1230014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LConstantT final : public LTemplateInstruction<1, 0, 0> {
1231958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
1232958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(ConstantT, "constant-t")
1233958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(Constant)
1234958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1235958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Handle<Object> value(Isolate* isolate) const {
1236958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    return hydrogen()->handle(isolate);
1237958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1238958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1239958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1240958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1241014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LBranch final : public LControlInstruction<1, 0> {
1242958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
1243958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  explicit LBranch(LOperand* value) { inputs_[0] = value; }
1244958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1245958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* value() { return inputs_[0]; }
1246958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1247958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(Branch, "branch")
1248958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(Branch)
1249958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1250014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void PrintDataTo(StringStream* stream) override;
1251958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1252958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1253958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1254014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LCmpMapAndBranch final : public LControlInstruction<1, 1> {
1255958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
1256958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LCmpMapAndBranch(LOperand* value, LOperand* temp) {
1257958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[0] = value;
1258958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    temps_[0] = temp;
1259958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1260958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1261958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* value() { return inputs_[0]; }
1262958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* temp() { return temps_[0]; }
1263958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1264958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(CmpMapAndBranch, "cmp-map-and-branch")
1265958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(CompareMap)
1266958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1267958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Handle<Map> map() const { return hydrogen()->map().handle(); }
1268958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1269958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1270958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1271014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LSeqStringGetChar final : public LTemplateInstruction<1, 2, 0> {
1272958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
1273958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LSeqStringGetChar(LOperand* string, LOperand* index) {
1274958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[0] = string;
1275958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[1] = index;
1276958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1277958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1278958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* string() const { return inputs_[0]; }
1279958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* index() const { return inputs_[1]; }
1280958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1281958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(SeqStringGetChar, "seq-string-get-char")
1282958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(SeqStringGetChar)
1283958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1284958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1285958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1286014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LSeqStringSetChar final : public LTemplateInstruction<1, 4, 0> {
1287958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
1288958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LSeqStringSetChar(LOperand* context, LOperand* string, LOperand* index,
1289958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                    LOperand* value) {
1290958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[0] = context;
1291958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[1] = string;
1292958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[2] = index;
1293958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[3] = value;
1294958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1295958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1296958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* string() { return inputs_[1]; }
1297958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* index() { return inputs_[2]; }
1298958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* value() { return inputs_[3]; }
1299958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1300958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(SeqStringSetChar, "seq-string-set-char")
1301958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(SeqStringSetChar)
1302958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1303958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1304958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1305014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LAddI final : public LTemplateInstruction<1, 2, 0> {
1306958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
1307958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LAddI(LOperand* left, LOperand* right) {
1308958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[0] = left;
1309958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[1] = right;
1310958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1311958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1312958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* left() { return inputs_[0]; }
1313958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* right() { return inputs_[1]; }
1314958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1315958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(AddI, "add-i")
1316958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(Add)
1317958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1318958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1319958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1320014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LMathMinMax final : public LTemplateInstruction<1, 2, 0> {
1321958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
1322958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LMathMinMax(LOperand* left, LOperand* right) {
1323958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[0] = left;
1324958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[1] = right;
1325958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1326958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1327958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* left() { return inputs_[0]; }
1328958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* right() { return inputs_[1]; }
1329958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1330958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(MathMinMax, "math-min-max")
1331958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(MathMinMax)
1332958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1333958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1334958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1335014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LPower final : public LTemplateInstruction<1, 2, 0> {
1336958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
1337958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LPower(LOperand* left, LOperand* right) {
1338958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[0] = left;
1339958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[1] = right;
1340958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1341958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1342958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* left() { return inputs_[0]; }
1343958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* right() { return inputs_[1]; }
1344958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1345958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(Power, "power")
1346958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(Power)
1347958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1348958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1349958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1350014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LArithmeticD final : public LTemplateInstruction<1, 2, 0> {
1351958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
1352958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LArithmeticD(Token::Value op, LOperand* left, LOperand* right) : op_(op) {
1353958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[0] = left;
1354958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[1] = right;
1355958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1356958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1357958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Token::Value op() const { return op_; }
1358958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* left() { return inputs_[0]; }
1359958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* right() { return inputs_[1]; }
1360958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1361014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Opcode opcode() const override { return LInstruction::kArithmeticD; }
1362014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void CompileToNative(LCodeGen* generator) override;
1363014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  const char* Mnemonic() const override;
1364958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1365958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier private:
1366958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Token::Value op_;
1367958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1368958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1369958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1370014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LArithmeticT final : public LTemplateInstruction<1, 3, 0> {
1371958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
1372958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LArithmeticT(Token::Value op, LOperand* context, LOperand* left,
1373958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier               LOperand* right)
1374958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      : op_(op) {
1375958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[0] = context;
1376958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[1] = left;
1377958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[2] = right;
1378958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1379958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1380958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* context() { return inputs_[0]; }
1381958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* left() { return inputs_[1]; }
1382958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* right() { return inputs_[2]; }
1383958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Token::Value op() const { return op_; }
1384958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1385014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Opcode opcode() const override { return LInstruction::kArithmeticT; }
1386014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void CompileToNative(LCodeGen* generator) override;
1387014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  const char* Mnemonic() const override;
1388014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1389014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DECLARE_HYDROGEN_ACCESSOR(BinaryOperation)
1390014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1391958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier private:
1392958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Token::Value op_;
1393958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1394958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1395958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1396014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LReturn final : public LTemplateInstruction<0, 3, 0> {
1397958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
1398958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LReturn(LOperand* value, LOperand* context, LOperand* parameter_count) {
1399958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[0] = value;
1400958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[1] = context;
1401958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[2] = parameter_count;
1402958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1403958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1404958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* value() { return inputs_[0]; }
1405958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1406958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  bool has_constant_parameter_count() {
1407958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    return parameter_count()->IsConstantOperand();
1408958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1409958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LConstantOperand* constant_parameter_count() {
1410958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    DCHECK(has_constant_parameter_count());
1411958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    return LConstantOperand::cast(parameter_count());
1412958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1413958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* parameter_count() { return inputs_[2]; }
1414958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1415958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(Return, "return")
1416958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1417958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1418958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1419014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LLoadNamedField final : public LTemplateInstruction<1, 1, 0> {
1420958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
1421958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  explicit LLoadNamedField(LOperand* object) { inputs_[0] = object; }
1422958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1423958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* object() { return inputs_[0]; }
1424958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1425958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(LoadNamedField, "load-named-field")
1426958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(LoadNamedField)
1427958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1428958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1429958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1430014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LLoadFunctionPrototype final : public LTemplateInstruction<1, 1, 0> {
1431958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
1432958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  explicit LLoadFunctionPrototype(LOperand* function) { inputs_[0] = function; }
1433958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1434958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* function() { return inputs_[0]; }
1435958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1436958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(LoadFunctionPrototype, "load-function-prototype")
1437958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(LoadFunctionPrototype)
1438958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1439958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1440958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1441014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LLoadRoot final : public LTemplateInstruction<1, 0, 0> {
1442958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
1443958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(LoadRoot, "load-root")
1444958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(LoadRoot)
1445958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1446958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Heap::RootListIndex index() const { return hydrogen()->index(); }
1447958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1448958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1449958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1450014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LLoadKeyed final : public LTemplateInstruction<1, 3, 0> {
1451958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
1452014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LLoadKeyed(LOperand* elements, LOperand* key, LOperand* backing_store_owner) {
1453958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[0] = elements;
1454958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[1] = key;
1455014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    inputs_[2] = backing_store_owner;
1456958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1457958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1458958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* elements() { return inputs_[0]; }
1459958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* key() { return inputs_[1]; }
1460014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* backing_store_owner() { return inputs_[2]; }
1461958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  ElementsKind elements_kind() const { return hydrogen()->elements_kind(); }
1462958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  bool is_fixed_typed_array() const {
1463958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    return hydrogen()->is_fixed_typed_array();
1464958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1465958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1466958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(LoadKeyed, "load-keyed")
1467958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(LoadKeyed)
1468958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1469014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void PrintDataTo(StringStream* stream) override;
1470958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  uint32_t base_offset() const { return hydrogen()->base_offset(); }
1471958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1472958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1473958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1474014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LLoadContextSlot final : public LTemplateInstruction<1, 1, 0> {
1475958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
1476958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  explicit LLoadContextSlot(LOperand* context) { inputs_[0] = context; }
1477958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1478958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* context() { return inputs_[0]; }
1479958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1480958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(LoadContextSlot, "load-context-slot")
1481958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(LoadContextSlot)
1482958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1483958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  int slot_index() { return hydrogen()->slot_index(); }
1484958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1485014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void PrintDataTo(StringStream* stream) override;
1486958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1487958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1488958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1489014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LStoreContextSlot final : public LTemplateInstruction<0, 2, 0> {
1490958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
1491958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LStoreContextSlot(LOperand* context, LOperand* value) {
1492958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[0] = context;
1493958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[1] = value;
1494958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1495958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1496958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* context() { return inputs_[0]; }
1497958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* value() { return inputs_[1]; }
1498958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1499958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(StoreContextSlot, "store-context-slot")
1500958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(StoreContextSlot)
1501958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1502958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  int slot_index() { return hydrogen()->slot_index(); }
1503958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1504014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void PrintDataTo(StringStream* stream) override;
1505958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1506958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1507958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1508014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LPushArgument final : public LTemplateInstruction<0, 1, 0> {
1509958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
1510958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  explicit LPushArgument(LOperand* value) { inputs_[0] = value; }
1511958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1512958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* value() { return inputs_[0]; }
1513958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1514958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(PushArgument, "push-argument")
1515958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1516958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1517958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1518014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LDrop final : public LTemplateInstruction<0, 0, 0> {
1519958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
1520958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  explicit LDrop(int count) : count_(count) {}
1521958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1522958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  int count() const { return count_; }
1523958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1524958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(Drop, "drop")
1525958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1526958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier private:
1527958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  int count_;
1528958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1529958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1530958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1531014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LStoreCodeEntry final : public LTemplateInstruction<0, 2, 0> {
1532958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
1533958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LStoreCodeEntry(LOperand* function, LOperand* code_object) {
1534958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[0] = function;
1535958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[1] = code_object;
1536958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1537958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1538958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* function() { return inputs_[0]; }
1539958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* code_object() { return inputs_[1]; }
1540958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1541014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void PrintDataTo(StringStream* stream) override;
1542958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1543958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(StoreCodeEntry, "store-code-entry")
1544958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(StoreCodeEntry)
1545958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1546958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1547958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1548014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LInnerAllocatedObject final : public LTemplateInstruction<1, 2, 0> {
1549958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
1550958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LInnerAllocatedObject(LOperand* base_object, LOperand* offset) {
1551958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[0] = base_object;
1552958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[1] = offset;
1553958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1554958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1555958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* base_object() const { return inputs_[0]; }
1556958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* offset() const { return inputs_[1]; }
1557958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1558014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void PrintDataTo(StringStream* stream) override;
1559958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1560958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(InnerAllocatedObject, "inner-allocated-object")
1561958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1562958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1563958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1564014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LThisFunction final : public LTemplateInstruction<1, 0, 0> {
1565958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
1566958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(ThisFunction, "this-function")
1567958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(ThisFunction)
1568958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1569958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1570958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1571014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LContext final : public LTemplateInstruction<1, 0, 0> {
1572958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
1573958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(Context, "context")
1574958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(Context)
1575958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1576958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1577958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1578014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LDeclareGlobals final : public LTemplateInstruction<0, 1, 0> {
1579958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
1580958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  explicit LDeclareGlobals(LOperand* context) { inputs_[0] = context; }
1581958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1582958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* context() { return inputs_[0]; }
1583958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1584958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(DeclareGlobals, "declare-globals")
1585958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(DeclareGlobals)
1586958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1587958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1588958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1589014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LCallWithDescriptor final : public LTemplateResultInstruction<1> {
1590958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
1591958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LCallWithDescriptor(CallInterfaceDescriptor descriptor,
1592958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                      const ZoneList<LOperand*>& operands, Zone* zone)
1593958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      : descriptor_(descriptor),
1594014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        inputs_(descriptor.GetRegisterParameterCount() +
1595014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                    kImplicitRegisterParameterCount,
1596014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                zone) {
1597014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    DCHECK(descriptor.GetRegisterParameterCount() +
1598014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch               kImplicitRegisterParameterCount ==
1599014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch           operands.length());
1600958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_.AddAll(operands, zone);
1601958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1602958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1603958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* target() const { return inputs_[0]; }
1604958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1605958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  const CallInterfaceDescriptor descriptor() { return descriptor_; }
1606958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1607014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DECLARE_HYDROGEN_ACCESSOR(CallWithDescriptor)
1608014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1609014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // The target and context are passed as implicit parameters that are not
1610014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // explicitly listed in the descriptor.
1611014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const int kImplicitRegisterParameterCount = 2;
1612014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1613958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier private:
1614958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(CallWithDescriptor, "call-with-descriptor")
1615958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1616014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void PrintDataTo(StringStream* stream) override;
1617958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1618958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  int arity() const { return hydrogen()->argument_count() - 1; }
1619958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1620958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CallInterfaceDescriptor descriptor_;
1621958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  ZoneList<LOperand*> inputs_;
1622958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1623958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // Iterator support.
1624014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int InputCount() final { return inputs_.length(); }
1625014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* InputAt(int i) final { return inputs_[i]; }
1626958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1627014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int TempCount() final { return 0; }
1628014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* TempAt(int i) final { return NULL; }
1629958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1630958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1631958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1632014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LInvokeFunction final : public LTemplateInstruction<1, 2, 0> {
1633958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
1634958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LInvokeFunction(LOperand* context, LOperand* function) {
1635958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[0] = context;
1636958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[1] = function;
1637958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1638958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1639958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* context() { return inputs_[0]; }
1640958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* function() { return inputs_[1]; }
1641958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1642958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(InvokeFunction, "invoke-function")
1643958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(InvokeFunction)
1644958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1645014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void PrintDataTo(StringStream* stream) override;
1646958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1647958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  int arity() const { return hydrogen()->argument_count() - 1; }
1648958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1649958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1650958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1651014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LCallNewArray final : public LTemplateInstruction<1, 2, 0> {
1652958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
1653958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LCallNewArray(LOperand* context, LOperand* constructor) {
1654958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[0] = context;
1655958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[1] = constructor;
1656958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1657958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1658958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* context() { return inputs_[0]; }
1659958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* constructor() { return inputs_[1]; }
1660958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1661958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(CallNewArray, "call-new-array")
1662958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(CallNewArray)
1663958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1664014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void PrintDataTo(StringStream* stream) override;
1665958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1666958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  int arity() const { return hydrogen()->argument_count() - 1; }
1667958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1668958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1669958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1670014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LCallRuntime final : public LTemplateInstruction<1, 1, 0> {
1671958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
1672958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  explicit LCallRuntime(LOperand* context) { inputs_[0] = context; }
1673958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1674958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* context() { return inputs_[0]; }
1675958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1676958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(CallRuntime, "call-runtime")
1677958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(CallRuntime)
1678958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1679014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool ClobbersDoubleRegisters(Isolate* isolate) const override {
1680958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    return save_doubles() == kDontSaveFPRegs;
1681958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1682958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1683958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  const Runtime::Function* function() const { return hydrogen()->function(); }
1684958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  int arity() const { return hydrogen()->argument_count(); }
1685958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  SaveFPRegsMode save_doubles() const { return hydrogen()->save_doubles(); }
1686958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1687958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1688958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1689014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LInteger32ToDouble final : public LTemplateInstruction<1, 1, 0> {
1690958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
1691958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  explicit LInteger32ToDouble(LOperand* value) { inputs_[0] = value; }
1692958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1693958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* value() { return inputs_[0]; }
1694958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1695958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(Integer32ToDouble, "int32-to-double")
1696958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1697958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1698958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1699014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LUint32ToDouble final : public LTemplateInstruction<1, 1, 0> {
1700958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
1701958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  explicit LUint32ToDouble(LOperand* value) { inputs_[0] = value; }
1702958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1703958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* value() { return inputs_[0]; }
1704958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1705958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(Uint32ToDouble, "uint32-to-double")
1706958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1707958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1708958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1709014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LNumberTagI final : public LTemplateInstruction<1, 1, 2> {
1710958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
1711958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LNumberTagI(LOperand* value, LOperand* temp1, LOperand* temp2) {
1712958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[0] = value;
1713958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    temps_[0] = temp1;
1714958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    temps_[1] = temp2;
1715958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1716958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1717958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* value() { return inputs_[0]; }
1718958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* temp1() { return temps_[0]; }
1719958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* temp2() { return temps_[1]; }
1720958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1721958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(NumberTagI, "number-tag-i")
1722958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1723958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1724958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1725014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LNumberTagU final : public LTemplateInstruction<1, 1, 2> {
1726958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
1727958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LNumberTagU(LOperand* value, LOperand* temp1, LOperand* temp2) {
1728958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[0] = value;
1729958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    temps_[0] = temp1;
1730958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    temps_[1] = temp2;
1731958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1732958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1733958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* value() { return inputs_[0]; }
1734958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* temp1() { return temps_[0]; }
1735958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* temp2() { return temps_[1]; }
1736958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1737958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(NumberTagU, "number-tag-u")
1738958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1739958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1740958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1741014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LNumberTagD final : public LTemplateInstruction<1, 1, 2> {
1742958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
1743958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LNumberTagD(LOperand* value, LOperand* temp, LOperand* temp2) {
1744958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[0] = value;
1745958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    temps_[0] = temp;
1746958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    temps_[1] = temp2;
1747958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1748958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1749958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* value() { return inputs_[0]; }
1750958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* temp() { return temps_[0]; }
1751958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* temp2() { return temps_[1]; }
1752958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1753958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(NumberTagD, "number-tag-d")
1754958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(Change)
1755958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1756958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1757958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1758014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LDoubleToSmi final : public LTemplateInstruction<1, 1, 0> {
1759958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
1760958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  explicit LDoubleToSmi(LOperand* value) { inputs_[0] = value; }
1761958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1762958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* value() { return inputs_[0]; }
1763958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1764958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(DoubleToSmi, "double-to-smi")
1765958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(UnaryOperation)
1766958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1767958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  bool truncating() { return hydrogen()->CanTruncateToInt32(); }
1768958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1769958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1770958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1771958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Sometimes truncating conversion from a tagged value to an int32.
1772014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LDoubleToI final : public LTemplateInstruction<1, 1, 0> {
1773958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
1774958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  explicit LDoubleToI(LOperand* value) { inputs_[0] = value; }
1775958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1776958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* value() { return inputs_[0]; }
1777958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1778958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(DoubleToI, "double-to-i")
1779958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(UnaryOperation)
1780958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1781958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  bool truncating() { return hydrogen()->CanTruncateToInt32(); }
1782958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1783958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1784958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1785958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Truncating conversion from a tagged value to an int32.
1786014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LTaggedToI final : public LTemplateInstruction<1, 1, 2> {
1787958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
1788958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LTaggedToI(LOperand* value, LOperand* temp, LOperand* temp2) {
1789958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[0] = value;
1790958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    temps_[0] = temp;
1791958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    temps_[1] = temp2;
1792958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1793958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1794958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* value() { return inputs_[0]; }
1795958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* temp() { return temps_[0]; }
1796958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* temp2() { return temps_[1]; }
1797958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1798958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(TaggedToI, "tagged-to-i")
1799958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(Change)
1800958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1801958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  bool truncating() { return hydrogen()->CanTruncateToInt32(); }
1802958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1803958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1804958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1805014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LSmiTag final : public LTemplateInstruction<1, 1, 0> {
1806958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
1807958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  explicit LSmiTag(LOperand* value) { inputs_[0] = value; }
1808958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1809958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* value() { return inputs_[0]; }
1810958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1811958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(SmiTag, "smi-tag")
1812958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(Change)
1813958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1814958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1815958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1816014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LNumberUntagD final : public LTemplateInstruction<1, 1, 0> {
1817958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
1818958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  explicit LNumberUntagD(LOperand* value) { inputs_[0] = value; }
1819958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1820958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* value() { return inputs_[0]; }
1821958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1822958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(NumberUntagD, "double-untag")
1823958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(Change)
1824c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
1825c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  bool truncating() { return hydrogen()->CanTruncateToNumber(); }
1826958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1827958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1828958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1829014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LSmiUntag final : public LTemplateInstruction<1, 1, 0> {
1830958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
1831958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LSmiUntag(LOperand* value, bool needs_check) : needs_check_(needs_check) {
1832958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[0] = value;
1833958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1834958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1835958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* value() { return inputs_[0]; }
1836958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  bool needs_check() const { return needs_check_; }
1837958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1838958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(SmiUntag, "smi-untag")
1839958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1840958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier private:
1841958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  bool needs_check_;
1842958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1843958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1844958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1845014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LStoreNamedField final : public LTemplateInstruction<0, 2, 1> {
1846958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
1847958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LStoreNamedField(LOperand* object, LOperand* value, LOperand* temp) {
1848958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[0] = object;
1849958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[1] = value;
1850958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    temps_[0] = temp;
1851958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1852958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1853958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* object() { return inputs_[0]; }
1854958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* value() { return inputs_[1]; }
1855958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* temp() { return temps_[0]; }
1856958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1857958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(StoreNamedField, "store-named-field")
1858958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(StoreNamedField)
1859958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1860014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void PrintDataTo(StringStream* stream) override;
1861958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1862958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Representation representation() const {
1863958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    return hydrogen()->field_representation();
1864958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1865958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1866958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1867958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1868014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LStoreKeyed final : public LTemplateInstruction<0, 4, 0> {
1869958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
1870014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LStoreKeyed(LOperand* object, LOperand* key, LOperand* value,
1871014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              LOperand* backing_store_owner) {
1872958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[0] = object;
1873958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[1] = key;
1874958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[2] = value;
1875014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    inputs_[3] = backing_store_owner;
1876958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1877958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1878958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  bool is_fixed_typed_array() const {
1879958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    return hydrogen()->is_fixed_typed_array();
1880958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1881958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* elements() { return inputs_[0]; }
1882958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* key() { return inputs_[1]; }
1883958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* value() { return inputs_[2]; }
1884014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* backing_store_owner() { return inputs_[3]; }
1885958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  ElementsKind elements_kind() const { return hydrogen()->elements_kind(); }
1886958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1887958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(StoreKeyed, "store-keyed")
1888958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(StoreKeyed)
1889958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1890014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void PrintDataTo(StringStream* stream) override;
1891958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  bool NeedsCanonicalization() {
1892958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    if (hydrogen()->value()->IsAdd() || hydrogen()->value()->IsSub() ||
1893958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        hydrogen()->value()->IsMul() || hydrogen()->value()->IsDiv()) {
1894958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      return false;
1895958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1896958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    return hydrogen()->NeedsCanonicalization();
1897958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1898958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  uint32_t base_offset() const { return hydrogen()->base_offset(); }
1899958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1900958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1901958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1902014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LTransitionElementsKind final : public LTemplateInstruction<0, 2, 1> {
1903958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
1904958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LTransitionElementsKind(LOperand* object, LOperand* context,
1905958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                          LOperand* new_map_temp) {
1906958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[0] = object;
1907958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[1] = context;
1908958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    temps_[0] = new_map_temp;
1909958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1910958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1911958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* context() { return inputs_[1]; }
1912958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* object() { return inputs_[0]; }
1913958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* new_map_temp() { return temps_[0]; }
1914958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1915958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(TransitionElementsKind,
1916958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                               "transition-elements-kind")
1917958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(TransitionElementsKind)
1918958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1919014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void PrintDataTo(StringStream* stream) override;
1920958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1921958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Handle<Map> original_map() { return hydrogen()->original_map().handle(); }
1922958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Handle<Map> transitioned_map() {
1923958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    return hydrogen()->transitioned_map().handle();
1924958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1925958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  ElementsKind from_kind() { return hydrogen()->from_kind(); }
1926958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  ElementsKind to_kind() { return hydrogen()->to_kind(); }
1927958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1928958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
19293b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochclass LTrapAllocationMemento final : public LTemplateInstruction<0, 1, 2> {
1930958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
19313b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  LTrapAllocationMemento(LOperand* object, LOperand* temp1, LOperand* temp2) {
1932958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[0] = object;
19333b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    temps_[0] = temp1;
19343b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    temps_[1] = temp2;
1935958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1936958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1937958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* object() { return inputs_[0]; }
19383b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  LOperand* temp1() { return temps_[0]; }
19393b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  LOperand* temp2() { return temps_[1]; }
1940958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1941958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(TrapAllocationMemento, "trap-allocation-memento")
1942958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1943958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1944958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1945014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LMaybeGrowElements final : public LTemplateInstruction<1, 5, 0> {
1946014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public:
1947014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LMaybeGrowElements(LOperand* context, LOperand* object, LOperand* elements,
1948014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                     LOperand* key, LOperand* current_capacity) {
1949014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    inputs_[0] = context;
1950014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    inputs_[1] = object;
1951014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    inputs_[2] = elements;
1952014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    inputs_[3] = key;
1953014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    inputs_[4] = current_capacity;
1954014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1955014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1956014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* context() { return inputs_[0]; }
1957014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* object() { return inputs_[1]; }
1958014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* elements() { return inputs_[2]; }
1959014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* key() { return inputs_[3]; }
1960014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* current_capacity() { return inputs_[4]; }
1961014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1962f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  bool ClobbersDoubleRegisters(Isolate* isolate) const override { return true; }
1963f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1964014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DECLARE_HYDROGEN_ACCESSOR(MaybeGrowElements)
1965014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(MaybeGrowElements, "maybe-grow-elements")
1966014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch};
1967014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1968014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1969014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LStringAdd final : public LTemplateInstruction<1, 3, 0> {
1970958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
1971958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LStringAdd(LOperand* context, LOperand* left, LOperand* right) {
1972958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[0] = context;
1973958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[1] = left;
1974958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[2] = right;
1975958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1976958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1977958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* context() { return inputs_[0]; }
1978958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* left() { return inputs_[1]; }
1979958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* right() { return inputs_[2]; }
1980958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1981958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(StringAdd, "string-add")
1982958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(StringAdd)
1983958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
1984958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1985958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1986014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LStringCharCodeAt final : public LTemplateInstruction<1, 3, 0> {
1987958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
1988958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LStringCharCodeAt(LOperand* context, LOperand* string, LOperand* index) {
1989958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[0] = context;
1990958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[1] = string;
1991958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[2] = index;
1992958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1993958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1994958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* context() { return inputs_[0]; }
1995958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* string() { return inputs_[1]; }
1996958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* index() { return inputs_[2]; }
1997958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1998958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(StringCharCodeAt, "string-char-code-at")
1999958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(StringCharCodeAt)
2000958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
2001958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2002958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2003014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LStringCharFromCode final : public LTemplateInstruction<1, 2, 0> {
2004958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
2005958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  explicit LStringCharFromCode(LOperand* context, LOperand* char_code) {
2006958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[0] = context;
2007958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[1] = char_code;
2008958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
2009958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2010958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* context() { return inputs_[0]; }
2011958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* char_code() { return inputs_[1]; }
2012958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2013958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(StringCharFromCode, "string-char-from-code")
2014958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(StringCharFromCode)
2015958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
2016958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2017958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2018014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LCheckValue final : public LTemplateInstruction<0, 1, 0> {
2019958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
2020958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  explicit LCheckValue(LOperand* value) { inputs_[0] = value; }
2021958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2022958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* value() { return inputs_[0]; }
2023958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2024958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(CheckValue, "check-value")
2025958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(CheckValue)
2026958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
2027958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2028958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2029014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LCheckArrayBufferNotNeutered final
2030014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    : public LTemplateInstruction<0, 1, 0> {
2031014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public:
2032014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  explicit LCheckArrayBufferNotNeutered(LOperand* view) { inputs_[0] = view; }
2033014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2034014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* view() { return inputs_[0]; }
2035014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2036014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(CheckArrayBufferNotNeutered,
2037014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                               "check-array-buffer-not-neutered")
2038014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DECLARE_HYDROGEN_ACCESSOR(CheckArrayBufferNotNeutered)
2039014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch};
2040014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2041014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2042014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LCheckInstanceType final : public LTemplateInstruction<0, 1, 0> {
2043958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
2044958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  explicit LCheckInstanceType(LOperand* value) { inputs_[0] = value; }
2045958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2046958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* value() { return inputs_[0]; }
2047958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2048958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(CheckInstanceType, "check-instance-type")
2049958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(CheckInstanceType)
2050958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
2051958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2052958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2053014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LCheckMaps final : public LTemplateInstruction<0, 1, 1> {
2054958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
2055014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  explicit LCheckMaps(LOperand* value = NULL, LOperand* temp = NULL) {
2056014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    inputs_[0] = value;
2057014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    temps_[0] = temp;
2058014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
2059958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2060958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* value() { return inputs_[0]; }
2061014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LOperand* temp() { return temps_[0]; }
2062958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2063958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(CheckMaps, "check-maps")
2064958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(CheckMaps)
2065958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
2066958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2067958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2068014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LCheckSmi final : public LTemplateInstruction<1, 1, 0> {
2069958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
2070958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  explicit LCheckSmi(LOperand* value) { inputs_[0] = value; }
2071958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2072958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* value() { return inputs_[0]; }
2073958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2074958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(CheckSmi, "check-smi")
2075958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
2076958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2077958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2078014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LCheckNonSmi final : public LTemplateInstruction<0, 1, 0> {
2079958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
2080958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  explicit LCheckNonSmi(LOperand* value) { inputs_[0] = value; }
2081958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2082958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* value() { return inputs_[0]; }
2083958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2084958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(CheckNonSmi, "check-non-smi")
2085958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(CheckHeapObject)
2086958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
2087958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2088958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2089014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LClampDToUint8 final : public LTemplateInstruction<1, 1, 0> {
2090958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
2091958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  explicit LClampDToUint8(LOperand* unclamped) { inputs_[0] = unclamped; }
2092958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2093958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* unclamped() { return inputs_[0]; }
2094958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2095958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(ClampDToUint8, "clamp-d-to-uint8")
2096958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
2097958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2098958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2099014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LClampIToUint8 final : public LTemplateInstruction<1, 1, 0> {
2100958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
2101958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  explicit LClampIToUint8(LOperand* unclamped) { inputs_[0] = unclamped; }
2102958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2103958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* unclamped() { return inputs_[0]; }
2104958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2105958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(ClampIToUint8, "clamp-i-to-uint8")
2106958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
2107958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2108958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2109014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LClampTToUint8 final : public LTemplateInstruction<1, 1, 1> {
2110958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
2111958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LClampTToUint8(LOperand* unclamped, LOperand* temp) {
2112958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[0] = unclamped;
2113958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    temps_[0] = temp;
2114958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
2115958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2116958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* unclamped() { return inputs_[0]; }
2117958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* temp() { return temps_[0]; }
2118958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2119958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(ClampTToUint8, "clamp-t-to-uint8")
2120958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
2121958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2122958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2123014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LAllocate final : public LTemplateInstruction<1, 2, 2> {
2124958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
2125958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LAllocate(LOperand* context, LOperand* size, LOperand* temp1,
2126958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier            LOperand* temp2) {
2127958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[0] = context;
2128958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[1] = size;
2129958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    temps_[0] = temp1;
2130958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    temps_[1] = temp2;
2131958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
2132958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2133958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* context() { return inputs_[0]; }
2134958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* size() { return inputs_[1]; }
2135958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* temp1() { return temps_[0]; }
2136958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* temp2() { return temps_[1]; }
2137958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2138958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(Allocate, "allocate")
2139958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(Allocate)
2140958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
2141958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2142bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochclass LFastAllocate final : public LTemplateInstruction<1, 1, 2> {
2143bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch public:
2144bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  LFastAllocate(LOperand* size, LOperand* temp1, LOperand* temp2) {
2145bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    inputs_[0] = size;
2146bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    temps_[0] = temp1;
2147bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    temps_[1] = temp2;
2148bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  }
2149bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
2150bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  LOperand* size() { return inputs_[0]; }
2151bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  LOperand* temp1() { return temps_[0]; }
2152bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  LOperand* temp2() { return temps_[1]; }
2153bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
2154bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  DECLARE_CONCRETE_INSTRUCTION(FastAllocate, "fast-allocate")
2155bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  DECLARE_HYDROGEN_ACCESSOR(Allocate)
2156bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch};
2157bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
2158958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2159014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LTypeof final : public LTemplateInstruction<1, 2, 0> {
2160958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
2161958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LTypeof(LOperand* context, LOperand* value) {
2162958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[0] = context;
2163958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[1] = value;
2164958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
2165958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2166958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* context() { return inputs_[0]; }
2167958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* value() { return inputs_[1]; }
2168958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2169958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(Typeof, "typeof")
2170958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
2171958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2172958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2173014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LTypeofIsAndBranch final : public LControlInstruction<1, 0> {
2174958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
2175958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  explicit LTypeofIsAndBranch(LOperand* value) { inputs_[0] = value; }
2176958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2177958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* value() { return inputs_[0]; }
2178958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2179958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(TypeofIsAndBranch, "typeof-is-and-branch")
2180958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(TypeofIsAndBranch)
2181958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2182958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Handle<String> type_literal() { return hydrogen()->type_literal(); }
2183958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2184014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void PrintDataTo(StringStream* stream) override;
2185958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
2186958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2187958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2188014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LOsrEntry final : public LTemplateInstruction<0, 0, 0> {
2189958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
2190958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOsrEntry() {}
2191958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2192014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool HasInterestingComment(LCodeGen* gen) const override { return false; }
2193958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(OsrEntry, "osr-entry")
2194958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
2195958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2196958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2197014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LStackCheck final : public LTemplateInstruction<0, 1, 0> {
2198958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
2199958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  explicit LStackCheck(LOperand* context) { inputs_[0] = context; }
2200958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2201958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* context() { return inputs_[0]; }
2202958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2203958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(StackCheck, "stack-check")
2204958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_HYDROGEN_ACCESSOR(StackCheck)
2205958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2206958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Label* done_label() { return &done_label_; }
2207958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2208958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier private:
2209958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Label done_label_;
2210958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
2211958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2212958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2213014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LForInPrepareMap final : public LTemplateInstruction<1, 2, 0> {
2214958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
2215958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LForInPrepareMap(LOperand* context, LOperand* object) {
2216958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[0] = context;
2217958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[1] = object;
2218958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
2219958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2220958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* context() { return inputs_[0]; }
2221958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* object() { return inputs_[1]; }
2222958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2223958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(ForInPrepareMap, "for-in-prepare-map")
2224958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
2225958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2226958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2227014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LForInCacheArray final : public LTemplateInstruction<1, 1, 0> {
2228958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
2229958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  explicit LForInCacheArray(LOperand* map) { inputs_[0] = map; }
2230958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2231958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* map() { return inputs_[0]; }
2232958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2233958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(ForInCacheArray, "for-in-cache-array")
2234958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2235958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  int idx() { return HForInCacheArray::cast(this->hydrogen_value())->idx(); }
2236958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
2237958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2238958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2239014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LCheckMapValue final : public LTemplateInstruction<0, 2, 0> {
2240958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
2241958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LCheckMapValue(LOperand* value, LOperand* map) {
2242958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[0] = value;
2243958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[1] = map;
2244958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
2245958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2246958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* value() { return inputs_[0]; }
2247958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* map() { return inputs_[1]; }
2248958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2249958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(CheckMapValue, "check-map-value")
2250958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
2251958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2252958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2253014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LLoadFieldByIndex final : public LTemplateInstruction<1, 2, 0> {
2254958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
2255958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LLoadFieldByIndex(LOperand* object, LOperand* index) {
2256958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[0] = object;
2257958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    inputs_[1] = index;
2258958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
2259958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2260958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* object() { return inputs_[0]; }
2261958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* index() { return inputs_[1]; }
2262958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2263958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DECLARE_CONCRETE_INSTRUCTION(LoadFieldByIndex, "load-field-by-index")
2264958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
2265958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2266958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2267958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierclass LChunkBuilder;
2268014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LPlatformChunk final : public LChunk {
2269958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
2270958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LPlatformChunk(CompilationInfo* info, HGraph* graph) : LChunk(info, graph) {}
2271958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2272958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  int GetNextSpillIndex(RegisterKind kind);
2273958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LOperand* GetNextSpillSlot(RegisterKind kind);
2274958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
2275958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2276958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2277014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LChunkBuilder final : public LChunkBuilderBase {
2278958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
2279958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LChunkBuilder(CompilationInfo* info, HGraph* graph, LAllocator* allocator)
2280958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      : LChunkBuilderBase(info, graph),
2281958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        current_instruction_(NULL),
2282958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        current_block_(NULL),
2283958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        next_block_(NULL),
2284958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        allocator_(allocator) {}
2285958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2286958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // Build the sequence for the graph.
2287958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LPlatformChunk* Build();
2288958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2289958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Declare methods that deal with the individual node types.
2290958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#define DECLARE_DO(type) LInstruction* Do##type(H##type* node);
2291958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  HYDROGEN_CONCRETE_INSTRUCTION_LIST(DECLARE_DO)
2292958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#undef DECLARE_DO
2293958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2294958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LInstruction* DoMultiplyAdd(HMul* mul, HValue* addend);
2295958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LInstruction* DoMultiplySub(HValue* minuend, HMul* mul);
2296958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LInstruction* DoRSub(HSub* instr);
2297958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2298958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  static bool HasMagicNumberForDivisor(int32_t divisor);
2299958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2300958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LInstruction* DoMathFloor(HUnaryMathOperation* instr);
2301958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LInstruction* DoMathRound(HUnaryMathOperation* instr);
2302958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LInstruction* DoMathFround(HUnaryMathOperation* instr);
2303958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LInstruction* DoMathAbs(HUnaryMathOperation* instr);
2304958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LInstruction* DoMathLog(HUnaryMathOperation* instr);
230513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  LInstruction* DoMathCos(HUnaryMathOperation* instr);
230613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  LInstruction* DoMathSin(HUnaryMathOperation* instr);
2307958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LInstruction* DoMathExp(HUnaryMathOperation* instr);
2308958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LInstruction* DoMathSqrt(HUnaryMathOperation* instr);
2309958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LInstruction* DoMathPowHalf(HUnaryMathOperation* instr);
2310958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LInstruction* DoMathClz32(HUnaryMathOperation* instr);
2311958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LInstruction* DoDivByPowerOf2I(HDiv* instr);
2312958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LInstruction* DoDivByConstI(HDiv* instr);
2313958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LInstruction* DoDivI(HDiv* instr);
2314958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LInstruction* DoModByPowerOf2I(HMod* instr);
2315958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LInstruction* DoModByConstI(HMod* instr);
2316958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LInstruction* DoModI(HMod* instr);
2317958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LInstruction* DoFlooringDivByPowerOf2I(HMathFloorOfDiv* instr);
2318958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LInstruction* DoFlooringDivByConstI(HMathFloorOfDiv* instr);
2319958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LInstruction* DoFlooringDivI(HMathFloorOfDiv* instr);
2320958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2321958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier private:
2322958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // Methods for getting operands for Use / Define / Temp.
2323958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LUnallocated* ToUnallocated(Register reg);
2324958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LUnallocated* ToUnallocated(DoubleRegister reg);
2325958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2326958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // Methods for setting up define-use relationships.
2327958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  MUST_USE_RESULT LOperand* Use(HValue* value, LUnallocated* operand);
2328958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  MUST_USE_RESULT LOperand* UseFixed(HValue* value, Register fixed_register);
2329958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  MUST_USE_RESULT LOperand* UseFixedDouble(HValue* value,
2330958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                                           DoubleRegister fixed_register);
2331958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2332958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // A value that is guaranteed to be allocated to a register.
2333958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // Operand created by UseRegister is guaranteed to be live until the end of
2334958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // instruction. This means that register allocator will not reuse it's
2335958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // register for any other operand inside instruction.
2336958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // Operand created by UseRegisterAtStart is guaranteed to be live only at
2337958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // instruction start. Register allocator is free to assign the same register
2338958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // to some other operand used inside instruction (i.e. temporary or
2339958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // output).
2340958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  MUST_USE_RESULT LOperand* UseRegister(HValue* value);
2341958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  MUST_USE_RESULT LOperand* UseRegisterAtStart(HValue* value);
2342958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2343958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // An input operand in a register that may be trashed.
2344958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  MUST_USE_RESULT LOperand* UseTempRegister(HValue* value);
2345958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2346958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // An input operand in a register or stack slot.
2347958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  MUST_USE_RESULT LOperand* Use(HValue* value);
2348958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  MUST_USE_RESULT LOperand* UseAtStart(HValue* value);
2349958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2350958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // An input operand in a register, stack slot or a constant operand.
2351958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  MUST_USE_RESULT LOperand* UseOrConstant(HValue* value);
2352958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  MUST_USE_RESULT LOperand* UseOrConstantAtStart(HValue* value);
2353958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2354958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // An input operand in a register or a constant operand.
2355958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  MUST_USE_RESULT LOperand* UseRegisterOrConstant(HValue* value);
2356958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  MUST_USE_RESULT LOperand* UseRegisterOrConstantAtStart(HValue* value);
2357958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2358958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // An input operand in a constant operand.
2359958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  MUST_USE_RESULT LOperand* UseConstant(HValue* value);
2360958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2361958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // An input operand in register, stack slot or a constant operand.
2362958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // Will not be moved to a register even if one is freely available.
2363014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  MUST_USE_RESULT LOperand* UseAny(HValue* value) override;
2364958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2365958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // Temporary operand that must be in a register.
2366958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  MUST_USE_RESULT LUnallocated* TempRegister();
2367958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  MUST_USE_RESULT LUnallocated* TempDoubleRegister();
2368958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  MUST_USE_RESULT LOperand* FixedTemp(Register reg);
2369958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  MUST_USE_RESULT LOperand* FixedTemp(DoubleRegister reg);
2370958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2371958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // Methods for setting up define-use relationships.
2372958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // Return the same instruction that they are passed.
2373958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LInstruction* Define(LTemplateResultInstruction<1>* instr,
2374958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                       LUnallocated* result);
2375958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LInstruction* DefineAsRegister(LTemplateResultInstruction<1>* instr);
2376958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LInstruction* DefineAsSpilled(LTemplateResultInstruction<1>* instr,
2377958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                                int index);
2378958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LInstruction* DefineSameAsFirst(LTemplateResultInstruction<1>* instr);
2379958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LInstruction* DefineFixed(LTemplateResultInstruction<1>* instr, Register reg);
2380958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LInstruction* DefineFixedDouble(LTemplateResultInstruction<1>* instr,
2381958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                                  DoubleRegister reg);
2382958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LInstruction* AssignEnvironment(LInstruction* instr);
2383958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LInstruction* AssignPointerMap(LInstruction* instr);
2384958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2385958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  enum CanDeoptimize { CAN_DEOPTIMIZE_EAGERLY, CANNOT_DEOPTIMIZE_EAGERLY };
2386958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2387958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // By default we assume that instruction sequences generated for calls
2388958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // cannot deoptimize eagerly and we do not attach environment to this
2389958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // instruction.
2390958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LInstruction* MarkAsCall(
2391958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      LInstruction* instr, HInstruction* hinstr,
2392958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      CanDeoptimize can_deoptimize = CANNOT_DEOPTIMIZE_EAGERLY);
2393958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2394958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  void VisitInstruction(HInstruction* current);
2395958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  void AddInstruction(LInstruction* instr, HInstruction* current);
2396958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2397958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  void DoBasicBlock(HBasicBlock* block, HBasicBlock* next_block);
2398958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LInstruction* DoShift(Token::Value op, HBitwiseBinaryOperation* instr);
2399958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LInstruction* DoArithmeticD(Token::Value op,
2400958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                              HArithmeticBinaryOperation* instr);
2401958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LInstruction* DoArithmeticT(Token::Value op, HBinaryOperation* instr);
2402958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2403958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  HInstruction* current_instruction_;
2404958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  HBasicBlock* current_block_;
2405958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  HBasicBlock* next_block_;
2406958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  LAllocator* allocator_;
2407958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2408958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DISALLOW_COPY_AND_ASSIGN(LChunkBuilder);
2409958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
2410958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2411958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#undef DECLARE_HYDROGEN_ACCESSOR
2412958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#undef DECLARE_CONCRETE_INSTRUCTION
2413014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace internal
2414014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace v8
2415958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2416014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif  // V8_CRANKSHAFT_PPC_LITHIUM_PPC_H_
2417