blob: bf8dbc636dc0c073cca82382bb4b9b3d6f3e649c [file] [log] [blame]
erik.corry@gmail.comf2038fb2012-01-16 11:42:08 +00001// Copyright 2012 the V8 project authors. All rights reserved.
kasperl@chromium.orga5551262010-12-07 12:49:48 +00002// Redistribution and use in source and binary forms, with or without
3// modification, are permitted provided that the following conditions are
4// met:
5//
6// * Redistributions of source code must retain the above copyright
7// notice, this list of conditions and the following disclaimer.
8// * Redistributions in binary form must reproduce the above
9// copyright notice, this list of conditions and the following
10// disclaimer in the documentation and/or other materials provided
11// with the distribution.
12// * Neither the name of Google Inc. nor the names of its
13// contributors may be used to endorse or promote products derived
14// from this software without specific prior written permission.
15//
16// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
28#ifndef V8_IA32_LITHIUM_IA32_H_
29#define V8_IA32_LITHIUM_IA32_H_
30
31#include "hydrogen.h"
32#include "lithium-allocator.h"
kmillikin@chromium.orgd2c22f02011-01-10 08:15:37 +000033#include "lithium.h"
kasperl@chromium.orga5551262010-12-07 12:49:48 +000034#include "safepoint-table.h"
svenpanne@chromium.org6d786c92011-06-15 10:58:27 +000035#include "utils.h"
kasperl@chromium.orga5551262010-12-07 12:49:48 +000036
37namespace v8 {
38namespace internal {
39
40// Forward declarations.
41class LCodeGen;
kasperl@chromium.orga5551262010-12-07 12:49:48 +000042
kasperl@chromium.orga5551262010-12-07 12:49:48 +000043#define LITHIUM_CONCRETE_INSTRUCTION_LIST(V) \
44 V(AccessArgumentsAt) \
45 V(AddI) \
ulan@chromium.org967e2702012-02-28 09:49:15 +000046 V(AllocateObject) \
kasperl@chromium.orga5551262010-12-07 12:49:48 +000047 V(ApplyArguments) \
48 V(ArgumentsElements) \
49 V(ArgumentsLength) \
50 V(ArithmeticD) \
51 V(ArithmeticT) \
kasperl@chromium.orga5551262010-12-07 12:49:48 +000052 V(ArrayLiteral) \
53 V(BitI) \
54 V(BitNotI) \
55 V(BoundsCheck) \
56 V(Branch) \
57 V(CallConstantFunction) \
58 V(CallFunction) \
59 V(CallGlobal) \
60 V(CallKeyed) \
61 V(CallKnownGlobal) \
62 V(CallNamed) \
63 V(CallNew) \
64 V(CallRuntime) \
65 V(CallStub) \
66 V(CheckFunction) \
67 V(CheckInstanceType) \
68 V(CheckMap) \
ricow@chromium.orgbadaffc2011-03-17 12:15:27 +000069 V(CheckNonSmi) \
kasperl@chromium.orga5551262010-12-07 12:49:48 +000070 V(CheckPrototypeMaps) \
71 V(CheckSmi) \
kmillikin@chromium.orgc53e10d2011-05-18 09:12:58 +000072 V(ClampDToUint8) \
73 V(ClampIToUint8) \
74 V(ClampTToUint8) \
ricow@chromium.org83aa5492011-02-07 12:42:56 +000075 V(ClassOfTestAndBranch) \
kasperl@chromium.orga5551262010-12-07 12:49:48 +000076 V(CmpIDAndBranch) \
lrn@chromium.orgac2828d2011-06-23 06:29:21 +000077 V(CmpObjectEqAndBranch) \
whesse@chromium.org7b260152011-06-20 15:33:18 +000078 V(CmpMapAndBranch) \
kasperl@chromium.orga5551262010-12-07 12:49:48 +000079 V(CmpT) \
whesse@chromium.org7b260152011-06-20 15:33:18 +000080 V(CmpConstantEqAndBranch) \
kasperl@chromium.orga5551262010-12-07 12:49:48 +000081 V(ConstantD) \
82 V(ConstantI) \
83 V(ConstantT) \
ricow@chromium.org83aa5492011-02-07 12:42:56 +000084 V(Context) \
yangguo@chromium.org56454712012-02-16 15:33:53 +000085 V(DeclareGlobals) \
kasperl@chromium.orga5551262010-12-07 12:49:48 +000086 V(DeleteProperty) \
87 V(Deoptimize) \
88 V(DivI) \
89 V(DoubleToI) \
whesse@chromium.org7b260152011-06-20 15:33:18 +000090 V(ElementsKind) \
jkummerow@chromium.orgf7a58842012-02-21 10:08:21 +000091 V(FastLiteral) \
whesse@chromium.org4acdc2c2011-08-15 13:01:23 +000092 V(FixedArrayBaseLength) \
kasperl@chromium.orga5551262010-12-07 12:49:48 +000093 V(FunctionLiteral) \
karlklose@chromium.org8f806e82011-03-07 14:06:08 +000094 V(GetCachedArrayIndex) \
kasperl@chromium.orga5551262010-12-07 12:49:48 +000095 V(GlobalObject) \
96 V(GlobalReceiver) \
97 V(Goto) \
ricow@chromium.org83aa5492011-02-07 12:42:56 +000098 V(HasCachedArrayIndexAndBranch) \
ricow@chromium.org83aa5492011-02-07 12:42:56 +000099 V(HasInstanceTypeAndBranch) \
erik.corry@gmail.com3847bd52011-04-27 10:38:56 +0000100 V(In) \
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000101 V(InstanceOf) \
kmillikin@chromium.orgd2c22f02011-01-10 08:15:37 +0000102 V(InstanceOfKnownGlobal) \
sgjesse@chromium.org8e8294a2011-05-02 14:30:53 +0000103 V(InstructionGap) \
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000104 V(Integer32ToDouble) \
danno@chromium.org160a7b02011-04-18 15:51:38 +0000105 V(InvokeFunction) \
vegorov@chromium.org7304bca2011-05-16 12:14:13 +0000106 V(IsConstructCallAndBranch) \
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +0000107 V(IsNilAndBranch) \
ager@chromium.org5f0c45f2010-12-17 08:51:21 +0000108 V(IsObjectAndBranch) \
erikcorry0ad885c2011-11-21 13:51:57 +0000109 V(IsStringAndBranch) \
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000110 V(IsSmiAndBranch) \
vegorov@chromium.org7304bca2011-05-16 12:14:13 +0000111 V(IsUndetectableAndBranch) \
erikcorry0ad885c2011-11-21 13:51:57 +0000112 V(StringCompareAndBranch) \
fschneider@chromium.org9e3e0b62011-01-03 10:16:46 +0000113 V(JSArrayLength) \
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000114 V(Label) \
115 V(LazyBailout) \
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000116 V(LoadContextSlot) \
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000117 V(LoadElements) \
danno@chromium.org4d3fe4e2011-03-10 10:14:28 +0000118 V(LoadExternalArrayPointer) \
ricow@chromium.org83aa5492011-02-07 12:42:56 +0000119 V(LoadFunctionPrototype) \
kmillikin@chromium.orgc36ce6e2011-04-04 08:25:31 +0000120 V(LoadGlobalCell) \
121 V(LoadGlobalGeneric) \
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000122 V(LoadKeyedFastElement) \
rossberg@chromium.org717967f2011-07-20 13:44:42 +0000123 V(LoadKeyedFastDoubleElement) \
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000124 V(LoadKeyedGeneric) \
fschneider@chromium.org7979bbb2011-03-28 10:47:03 +0000125 V(LoadKeyedSpecializedArrayElement) \
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000126 V(LoadNamedField) \
fschneider@chromium.org7979bbb2011-03-28 10:47:03 +0000127 V(LoadNamedFieldPolymorphic) \
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000128 V(LoadNamedGeneric) \
ricow@chromium.org64e3a4b2011-12-13 08:07:27 +0000129 V(MathPowHalf) \
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000130 V(ModI) \
131 V(MulI) \
132 V(NumberTagD) \
133 V(NumberTagI) \
134 V(NumberUntagD) \
jkummerow@chromium.orgf7a58842012-02-21 10:08:21 +0000135 V(ObjectLiteral) \
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000136 V(OsrEntry) \
ricow@chromium.org83aa5492011-02-07 12:42:56 +0000137 V(OuterContext) \
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000138 V(Parameter) \
ager@chromium.org5f0c45f2010-12-17 08:51:21 +0000139 V(Power) \
erik.corry@gmail.comf2038fb2012-01-16 11:42:08 +0000140 V(Random) \
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000141 V(PushArgument) \
142 V(RegExpLiteral) \
143 V(Return) \
144 V(ShiftI) \
145 V(SmiTag) \
146 V(SmiUntag) \
147 V(StackCheck) \
ricow@chromium.org83aa5492011-02-07 12:42:56 +0000148 V(StoreContextSlot) \
vegorov@chromium.org74f333b2011-04-06 11:17:46 +0000149 V(StoreGlobalCell) \
150 V(StoreGlobalGeneric) \
rossberg@chromium.org717967f2011-07-20 13:44:42 +0000151 V(StoreKeyedFastDoubleElement) \
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000152 V(StoreKeyedFastElement) \
153 V(StoreKeyedGeneric) \
fschneider@chromium.org7979bbb2011-03-28 10:47:03 +0000154 V(StoreKeyedSpecializedArrayElement) \
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000155 V(StoreNamedField) \
156 V(StoreNamedGeneric) \
danno@chromium.org160a7b02011-04-18 15:51:38 +0000157 V(StringAdd) \
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +0000158 V(StringCharCodeAt) \
whesse@chromium.orgb08986c2011-03-14 16:13:42 +0000159 V(StringCharFromCode) \
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +0000160 V(StringLength) \
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000161 V(SubI) \
162 V(TaggedToI) \
ricow@chromium.orgd2be9012011-06-01 06:00:58 +0000163 V(ThisFunction) \
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000164 V(Throw) \
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +0000165 V(ToFastProperties) \
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +0000166 V(TransitionElementsKind) \
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000167 V(Typeof) \
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000168 V(TypeofIsAndBranch) \
169 V(UnaryMathOperation) \
170 V(UnknownOSRValue) \
kmillikin@chromium.orgbe6bd102012-02-23 08:45:21 +0000171 V(ValueOf) \
172 V(ForInPrepareMap) \
173 V(ForInCacheArray) \
174 V(CheckMapValue) \
175 V(LoadFieldByIndex)
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000176
177
sgjesse@chromium.org8e8294a2011-05-02 14:30:53 +0000178#define DECLARE_CONCRETE_INSTRUCTION(type, mnemonic) \
179 virtual Opcode opcode() const { return LInstruction::k##type; } \
180 virtual void CompileToNative(LCodeGen* generator); \
181 virtual const char* Mnemonic() const { return mnemonic; } \
182 static L##type* cast(LInstruction* instr) { \
183 ASSERT(instr->Is##type()); \
184 return reinterpret_cast<L##type*>(instr); \
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000185 }
186
187
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000188#define DECLARE_HYDROGEN_ACCESSOR(type) \
189 H##type* hydrogen() const { \
190 return H##type::cast(hydrogen_value()); \
191 }
192
193
194class LInstruction: public ZoneObject {
195 public:
196 LInstruction()
ricow@chromium.org83aa5492011-02-07 12:42:56 +0000197 : environment_(NULL),
198 hydrogen_value_(NULL),
199 is_call_(false),
200 is_save_doubles_(false) { }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000201 virtual ~LInstruction() { }
202
203 virtual void CompileToNative(LCodeGen* generator) = 0;
204 virtual const char* Mnemonic() const = 0;
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000205 virtual void PrintTo(StringStream* stream);
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000206 virtual void PrintDataTo(StringStream* stream);
207 virtual void PrintOutputOperandTo(StringStream* stream);
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000208
sgjesse@chromium.org8e8294a2011-05-02 14:30:53 +0000209 enum Opcode {
210 // Declare a unique enum value for each instruction.
211#define DECLARE_OPCODE(type) k##type,
212 LITHIUM_CONCRETE_INSTRUCTION_LIST(DECLARE_OPCODE)
213 kNumberOfInstructions
214#undef DECLARE_OPCODE
215 };
216
217 virtual Opcode opcode() const = 0;
218
219 // Declare non-virtual type testers for all leaf IR classes.
220#define DECLARE_PREDICATE(type) \
221 bool Is##type() const { return opcode() == k##type; }
222 LITHIUM_CONCRETE_INSTRUCTION_LIST(DECLARE_PREDICATE)
223#undef DECLARE_PREDICATE
224
225 // Declare virtual predicates for instructions that don't have
226 // an opcode.
227 virtual bool IsGap() const { return false; }
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000228
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000229 virtual bool IsControl() const { return false; }
230
ricow@chromium.org83aa5492011-02-07 12:42:56 +0000231 void set_environment(LEnvironment* env) { environment_ = env; }
232 LEnvironment* environment() const { return environment_; }
233 bool HasEnvironment() const { return environment_ != NULL; }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000234
235 void set_pointer_map(LPointerMap* p) { pointer_map_.set(p); }
236 LPointerMap* pointer_map() const { return pointer_map_.get(); }
237 bool HasPointerMap() const { return pointer_map_.is_set(); }
238
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000239
240 void set_hydrogen_value(HValue* value) { hydrogen_value_ = value; }
241 HValue* hydrogen_value() const { return hydrogen_value_; }
242
fschneider@chromium.org1df6b472011-01-26 08:23:03 +0000243 void set_deoptimization_environment(LEnvironment* env) {
244 deoptimization_environment_.set(env);
245 }
246 LEnvironment* deoptimization_environment() const {
247 return deoptimization_environment_.get();
248 }
249 bool HasDeoptimizationEnvironment() const {
250 return deoptimization_environment_.is_set();
251 }
252
ricow@chromium.org83aa5492011-02-07 12:42:56 +0000253 void MarkAsCall() { is_call_ = true; }
254 void MarkAsSaveDoubles() { is_save_doubles_ = true; }
255
256 // Interface to the register allocator and iterators.
257 bool IsMarkedAsCall() const { return is_call_; }
258 bool IsMarkedAsSaveDoubles() const { return is_save_doubles_; }
259
260 virtual bool HasResult() const = 0;
261 virtual LOperand* result() = 0;
262
263 virtual int InputCount() = 0;
264 virtual LOperand* InputAt(int i) = 0;
265 virtual int TempCount() = 0;
266 virtual LOperand* TempAt(int i) = 0;
267
268 LOperand* FirstInput() { return InputAt(0); }
269 LOperand* Output() { return HasResult() ? result() : NULL; }
270
271#ifdef DEBUG
272 void VerifyCall();
273#endif
274
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000275 private:
ricow@chromium.org83aa5492011-02-07 12:42:56 +0000276 LEnvironment* environment_;
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000277 SetOncePointer<LPointerMap> pointer_map_;
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000278 HValue* hydrogen_value_;
fschneider@chromium.org1df6b472011-01-26 08:23:03 +0000279 SetOncePointer<LEnvironment> deoptimization_environment_;
ricow@chromium.org83aa5492011-02-07 12:42:56 +0000280 bool is_call_;
281 bool is_save_doubles_;
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000282};
283
284
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +0000285// R = number of result operands (0 or 1).
286// I = number of input operands.
287// T = number of temporary operands.
288template<int R, int I, int T>
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000289class LTemplateInstruction: public LInstruction {
290 public:
291 // Allow 0 or 1 output operands.
292 STATIC_ASSERT(R == 0 || R == 1);
293 virtual bool HasResult() const { return R != 0; }
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000294 void set_result(LOperand* operand) { results_[0] = operand; }
295 LOperand* result() { return results_[0]; }
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000296
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000297 int InputCount() { return I; }
298 LOperand* InputAt(int i) { return inputs_[i]; }
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000299
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000300 int TempCount() { return T; }
301 LOperand* TempAt(int i) { return temps_[i]; }
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000302
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000303 protected:
svenpanne@chromium.org6d786c92011-06-15 10:58:27 +0000304 EmbeddedContainer<LOperand*, R> results_;
305 EmbeddedContainer<LOperand*, I> inputs_;
306 EmbeddedContainer<LOperand*, T> temps_;
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000307};
308
309
310class LGap: public LTemplateInstruction<0, 0, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000311 public:
sgjesse@chromium.org8e8294a2011-05-02 14:30:53 +0000312 explicit LGap(HBasicBlock* block) : block_(block) {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000313 parallel_moves_[BEFORE] = NULL;
314 parallel_moves_[START] = NULL;
315 parallel_moves_[END] = NULL;
316 parallel_moves_[AFTER] = NULL;
317 }
318
sgjesse@chromium.org8e8294a2011-05-02 14:30:53 +0000319 // Can't use the DECLARE-macro here because of sub-classes.
320 virtual bool IsGap() const { return true; }
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000321 virtual void PrintDataTo(StringStream* stream);
sgjesse@chromium.org8e8294a2011-05-02 14:30:53 +0000322 static LGap* cast(LInstruction* instr) {
323 ASSERT(instr->IsGap());
324 return reinterpret_cast<LGap*>(instr);
325 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000326
327 bool IsRedundant() const;
328
329 HBasicBlock* block() const { return block_; }
330
331 enum InnerPosition {
332 BEFORE,
333 START,
334 END,
335 AFTER,
336 FIRST_INNER_POSITION = BEFORE,
337 LAST_INNER_POSITION = AFTER
338 };
339
340 LParallelMove* GetOrCreateParallelMove(InnerPosition pos) {
341 if (parallel_moves_[pos] == NULL) parallel_moves_[pos] = new LParallelMove;
342 return parallel_moves_[pos];
343 }
344
345 LParallelMove* GetParallelMove(InnerPosition pos) {
346 return parallel_moves_[pos];
347 }
348
349 private:
350 LParallelMove* parallel_moves_[LAST_INNER_POSITION + 1];
351 HBasicBlock* block_;
352};
353
354
sgjesse@chromium.org8e8294a2011-05-02 14:30:53 +0000355class LInstructionGap: public LGap {
356 public:
357 explicit LInstructionGap(HBasicBlock* block) : LGap(block) { }
358
359 DECLARE_CONCRETE_INSTRUCTION(InstructionGap, "gap")
360};
361
362
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000363class LGoto: public LTemplateInstruction<0, 0, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000364 public:
ager@chromium.org04921a82011-06-27 13:21:41 +0000365 explicit LGoto(int block_id) : block_id_(block_id) { }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000366
367 DECLARE_CONCRETE_INSTRUCTION(Goto, "goto")
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000368 virtual void PrintDataTo(StringStream* stream);
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000369 virtual bool IsControl() const { return true; }
370
371 int block_id() const { return block_id_; }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000372
373 private:
374 int block_id_;
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000375};
376
377
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000378class LLazyBailout: public LTemplateInstruction<0, 0, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000379 public:
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000380 DECLARE_CONCRETE_INSTRUCTION(LazyBailout, "lazy-bailout")
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000381};
382
383
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000384class LDeoptimize: public LTemplateInstruction<0, 0, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000385 public:
386 DECLARE_CONCRETE_INSTRUCTION(Deoptimize, "deoptimize")
387};
388
389
390class LLabel: public LGap {
391 public:
392 explicit LLabel(HBasicBlock* block)
393 : LGap(block), replacement_(NULL) { }
394
395 DECLARE_CONCRETE_INSTRUCTION(Label, "label")
396
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000397 virtual void PrintDataTo(StringStream* stream);
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000398
399 int block_id() const { return block()->block_id(); }
400 bool is_loop_header() const { return block()->IsLoopHeader(); }
401 Label* label() { return &label_; }
402 LLabel* replacement() const { return replacement_; }
403 void set_replacement(LLabel* label) { replacement_ = label; }
404 bool HasReplacement() const { return replacement_ != NULL; }
405
406 private:
407 Label label_;
408 LLabel* replacement_;
409};
410
411
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000412class LParameter: public LTemplateInstruction<1, 0, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000413 public:
414 DECLARE_CONCRETE_INSTRUCTION(Parameter, "parameter")
415};
416
417
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +0000418class LCallStub: public LTemplateInstruction<1, 1, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000419 public:
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +0000420 explicit LCallStub(LOperand* context) {
421 inputs_[0] = context;
422 }
423
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000424 DECLARE_CONCRETE_INSTRUCTION(CallStub, "call-stub")
425 DECLARE_HYDROGEN_ACCESSOR(CallStub)
426
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +0000427 LOperand* context() { return inputs_[0]; }
428
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000429 TranscendentalCache::Type transcendental_type() {
430 return hydrogen()->transcendental_type();
431 }
432};
433
434
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000435class LUnknownOSRValue: public LTemplateInstruction<1, 0, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000436 public:
437 DECLARE_CONCRETE_INSTRUCTION(UnknownOSRValue, "unknown-osr-value")
438};
439
440
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +0000441template<int I, int T>
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000442class LControlInstruction: public LTemplateInstruction<0, I, T> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000443 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000444 virtual bool IsControl() const { return true; }
445
ricow@chromium.org4f693d62011-07-04 14:01:31 +0000446 int SuccessorCount() { return hydrogen()->SuccessorCount(); }
447 HBasicBlock* SuccessorAt(int i) { return hydrogen()->SuccessorAt(i); }
448 int true_block_id() { return hydrogen()->SuccessorAt(0)->block_id(); }
449 int false_block_id() { return hydrogen()->SuccessorAt(1)->block_id(); }
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000450
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000451 private:
ricow@chromium.org4f693d62011-07-04 14:01:31 +0000452 HControlInstruction* hydrogen() {
453 return HControlInstruction::cast(this->hydrogen_value());
454 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000455};
456
457
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +0000458class LApplyArguments: public LTemplateInstruction<1, 4, 1> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000459 public:
460 LApplyArguments(LOperand* function,
461 LOperand* receiver,
462 LOperand* length,
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +0000463 LOperand* elements,
464 LOperand* temp) {
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000465 inputs_[0] = function;
466 inputs_[1] = receiver;
467 inputs_[2] = length;
468 inputs_[3] = elements;
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +0000469 temps_[0] = temp;
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000470 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000471
472 DECLARE_CONCRETE_INSTRUCTION(ApplyArguments, "apply-arguments")
473
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000474 LOperand* function() { return inputs_[0]; }
475 LOperand* receiver() { return inputs_[1]; }
476 LOperand* length() { return inputs_[2]; }
477 LOperand* elements() { return inputs_[3]; }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000478};
479
480
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000481class LAccessArgumentsAt: public LTemplateInstruction<1, 3, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000482 public:
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000483 LAccessArgumentsAt(LOperand* arguments, LOperand* length, LOperand* index) {
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000484 inputs_[0] = arguments;
485 inputs_[1] = length;
486 inputs_[2] = index;
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000487 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000488
489 DECLARE_CONCRETE_INSTRUCTION(AccessArgumentsAt, "access-arguments-at")
490
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000491 LOperand* arguments() { return inputs_[0]; }
492 LOperand* length() { return inputs_[1]; }
493 LOperand* index() { return inputs_[2]; }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000494
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000495 virtual void PrintDataTo(StringStream* stream);
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000496};
497
498
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +0000499class LArgumentsLength: public LTemplateInstruction<1, 1, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000500 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000501 explicit LArgumentsLength(LOperand* elements) {
502 inputs_[0] = elements;
503 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000504
505 DECLARE_CONCRETE_INSTRUCTION(ArgumentsLength, "arguments-length")
506};
507
508
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000509class LArgumentsElements: public LTemplateInstruction<1, 0, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000510 public:
511 LArgumentsElements() { }
512
513 DECLARE_CONCRETE_INSTRUCTION(ArgumentsElements, "arguments-elements")
514};
515
516
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000517class LModI: public LTemplateInstruction<1, 2, 1> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000518 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000519 LModI(LOperand* left, LOperand* right, LOperand* temp) {
520 inputs_[0] = left;
521 inputs_[1] = right;
522 temps_[0] = temp;
523 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000524
525 DECLARE_CONCRETE_INSTRUCTION(ModI, "mod-i")
526 DECLARE_HYDROGEN_ACCESSOR(Mod)
527};
528
529
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000530class LDivI: public LTemplateInstruction<1, 2, 1> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000531 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000532 LDivI(LOperand* left, LOperand* right, LOperand* temp) {
533 inputs_[0] = left;
534 inputs_[1] = right;
535 temps_[0] = temp;
536 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000537
538 DECLARE_CONCRETE_INSTRUCTION(DivI, "div-i")
539 DECLARE_HYDROGEN_ACCESSOR(Div)
540};
541
542
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000543class LMulI: public LTemplateInstruction<1, 2, 1> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000544 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000545 LMulI(LOperand* left, LOperand* right, LOperand* temp) {
546 inputs_[0] = left;
547 inputs_[1] = right;
548 temps_[0] = temp;
549 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000550
551 DECLARE_CONCRETE_INSTRUCTION(MulI, "mul-i")
552 DECLARE_HYDROGEN_ACCESSOR(Mul)
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000553};
554
555
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +0000556class LCmpIDAndBranch: public LControlInstruction<2, 0> {
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000557 public:
558 LCmpIDAndBranch(LOperand* left, LOperand* right) {
559 inputs_[0] = left;
560 inputs_[1] = right;
561 }
562
563 DECLARE_CONCRETE_INSTRUCTION(CmpIDAndBranch, "cmp-id-and-branch")
ricow@chromium.org4f693d62011-07-04 14:01:31 +0000564 DECLARE_HYDROGEN_ACCESSOR(CompareIDAndBranch)
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000565
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000566 Token::Value op() const { return hydrogen()->token(); }
567 bool is_double() const {
568 return hydrogen()->GetInputRepresentation().IsDouble();
569 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000570
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000571 virtual void PrintDataTo(StringStream* stream);
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000572};
573
574
jkummerow@chromium.orgddda9e82011-07-06 11:27:02 +0000575class LUnaryMathOperation: public LTemplateInstruction<1, 2, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000576 public:
jkummerow@chromium.orgddda9e82011-07-06 11:27:02 +0000577 LUnaryMathOperation(LOperand* context, LOperand* value) {
578 inputs_[1] = context;
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000579 inputs_[0] = value;
580 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000581
jkummerow@chromium.orgddda9e82011-07-06 11:27:02 +0000582 LOperand* context() { return inputs_[1]; }
583 LOperand* value() { return inputs_[0]; }
584
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000585 DECLARE_CONCRETE_INSTRUCTION(UnaryMathOperation, "unary-math-operation")
586 DECLARE_HYDROGEN_ACCESSOR(UnaryMathOperation)
587
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000588 virtual void PrintDataTo(StringStream* stream);
ager@chromium.org5f0c45f2010-12-17 08:51:21 +0000589 BuiltinFunctionId op() const { return hydrogen()->op(); }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000590};
591
592
ricow@chromium.org64e3a4b2011-12-13 08:07:27 +0000593class LMathPowHalf: public LTemplateInstruction<1, 2, 1> {
594 public:
595 LMathPowHalf(LOperand* context, LOperand* value, LOperand* temp) {
596 inputs_[1] = context;
597 inputs_[0] = value;
598 temps_[0] = temp;
599 }
600
601 LOperand* context() { return inputs_[1]; }
602 LOperand* value() { return inputs_[0]; }
603 LOperand* temp() { return temps_[0]; }
604
605 DECLARE_CONCRETE_INSTRUCTION(MathPowHalf, "math-pow-half")
606
607 virtual void PrintDataTo(StringStream* stream);
608};
609
610
lrn@chromium.orgac2828d2011-06-23 06:29:21 +0000611class LCmpObjectEqAndBranch: public LControlInstruction<2, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000612 public:
lrn@chromium.orgac2828d2011-06-23 06:29:21 +0000613 LCmpObjectEqAndBranch(LOperand* left, LOperand* right) {
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000614 inputs_[0] = left;
615 inputs_[1] = right;
616 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000617
lrn@chromium.orgac2828d2011-06-23 06:29:21 +0000618 DECLARE_CONCRETE_INSTRUCTION(CmpObjectEqAndBranch,
619 "cmp-object-eq-and-branch")
vegorov@chromium.org7304bca2011-05-16 12:14:13 +0000620};
621
622
whesse@chromium.org7b260152011-06-20 15:33:18 +0000623class LCmpConstantEqAndBranch: public LControlInstruction<1, 0> {
624 public:
625 explicit LCmpConstantEqAndBranch(LOperand* left) {
626 inputs_[0] = left;
627 }
628
629 DECLARE_CONCRETE_INSTRUCTION(CmpConstantEqAndBranch,
630 "cmp-constant-eq-and-branch")
ricow@chromium.org4f693d62011-07-04 14:01:31 +0000631 DECLARE_HYDROGEN_ACCESSOR(CompareConstantEqAndBranch)
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000632};
633
634
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +0000635class LIsNilAndBranch: public LControlInstruction<1, 1> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000636 public:
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +0000637 LIsNilAndBranch(LOperand* value, LOperand* temp) {
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000638 inputs_[0] = value;
639 temps_[0] = temp;
640 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000641
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +0000642 DECLARE_CONCRETE_INSTRUCTION(IsNilAndBranch, "is-nil-and-branch")
643 DECLARE_HYDROGEN_ACCESSOR(IsNilAndBranch)
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000644
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +0000645 EqualityKind kind() const { return hydrogen()->kind(); }
646 NilValue nil() const { return hydrogen()->nil(); }
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000647
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000648 virtual void PrintDataTo(StringStream* stream);
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000649};
650
651
vegorov@chromium.org3cf47312011-06-29 13:20:01 +0000652class LIsObjectAndBranch: public LControlInstruction<1, 1> {
ager@chromium.org5f0c45f2010-12-17 08:51:21 +0000653 public:
vegorov@chromium.org3cf47312011-06-29 13:20:01 +0000654 LIsObjectAndBranch(LOperand* value, LOperand* temp) {
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000655 inputs_[0] = value;
656 temps_[0] = temp;
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000657 }
ager@chromium.org5f0c45f2010-12-17 08:51:21 +0000658
659 DECLARE_CONCRETE_INSTRUCTION(IsObjectAndBranch, "is-object-and-branch")
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000660
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000661 virtual void PrintDataTo(StringStream* stream);
ager@chromium.org5f0c45f2010-12-17 08:51:21 +0000662};
663
664
erikcorry0ad885c2011-11-21 13:51:57 +0000665class LIsStringAndBranch: public LControlInstruction<1, 1> {
666 public:
667 LIsStringAndBranch(LOperand* value, LOperand* temp) {
668 inputs_[0] = value;
669 temps_[0] = temp;
670 }
671
672 DECLARE_CONCRETE_INSTRUCTION(IsStringAndBranch, "is-string-and-branch")
673
674 virtual void PrintDataTo(StringStream* stream);
675};
676
677
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +0000678class LIsSmiAndBranch: public LControlInstruction<1, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000679 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000680 explicit LIsSmiAndBranch(LOperand* value) {
681 inputs_[0] = value;
682 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000683
684 DECLARE_CONCRETE_INSTRUCTION(IsSmiAndBranch, "is-smi-and-branch")
ricow@chromium.org4f693d62011-07-04 14:01:31 +0000685 DECLARE_HYDROGEN_ACCESSOR(IsSmiAndBranch)
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000686
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000687 virtual void PrintDataTo(StringStream* stream);
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000688};
689
690
vegorov@chromium.org7304bca2011-05-16 12:14:13 +0000691class LIsUndetectableAndBranch: public LControlInstruction<1, 1> {
692 public:
jkummerow@chromium.orgddda9e82011-07-06 11:27:02 +0000693 LIsUndetectableAndBranch(LOperand* value, LOperand* temp) {
vegorov@chromium.org7304bca2011-05-16 12:14:13 +0000694 inputs_[0] = value;
695 temps_[0] = temp;
696 }
697
698 DECLARE_CONCRETE_INSTRUCTION(IsUndetectableAndBranch,
699 "is-undetectable-and-branch")
700
701 virtual void PrintDataTo(StringStream* stream);
702};
703
704
erikcorry0ad885c2011-11-21 13:51:57 +0000705class LStringCompareAndBranch: public LControlInstruction<3, 0> {
706 public:
707 LStringCompareAndBranch(LOperand* context, LOperand* left, LOperand* right) {
708 inputs_[0] = context;
709 inputs_[1] = left;
710 inputs_[2] = right;
711 }
712
713 DECLARE_CONCRETE_INSTRUCTION(StringCompareAndBranch,
714 "string-compare-and-branch")
715 DECLARE_HYDROGEN_ACCESSOR(StringCompareAndBranch)
716
717 virtual void PrintDataTo(StringStream* stream);
718
719 Token::Value op() const { return hydrogen()->token(); }
720};
721
722
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000723class LHasInstanceTypeAndBranch: public LControlInstruction<1, 1> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000724 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000725 LHasInstanceTypeAndBranch(LOperand* value, LOperand* temp) {
726 inputs_[0] = value;
727 temps_[0] = temp;
728 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000729
730 DECLARE_CONCRETE_INSTRUCTION(HasInstanceTypeAndBranch,
731 "has-instance-type-and-branch")
ricow@chromium.org4f693d62011-07-04 14:01:31 +0000732 DECLARE_HYDROGEN_ACCESSOR(HasInstanceTypeAndBranch)
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000733
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000734 virtual void PrintDataTo(StringStream* stream);
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000735};
736
737
karlklose@chromium.org8f806e82011-03-07 14:06:08 +0000738class LGetCachedArrayIndex: public LTemplateInstruction<1, 1, 0> {
739 public:
740 explicit LGetCachedArrayIndex(LOperand* value) {
741 inputs_[0] = value;
742 }
743
744 DECLARE_CONCRETE_INSTRUCTION(GetCachedArrayIndex, "get-cached-array-index")
745 DECLARE_HYDROGEN_ACCESSOR(GetCachedArrayIndex)
746};
747
748
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +0000749class LHasCachedArrayIndexAndBranch: public LControlInstruction<1, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000750 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000751 explicit LHasCachedArrayIndexAndBranch(LOperand* value) {
752 inputs_[0] = value;
753 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000754
755 DECLARE_CONCRETE_INSTRUCTION(HasCachedArrayIndexAndBranch,
756 "has-cached-array-index-and-branch")
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000757 virtual void PrintDataTo(StringStream* stream);
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000758};
759
760
erik.corry@gmail.comd91075f2011-02-10 07:45:38 +0000761class LIsConstructCallAndBranch: public LControlInstruction<0, 1> {
762 public:
763 explicit LIsConstructCallAndBranch(LOperand* temp) {
764 temps_[0] = temp;
765 }
766
767 DECLARE_CONCRETE_INSTRUCTION(IsConstructCallAndBranch,
768 "is-construct-call-and-branch")
769};
770
771
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000772class LClassOfTestAndBranch: public LControlInstruction<1, 2> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000773 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000774 LClassOfTestAndBranch(LOperand* value, LOperand* temp, LOperand* temp2) {
775 inputs_[0] = value;
776 temps_[0] = temp;
777 temps_[1] = temp2;
778 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000779
780 DECLARE_CONCRETE_INSTRUCTION(ClassOfTestAndBranch,
781 "class-of-test-and-branch")
ricow@chromium.org4f693d62011-07-04 14:01:31 +0000782 DECLARE_HYDROGEN_ACCESSOR(ClassOfTestAndBranch)
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000783
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000784 virtual void PrintDataTo(StringStream* stream);
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000785};
786
787
jkummerow@chromium.orgddda9e82011-07-06 11:27:02 +0000788class LCmpT: public LTemplateInstruction<1, 3, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000789 public:
jkummerow@chromium.orgddda9e82011-07-06 11:27:02 +0000790 LCmpT(LOperand* context, LOperand* left, LOperand* right) {
791 inputs_[0] = context;
792 inputs_[1] = left;
793 inputs_[2] = right;
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000794 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000795
796 DECLARE_CONCRETE_INSTRUCTION(CmpT, "cmp-t")
ricow@chromium.org4f693d62011-07-04 14:01:31 +0000797 DECLARE_HYDROGEN_ACCESSOR(CompareGeneric)
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000798
799 Token::Value op() const { return hydrogen()->token(); }
800};
801
802
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +0000803class LInstanceOf: public LTemplateInstruction<1, 3, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000804 public:
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +0000805 LInstanceOf(LOperand* context, LOperand* left, LOperand* right) {
806 inputs_[0] = context;
807 inputs_[1] = left;
808 inputs_[2] = right;
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000809 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000810
811 DECLARE_CONCRETE_INSTRUCTION(InstanceOf, "instance-of")
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +0000812
813 LOperand* context() { return inputs_[0]; }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000814};
815
816
jkummerow@chromium.orgddda9e82011-07-06 11:27:02 +0000817class LInstanceOfKnownGlobal: public LTemplateInstruction<1, 2, 1> {
kmillikin@chromium.orgd2c22f02011-01-10 08:15:37 +0000818 public:
jkummerow@chromium.orgddda9e82011-07-06 11:27:02 +0000819 LInstanceOfKnownGlobal(LOperand* context, LOperand* value, LOperand* temp) {
820 inputs_[0] = context;
821 inputs_[1] = value;
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000822 temps_[0] = temp;
823 }
kmillikin@chromium.orgd2c22f02011-01-10 08:15:37 +0000824
825 DECLARE_CONCRETE_INSTRUCTION(InstanceOfKnownGlobal,
826 "instance-of-known-global")
827 DECLARE_HYDROGEN_ACCESSOR(InstanceOfKnownGlobal)
828
829 Handle<JSFunction> function() const { return hydrogen()->function(); }
kmillikin@chromium.orgd2c22f02011-01-10 08:15:37 +0000830};
831
832
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000833class LBoundsCheck: public LTemplateInstruction<0, 2, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000834 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000835 LBoundsCheck(LOperand* index, LOperand* length) {
836 inputs_[0] = index;
837 inputs_[1] = length;
838 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000839
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000840 LOperand* index() { return inputs_[0]; }
841 LOperand* length() { return inputs_[1]; }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000842
843 DECLARE_CONCRETE_INSTRUCTION(BoundsCheck, "bounds-check")
844};
845
846
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +0000847class LBitI: public LTemplateInstruction<1, 2, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000848 public:
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000849 LBitI(LOperand* left, LOperand* right) {
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000850 inputs_[0] = left;
851 inputs_[1] = right;
852 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000853
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000854 Token::Value op() const { return hydrogen()->op(); }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000855
856 DECLARE_CONCRETE_INSTRUCTION(BitI, "bit-i")
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000857 DECLARE_HYDROGEN_ACCESSOR(Bitwise)
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000858};
859
860
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +0000861class LShiftI: public LTemplateInstruction<1, 2, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000862 public:
863 LShiftI(Token::Value op, LOperand* left, LOperand* right, bool can_deopt)
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000864 : op_(op), can_deopt_(can_deopt) {
865 inputs_[0] = left;
866 inputs_[1] = right;
867 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000868
869 Token::Value op() const { return op_; }
870
871 bool can_deopt() const { return can_deopt_; }
872
873 DECLARE_CONCRETE_INSTRUCTION(ShiftI, "shift-i")
874
875 private:
876 Token::Value op_;
877 bool can_deopt_;
878};
879
880
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +0000881class LSubI: public LTemplateInstruction<1, 2, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000882 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000883 LSubI(LOperand* left, LOperand* right) {
884 inputs_[0] = left;
885 inputs_[1] = right;
886 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000887
888 DECLARE_CONCRETE_INSTRUCTION(SubI, "sub-i")
889 DECLARE_HYDROGEN_ACCESSOR(Sub)
890};
891
892
erik.corry@gmail.comd91075f2011-02-10 07:45:38 +0000893class LConstantI: public LTemplateInstruction<1, 0, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000894 public:
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000895 DECLARE_CONCRETE_INSTRUCTION(ConstantI, "constant-i")
erik.corry@gmail.comd91075f2011-02-10 07:45:38 +0000896 DECLARE_HYDROGEN_ACCESSOR(Constant)
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000897
erik.corry@gmail.comd91075f2011-02-10 07:45:38 +0000898 int32_t value() const { return hydrogen()->Integer32Value(); }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000899};
900
901
erik.corry@gmail.comd91075f2011-02-10 07:45:38 +0000902class LConstantD: public LTemplateInstruction<1, 0, 1> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000903 public:
erik.corry@gmail.comd91075f2011-02-10 07:45:38 +0000904 explicit LConstantD(LOperand* temp) {
905 temps_[0] = temp;
906 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000907
908 DECLARE_CONCRETE_INSTRUCTION(ConstantD, "constant-d")
erik.corry@gmail.comd91075f2011-02-10 07:45:38 +0000909 DECLARE_HYDROGEN_ACCESSOR(Constant)
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000910
erik.corry@gmail.comd91075f2011-02-10 07:45:38 +0000911 double value() const { return hydrogen()->DoubleValue(); }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000912};
913
914
erik.corry@gmail.comd91075f2011-02-10 07:45:38 +0000915class LConstantT: public LTemplateInstruction<1, 0, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000916 public:
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000917 DECLARE_CONCRETE_INSTRUCTION(ConstantT, "constant-t")
erik.corry@gmail.comd91075f2011-02-10 07:45:38 +0000918 DECLARE_HYDROGEN_ACCESSOR(Constant)
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000919
erik.corry@gmail.comd91075f2011-02-10 07:45:38 +0000920 Handle<Object> value() const { return hydrogen()->handle(); }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000921};
922
923
vegorov@chromium.org7943d462011-08-01 11:41:52 +0000924class LBranch: public LControlInstruction<1, 1> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000925 public:
vegorov@chromium.org7943d462011-08-01 11:41:52 +0000926 explicit LBranch(LOperand* value, LOperand* temp) {
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000927 inputs_[0] = value;
vegorov@chromium.org7943d462011-08-01 11:41:52 +0000928 temps_[0] = temp;
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000929 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000930
931 DECLARE_CONCRETE_INSTRUCTION(Branch, "branch")
ricow@chromium.org4f693d62011-07-04 14:01:31 +0000932 DECLARE_HYDROGEN_ACCESSOR(Branch)
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000933
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000934 virtual void PrintDataTo(StringStream* stream);
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000935};
936
937
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +0000938class LCmpMapAndBranch: public LTemplateInstruction<0, 1, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000939 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000940 explicit LCmpMapAndBranch(LOperand* value) {
941 inputs_[0] = value;
942 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000943
944 DECLARE_CONCRETE_INSTRUCTION(CmpMapAndBranch, "cmp-map-and-branch")
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +0000945 DECLARE_HYDROGEN_ACCESSOR(CompareMap)
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000946
947 virtual bool IsControl() const { return true; }
948
kmillikin@chromium.orgd2c22f02011-01-10 08:15:37 +0000949 Handle<Map> map() const { return hydrogen()->map(); }
950 int true_block_id() const {
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +0000951 return hydrogen()->FirstSuccessor()->block_id();
kmillikin@chromium.orgd2c22f02011-01-10 08:15:37 +0000952 }
953 int false_block_id() const {
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +0000954 return hydrogen()->SecondSuccessor()->block_id();
kmillikin@chromium.orgd2c22f02011-01-10 08:15:37 +0000955 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000956};
957
958
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +0000959class LJSArrayLength: public LTemplateInstruction<1, 1, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000960 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000961 explicit LJSArrayLength(LOperand* value) {
962 inputs_[0] = value;
963 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000964
fschneider@chromium.org9e3e0b62011-01-03 10:16:46 +0000965 DECLARE_CONCRETE_INSTRUCTION(JSArrayLength, "js-array-length")
966 DECLARE_HYDROGEN_ACCESSOR(JSArrayLength)
967};
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000968
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000969
whesse@chromium.org4acdc2c2011-08-15 13:01:23 +0000970class LFixedArrayBaseLength: public LTemplateInstruction<1, 1, 0> {
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +0000971 public:
whesse@chromium.org4acdc2c2011-08-15 13:01:23 +0000972 explicit LFixedArrayBaseLength(LOperand* value) {
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +0000973 inputs_[0] = value;
974 }
975
whesse@chromium.org4acdc2c2011-08-15 13:01:23 +0000976 DECLARE_CONCRETE_INSTRUCTION(FixedArrayBaseLength,
977 "fixed-array-base-length")
978 DECLARE_HYDROGEN_ACCESSOR(FixedArrayBaseLength)
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000979};
980
981
whesse@chromium.org7b260152011-06-20 15:33:18 +0000982class LElementsKind: public LTemplateInstruction<1, 1, 0> {
983 public:
984 explicit LElementsKind(LOperand* value) {
985 inputs_[0] = value;
986 }
987
988 DECLARE_CONCRETE_INSTRUCTION(ElementsKind, "elements-kind")
989 DECLARE_HYDROGEN_ACCESSOR(ElementsKind)
990};
991
992
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000993class LValueOf: public LTemplateInstruction<1, 1, 1> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000994 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000995 LValueOf(LOperand* value, LOperand* temp) {
996 inputs_[0] = value;
997 temps_[0] = temp;
998 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000999
1000 DECLARE_CONCRETE_INSTRUCTION(ValueOf, "value-of")
1001 DECLARE_HYDROGEN_ACCESSOR(ValueOf)
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001002};
1003
1004
jkummerow@chromium.orgddda9e82011-07-06 11:27:02 +00001005class LThrow: public LTemplateInstruction<0, 2, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001006 public:
jkummerow@chromium.orgddda9e82011-07-06 11:27:02 +00001007 LThrow(LOperand* context, LOperand* value) {
1008 inputs_[0] = context;
1009 inputs_[1] = value;
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001010 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001011
jkummerow@chromium.orgddda9e82011-07-06 11:27:02 +00001012 LOperand* context() { return inputs_[0]; }
1013 LOperand* value() { return inputs_[1]; }
1014
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001015 DECLARE_CONCRETE_INSTRUCTION(Throw, "throw")
1016};
1017
1018
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +00001019class LBitNotI: public LTemplateInstruction<1, 1, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001020 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001021 explicit LBitNotI(LOperand* value) {
1022 inputs_[0] = value;
1023 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001024
1025 DECLARE_CONCRETE_INSTRUCTION(BitNotI, "bit-not-i")
1026};
1027
1028
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +00001029class LAddI: public LTemplateInstruction<1, 2, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001030 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001031 LAddI(LOperand* left, LOperand* right) {
1032 inputs_[0] = left;
1033 inputs_[1] = right;
1034 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001035
1036 DECLARE_CONCRETE_INSTRUCTION(AddI, "add-i")
1037 DECLARE_HYDROGEN_ACCESSOR(Add)
1038};
1039
1040
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +00001041class LPower: public LTemplateInstruction<1, 2, 0> {
ager@chromium.org5f0c45f2010-12-17 08:51:21 +00001042 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001043 LPower(LOperand* left, LOperand* right) {
1044 inputs_[0] = left;
1045 inputs_[1] = right;
1046 }
ager@chromium.org5f0c45f2010-12-17 08:51:21 +00001047
1048 DECLARE_CONCRETE_INSTRUCTION(Power, "power")
1049 DECLARE_HYDROGEN_ACCESSOR(Power)
1050};
1051
1052
erik.corry@gmail.comf2038fb2012-01-16 11:42:08 +00001053class LRandom: public LTemplateInstruction<1, 1, 0> {
1054 public:
1055 explicit LRandom(LOperand* global_object) {
1056 inputs_[0] = global_object;
1057 }
1058
1059 DECLARE_CONCRETE_INSTRUCTION(Random, "random")
1060 DECLARE_HYDROGEN_ACCESSOR(Random)
1061};
1062
1063
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +00001064class LArithmeticD: public LTemplateInstruction<1, 2, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001065 public:
1066 LArithmeticD(Token::Value op, LOperand* left, LOperand* right)
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001067 : op_(op) {
1068 inputs_[0] = left;
1069 inputs_[1] = right;
1070 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001071
1072 Token::Value op() const { return op_; }
1073
sgjesse@chromium.org8e8294a2011-05-02 14:30:53 +00001074 virtual Opcode opcode() const { return LInstruction::kArithmeticD; }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001075 virtual void CompileToNative(LCodeGen* generator);
1076 virtual const char* Mnemonic() const;
1077
1078 private:
1079 Token::Value op_;
1080};
1081
1082
jkummerow@chromium.orgddda9e82011-07-06 11:27:02 +00001083class LArithmeticT: public LTemplateInstruction<1, 3, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001084 public:
jkummerow@chromium.orgddda9e82011-07-06 11:27:02 +00001085 LArithmeticT(Token::Value op,
1086 LOperand* context,
1087 LOperand* left,
1088 LOperand* right)
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001089 : op_(op) {
jkummerow@chromium.orgddda9e82011-07-06 11:27:02 +00001090 inputs_[0] = context;
1091 inputs_[1] = left;
1092 inputs_[2] = right;
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001093 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001094
sgjesse@chromium.org8e8294a2011-05-02 14:30:53 +00001095 virtual Opcode opcode() const { return LInstruction::kArithmeticT; }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001096 virtual void CompileToNative(LCodeGen* generator);
1097 virtual const char* Mnemonic() const;
1098
1099 Token::Value op() const { return op_; }
jkummerow@chromium.orgddda9e82011-07-06 11:27:02 +00001100 LOperand* context() { return inputs_[0]; }
1101 LOperand* left() { return inputs_[1]; }
1102 LOperand* right() { return inputs_[2]; }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001103
1104 private:
1105 Token::Value op_;
1106};
1107
1108
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +00001109class LReturn: public LTemplateInstruction<0, 1, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001110 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001111 explicit LReturn(LOperand* value) {
1112 inputs_[0] = value;
1113 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001114
1115 DECLARE_CONCRETE_INSTRUCTION(Return, "return")
1116};
1117
1118
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +00001119class LLoadNamedField: public LTemplateInstruction<1, 1, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001120 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001121 explicit LLoadNamedField(LOperand* object) {
1122 inputs_[0] = object;
1123 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001124
1125 DECLARE_CONCRETE_INSTRUCTION(LoadNamedField, "load-named-field")
1126 DECLARE_HYDROGEN_ACCESSOR(LoadNamedField)
fschneider@chromium.org7979bbb2011-03-28 10:47:03 +00001127
1128 LOperand* object() { return inputs_[0]; }
1129};
1130
1131
jkummerow@chromium.orgddda9e82011-07-06 11:27:02 +00001132class LLoadNamedFieldPolymorphic: public LTemplateInstruction<1, 2, 0> {
fschneider@chromium.org7979bbb2011-03-28 10:47:03 +00001133 public:
jkummerow@chromium.orgddda9e82011-07-06 11:27:02 +00001134 LLoadNamedFieldPolymorphic(LOperand* context, LOperand* object) {
1135 inputs_[0] = context;
1136 inputs_[1] = object;
fschneider@chromium.org7979bbb2011-03-28 10:47:03 +00001137 }
1138
1139 DECLARE_CONCRETE_INSTRUCTION(LoadNamedField, "load-named-field-polymorphic")
1140 DECLARE_HYDROGEN_ACCESSOR(LoadNamedFieldPolymorphic)
1141
jkummerow@chromium.orgddda9e82011-07-06 11:27:02 +00001142 LOperand* context() { return inputs_[0]; }
1143 LOperand* object() { return inputs_[1]; }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001144};
1145
1146
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +00001147class LLoadNamedGeneric: public LTemplateInstruction<1, 2, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001148 public:
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +00001149 LLoadNamedGeneric(LOperand* context, LOperand* object) {
1150 inputs_[0] = context;
1151 inputs_[1] = object;
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001152 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001153
1154 DECLARE_CONCRETE_INSTRUCTION(LoadNamedGeneric, "load-named-generic")
1155 DECLARE_HYDROGEN_ACCESSOR(LoadNamedGeneric)
1156
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +00001157 LOperand* context() { return inputs_[0]; }
1158 LOperand* object() { return inputs_[1]; }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001159 Handle<Object> name() const { return hydrogen()->name(); }
1160};
1161
1162
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001163class LLoadFunctionPrototype: public LTemplateInstruction<1, 1, 1> {
fschneider@chromium.org9e3e0b62011-01-03 10:16:46 +00001164 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001165 LLoadFunctionPrototype(LOperand* function, LOperand* temp) {
1166 inputs_[0] = function;
1167 temps_[0] = temp;
1168 }
fschneider@chromium.org9e3e0b62011-01-03 10:16:46 +00001169
1170 DECLARE_CONCRETE_INSTRUCTION(LoadFunctionPrototype, "load-function-prototype")
1171 DECLARE_HYDROGEN_ACCESSOR(LoadFunctionPrototype)
1172
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001173 LOperand* function() { return inputs_[0]; }
fschneider@chromium.org9e3e0b62011-01-03 10:16:46 +00001174};
1175
1176
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +00001177class LLoadElements: public LTemplateInstruction<1, 1, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001178 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001179 explicit LLoadElements(LOperand* object) {
1180 inputs_[0] = object;
1181 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001182
1183 DECLARE_CONCRETE_INSTRUCTION(LoadElements, "load-elements")
1184};
1185
1186
danno@chromium.org4d3fe4e2011-03-10 10:14:28 +00001187class LLoadExternalArrayPointer: public LTemplateInstruction<1, 1, 0> {
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +00001188 public:
danno@chromium.org4d3fe4e2011-03-10 10:14:28 +00001189 explicit LLoadExternalArrayPointer(LOperand* object) {
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +00001190 inputs_[0] = object;
1191 }
1192
danno@chromium.org4d3fe4e2011-03-10 10:14:28 +00001193 DECLARE_CONCRETE_INSTRUCTION(LoadExternalArrayPointer,
1194 "load-external-array-pointer")
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +00001195};
1196
1197
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +00001198class LLoadKeyedFastElement: public LTemplateInstruction<1, 2, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001199 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001200 LLoadKeyedFastElement(LOperand* elements, LOperand* key) {
1201 inputs_[0] = elements;
1202 inputs_[1] = key;
1203 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001204
1205 DECLARE_CONCRETE_INSTRUCTION(LoadKeyedFastElement, "load-keyed-fast-element")
1206 DECLARE_HYDROGEN_ACCESSOR(LoadKeyedFastElement)
1207
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001208 LOperand* elements() { return inputs_[0]; }
1209 LOperand* key() { return inputs_[1]; }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001210};
1211
1212
rossberg@chromium.org717967f2011-07-20 13:44:42 +00001213class LLoadKeyedFastDoubleElement: public LTemplateInstruction<1, 2, 0> {
1214 public:
1215 LLoadKeyedFastDoubleElement(LOperand* elements,
1216 LOperand* key) {
1217 inputs_[0] = elements;
1218 inputs_[1] = key;
1219 }
1220
1221 DECLARE_CONCRETE_INSTRUCTION(LoadKeyedFastDoubleElement,
1222 "load-keyed-fast-double-element")
1223 DECLARE_HYDROGEN_ACCESSOR(LoadKeyedFastDoubleElement)
1224
1225 LOperand* elements() { return inputs_[0]; }
1226 LOperand* key() { return inputs_[1]; }
1227};
1228
1229
fschneider@chromium.org7979bbb2011-03-28 10:47:03 +00001230class LLoadKeyedSpecializedArrayElement: public LTemplateInstruction<1, 2, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001231 public:
fschneider@chromium.org7979bbb2011-03-28 10:47:03 +00001232 LLoadKeyedSpecializedArrayElement(LOperand* external_pointer,
1233 LOperand* key) {
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +00001234 inputs_[0] = external_pointer;
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001235 inputs_[1] = key;
1236 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001237
fschneider@chromium.org7979bbb2011-03-28 10:47:03 +00001238 DECLARE_CONCRETE_INSTRUCTION(LoadKeyedSpecializedArrayElement,
1239 "load-keyed-specialized-array-element")
1240 DECLARE_HYDROGEN_ACCESSOR(LoadKeyedSpecializedArrayElement)
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +00001241
1242 LOperand* external_pointer() { return inputs_[0]; }
1243 LOperand* key() { return inputs_[1]; }
kmillikin@chromium.org83e16822011-09-13 08:21:47 +00001244 ElementsKind elements_kind() const {
svenpanne@chromium.org6d786c92011-06-15 10:58:27 +00001245 return hydrogen()->elements_kind();
fschneider@chromium.org7979bbb2011-03-28 10:47:03 +00001246 }
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +00001247};
1248
1249
1250class LLoadKeyedGeneric: public LTemplateInstruction<1, 3, 0> {
1251 public:
1252 LLoadKeyedGeneric(LOperand* context, LOperand* obj, LOperand* key) {
1253 inputs_[0] = context;
1254 inputs_[1] = obj;
1255 inputs_[2] = key;
1256 }
1257
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001258 DECLARE_CONCRETE_INSTRUCTION(LoadKeyedGeneric, "load-keyed-generic")
1259
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +00001260 LOperand* context() { return inputs_[0]; }
1261 LOperand* object() { return inputs_[1]; }
1262 LOperand* key() { return inputs_[2]; }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001263};
1264
1265
kmillikin@chromium.orgc36ce6e2011-04-04 08:25:31 +00001266class LLoadGlobalCell: public LTemplateInstruction<1, 0, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001267 public:
kmillikin@chromium.orgc36ce6e2011-04-04 08:25:31 +00001268 DECLARE_CONCRETE_INSTRUCTION(LoadGlobalCell, "load-global-cell")
1269 DECLARE_HYDROGEN_ACCESSOR(LoadGlobalCell)
1270};
1271
1272
1273class LLoadGlobalGeneric: public LTemplateInstruction<1, 2, 0> {
1274 public:
1275 LLoadGlobalGeneric(LOperand* context, LOperand* global_object) {
1276 inputs_[0] = context;
1277 inputs_[1] = global_object;
1278 }
1279
1280 DECLARE_CONCRETE_INSTRUCTION(LoadGlobalGeneric, "load-global-generic")
1281 DECLARE_HYDROGEN_ACCESSOR(LoadGlobalGeneric)
1282
1283 LOperand* context() { return inputs_[0]; }
1284 LOperand* global_object() { return inputs_[1]; }
1285 Handle<Object> name() const { return hydrogen()->name(); }
1286 bool for_typeof() const { return hydrogen()->for_typeof(); }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001287};
1288
1289
danno@chromium.orge78f9fc2011-12-21 08:29:34 +00001290class LStoreGlobalCell: public LTemplateInstruction<0, 1, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001291 public:
danno@chromium.orge78f9fc2011-12-21 08:29:34 +00001292 explicit LStoreGlobalCell(LOperand* value) {
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001293 inputs_[0] = value;
1294 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001295
vegorov@chromium.org74f333b2011-04-06 11:17:46 +00001296 DECLARE_CONCRETE_INSTRUCTION(StoreGlobalCell, "store-global-cell")
1297 DECLARE_HYDROGEN_ACCESSOR(StoreGlobalCell)
danno@chromium.orge78f9fc2011-12-21 08:29:34 +00001298
1299 LOperand* value() { return inputs_[0]; }
vegorov@chromium.org74f333b2011-04-06 11:17:46 +00001300};
1301
1302
1303class LStoreGlobalGeneric: public LTemplateInstruction<0, 3, 0> {
1304 public:
jkummerow@chromium.orgddda9e82011-07-06 11:27:02 +00001305 LStoreGlobalGeneric(LOperand* context,
1306 LOperand* global_object,
1307 LOperand* value) {
vegorov@chromium.org74f333b2011-04-06 11:17:46 +00001308 inputs_[0] = context;
1309 inputs_[1] = global_object;
1310 inputs_[2] = value;
1311 }
1312
1313 DECLARE_CONCRETE_INSTRUCTION(StoreGlobalGeneric, "store-global-generic")
1314 DECLARE_HYDROGEN_ACCESSOR(StoreGlobalGeneric)
1315
1316 LOperand* context() { return InputAt(0); }
1317 LOperand* global_object() { return InputAt(1); }
1318 Handle<Object> name() const { return hydrogen()->name(); }
1319 LOperand* value() { return InputAt(2); }
mstarzinger@chromium.org1b3afd12011-11-29 14:28:56 +00001320 StrictModeFlag strict_mode_flag() { return hydrogen()->strict_mode_flag(); }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001321};
1322
1323
ricow@chromium.org83aa5492011-02-07 12:42:56 +00001324class LLoadContextSlot: public LTemplateInstruction<1, 1, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001325 public:
ricow@chromium.org83aa5492011-02-07 12:42:56 +00001326 explicit LLoadContextSlot(LOperand* context) {
1327 inputs_[0] = context;
1328 }
1329
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +00001330 DECLARE_CONCRETE_INSTRUCTION(LoadContextSlot, "load-context-slot")
1331 DECLARE_HYDROGEN_ACCESSOR(LoadContextSlot)
1332
ricow@chromium.org83aa5492011-02-07 12:42:56 +00001333 LOperand* context() { return InputAt(0); }
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001334 int slot_index() { return hydrogen()->slot_index(); }
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +00001335
1336 virtual void PrintDataTo(StringStream* stream);
1337};
1338
1339
ricow@chromium.org83aa5492011-02-07 12:42:56 +00001340class LStoreContextSlot: public LTemplateInstruction<0, 2, 1> {
1341 public:
1342 LStoreContextSlot(LOperand* context, LOperand* value, LOperand* temp) {
1343 inputs_[0] = context;
1344 inputs_[1] = value;
1345 temps_[0] = temp;
1346 }
1347
1348 DECLARE_CONCRETE_INSTRUCTION(StoreContextSlot, "store-context-slot")
1349 DECLARE_HYDROGEN_ACCESSOR(StoreContextSlot)
1350
1351 LOperand* context() { return InputAt(0); }
1352 LOperand* value() { return InputAt(1); }
1353 int slot_index() { return hydrogen()->slot_index(); }
ricow@chromium.org83aa5492011-02-07 12:42:56 +00001354
1355 virtual void PrintDataTo(StringStream* stream);
1356};
1357
1358
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +00001359class LPushArgument: public LTemplateInstruction<0, 1, 0> {
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +00001360 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001361 explicit LPushArgument(LOperand* value) {
1362 inputs_[0] = value;
1363 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001364
1365 DECLARE_CONCRETE_INSTRUCTION(PushArgument, "push-argument")
1366};
1367
1368
ricow@chromium.orgd2be9012011-06-01 06:00:58 +00001369class LThisFunction: public LTemplateInstruction<1, 0, 0> {
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +00001370 public:
ricow@chromium.orgd2be9012011-06-01 06:00:58 +00001371 DECLARE_CONCRETE_INSTRUCTION(ThisFunction, "this-function")
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +00001372 DECLARE_HYDROGEN_ACCESSOR(ThisFunction)
ricow@chromium.orgd2be9012011-06-01 06:00:58 +00001373};
1374
1375
ricow@chromium.org83aa5492011-02-07 12:42:56 +00001376class LContext: public LTemplateInstruction<1, 0, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001377 public:
ricow@chromium.org83aa5492011-02-07 12:42:56 +00001378 DECLARE_CONCRETE_INSTRUCTION(Context, "context")
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001379};
1380
1381
ricow@chromium.org83aa5492011-02-07 12:42:56 +00001382class LOuterContext: public LTemplateInstruction<1, 1, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001383 public:
ricow@chromium.org83aa5492011-02-07 12:42:56 +00001384 explicit LOuterContext(LOperand* context) {
1385 inputs_[0] = context;
1386 }
1387
1388 DECLARE_CONCRETE_INSTRUCTION(OuterContext, "outer-context")
1389
1390 LOperand* context() { return InputAt(0); }
1391};
1392
1393
yangguo@chromium.org56454712012-02-16 15:33:53 +00001394class LDeclareGlobals: public LTemplateInstruction<0, 1, 0> {
1395 public:
1396 explicit LDeclareGlobals(LOperand* context) {
1397 inputs_[0] = context;
1398 }
1399
1400 DECLARE_CONCRETE_INSTRUCTION(DeclareGlobals, "declare-globals")
1401 DECLARE_HYDROGEN_ACCESSOR(DeclareGlobals)
1402};
1403
1404
ricow@chromium.org83aa5492011-02-07 12:42:56 +00001405class LGlobalObject: public LTemplateInstruction<1, 1, 0> {
1406 public:
1407 explicit LGlobalObject(LOperand* context) {
1408 inputs_[0] = context;
1409 }
1410
1411 DECLARE_CONCRETE_INSTRUCTION(GlobalObject, "global-object")
1412
1413 LOperand* context() { return InputAt(0); }
1414};
1415
1416
1417class LGlobalReceiver: public LTemplateInstruction<1, 1, 0> {
1418 public:
1419 explicit LGlobalReceiver(LOperand* global_object) {
1420 inputs_[0] = global_object;
1421 }
1422
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001423 DECLARE_CONCRETE_INSTRUCTION(GlobalReceiver, "global-receiver")
ricow@chromium.org83aa5492011-02-07 12:42:56 +00001424
1425 LOperand* global() { return InputAt(0); }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001426};
1427
1428
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +00001429class LCallConstantFunction: public LTemplateInstruction<1, 0, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001430 public:
1431 DECLARE_CONCRETE_INSTRUCTION(CallConstantFunction, "call-constant-function")
1432 DECLARE_HYDROGEN_ACCESSOR(CallConstantFunction)
1433
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +00001434 virtual void PrintDataTo(StringStream* stream);
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001435
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +00001436 Handle<JSFunction> function() { return hydrogen()->function(); }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001437 int arity() const { return hydrogen()->argument_count() - 1; }
1438};
1439
1440
danno@chromium.org160a7b02011-04-18 15:51:38 +00001441class LInvokeFunction: public LTemplateInstruction<1, 2, 0> {
1442 public:
1443 LInvokeFunction(LOperand* context, LOperand* function) {
1444 inputs_[0] = context;
1445 inputs_[1] = function;
1446 }
1447
1448 DECLARE_CONCRETE_INSTRUCTION(InvokeFunction, "invoke-function")
1449 DECLARE_HYDROGEN_ACCESSOR(InvokeFunction)
1450
1451 LOperand* context() { return inputs_[0]; }
1452 LOperand* function() { return inputs_[1]; }
1453
1454 virtual void PrintDataTo(StringStream* stream);
1455
1456 int arity() const { return hydrogen()->argument_count() - 1; }
1457};
1458
1459
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +00001460class LCallKeyed: public LTemplateInstruction<1, 2, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001461 public:
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +00001462 LCallKeyed(LOperand* context, LOperand* key) {
1463 inputs_[0] = context;
1464 inputs_[1] = key;
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001465 }
1466
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001467 DECLARE_CONCRETE_INSTRUCTION(CallKeyed, "call-keyed")
1468 DECLARE_HYDROGEN_ACCESSOR(CallKeyed)
1469
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +00001470 LOperand* context() { return inputs_[0]; }
1471 LOperand* key() { return inputs_[1]; }
1472
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +00001473 virtual void PrintDataTo(StringStream* stream);
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001474
1475 int arity() const { return hydrogen()->argument_count() - 1; }
1476};
1477
1478
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +00001479class LCallNamed: public LTemplateInstruction<1, 1, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001480 public:
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +00001481 explicit LCallNamed(LOperand* context) {
1482 inputs_[0] = context;
1483 }
1484
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001485 DECLARE_CONCRETE_INSTRUCTION(CallNamed, "call-named")
1486 DECLARE_HYDROGEN_ACCESSOR(CallNamed)
1487
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +00001488 virtual void PrintDataTo(StringStream* stream);
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001489
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +00001490 LOperand* context() { return inputs_[0]; }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001491 Handle<String> name() const { return hydrogen()->name(); }
1492 int arity() const { return hydrogen()->argument_count() - 1; }
1493};
1494
1495
danno@chromium.orgc612e022011-11-10 11:38:15 +00001496class LCallFunction: public LTemplateInstruction<1, 2, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001497 public:
danno@chromium.orgc612e022011-11-10 11:38:15 +00001498 explicit LCallFunction(LOperand* context, LOperand* function) {
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +00001499 inputs_[0] = context;
danno@chromium.orgc612e022011-11-10 11:38:15 +00001500 inputs_[1] = function;
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +00001501 }
1502
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001503 DECLARE_CONCRETE_INSTRUCTION(CallFunction, "call-function")
1504 DECLARE_HYDROGEN_ACCESSOR(CallFunction)
1505
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +00001506 LOperand* context() { return inputs_[0]; }
danno@chromium.orgc612e022011-11-10 11:38:15 +00001507 LOperand* function() { return inputs_[1]; }
1508 int arity() const { return hydrogen()->argument_count() - 1; }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001509};
1510
1511
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +00001512class LCallGlobal: public LTemplateInstruction<1, 1, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001513 public:
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +00001514 explicit LCallGlobal(LOperand* context) {
1515 inputs_[0] = context;
1516 }
1517
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001518 DECLARE_CONCRETE_INSTRUCTION(CallGlobal, "call-global")
1519 DECLARE_HYDROGEN_ACCESSOR(CallGlobal)
1520
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +00001521 virtual void PrintDataTo(StringStream* stream);
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001522
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +00001523 LOperand* context() { return inputs_[0]; }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001524 Handle<String> name() const {return hydrogen()->name(); }
1525 int arity() const { return hydrogen()->argument_count() - 1; }
1526};
1527
1528
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +00001529class LCallKnownGlobal: public LTemplateInstruction<1, 0, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001530 public:
1531 DECLARE_CONCRETE_INSTRUCTION(CallKnownGlobal, "call-known-global")
1532 DECLARE_HYDROGEN_ACCESSOR(CallKnownGlobal)
1533
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +00001534 virtual void PrintDataTo(StringStream* stream);
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001535
1536 Handle<JSFunction> target() const { return hydrogen()->target(); }
1537 int arity() const { return hydrogen()->argument_count() - 1; }
1538};
1539
1540
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +00001541class LCallNew: public LTemplateInstruction<1, 2, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001542 public:
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +00001543 LCallNew(LOperand* context, LOperand* constructor) {
1544 inputs_[0] = context;
1545 inputs_[1] = constructor;
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001546 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001547
1548 DECLARE_CONCRETE_INSTRUCTION(CallNew, "call-new")
1549 DECLARE_HYDROGEN_ACCESSOR(CallNew)
1550
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +00001551 virtual void PrintDataTo(StringStream* stream);
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001552
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +00001553 LOperand* context() { return inputs_[0]; }
1554 LOperand* constructor() { return inputs_[1]; }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001555 int arity() const { return hydrogen()->argument_count() - 1; }
1556};
1557
1558
jkummerow@chromium.orgddda9e82011-07-06 11:27:02 +00001559class LCallRuntime: public LTemplateInstruction<1, 1, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001560 public:
jkummerow@chromium.orgddda9e82011-07-06 11:27:02 +00001561 explicit LCallRuntime(LOperand* context) {
1562 inputs_[0] = context;
1563 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001564 DECLARE_CONCRETE_INSTRUCTION(CallRuntime, "call-runtime")
1565 DECLARE_HYDROGEN_ACCESSOR(CallRuntime)
1566
jkummerow@chromium.orgddda9e82011-07-06 11:27:02 +00001567 LOperand* context() { return inputs_[0]; }
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001568 const Runtime::Function* function() const { return hydrogen()->function(); }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001569 int arity() const { return hydrogen()->argument_count(); }
1570};
1571
1572
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +00001573class LInteger32ToDouble: public LTemplateInstruction<1, 1, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001574 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001575 explicit LInteger32ToDouble(LOperand* value) {
1576 inputs_[0] = value;
1577 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001578
1579 DECLARE_CONCRETE_INSTRUCTION(Integer32ToDouble, "int32-to-double")
1580};
1581
1582
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +00001583class LNumberTagI: public LTemplateInstruction<1, 1, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001584 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001585 explicit LNumberTagI(LOperand* value) {
1586 inputs_[0] = value;
1587 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001588
1589 DECLARE_CONCRETE_INSTRUCTION(NumberTagI, "number-tag-i")
1590};
1591
1592
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001593class LNumberTagD: public LTemplateInstruction<1, 1, 1> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001594 public:
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +00001595 LNumberTagD(LOperand* value, LOperand* temp) {
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001596 inputs_[0] = value;
1597 temps_[0] = temp;
1598 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001599
1600 DECLARE_CONCRETE_INSTRUCTION(NumberTagD, "number-tag-d")
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001601};
1602
1603
1604// Sometimes truncating conversion from a tagged value to an int32.
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001605class LDoubleToI: public LTemplateInstruction<1, 1, 1> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001606 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001607 LDoubleToI(LOperand* value, LOperand* temp) {
1608 inputs_[0] = value;
1609 temps_[0] = temp;
1610 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001611
1612 DECLARE_CONCRETE_INSTRUCTION(DoubleToI, "double-to-i")
ricow@chromium.orgc54d3652011-05-30 09:20:16 +00001613 DECLARE_HYDROGEN_ACCESSOR(UnaryOperation)
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001614
1615 bool truncating() { return hydrogen()->CanTruncateToInt32(); }
1616};
1617
1618
1619// Truncating conversion from a tagged value to an int32.
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001620class LTaggedToI: public LTemplateInstruction<1, 1, 1> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001621 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001622 LTaggedToI(LOperand* value, LOperand* temp) {
1623 inputs_[0] = value;
1624 temps_[0] = temp;
1625 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001626
1627 DECLARE_CONCRETE_INSTRUCTION(TaggedToI, "tagged-to-i")
ricow@chromium.orgc54d3652011-05-30 09:20:16 +00001628 DECLARE_HYDROGEN_ACCESSOR(UnaryOperation)
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001629
1630 bool truncating() { return hydrogen()->CanTruncateToInt32(); }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001631};
1632
1633
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +00001634class LSmiTag: public LTemplateInstruction<1, 1, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001635 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001636 explicit LSmiTag(LOperand* value) {
1637 inputs_[0] = value;
1638 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001639
1640 DECLARE_CONCRETE_INSTRUCTION(SmiTag, "smi-tag")
1641};
1642
1643
erik.corry@gmail.comf2038fb2012-01-16 11:42:08 +00001644class LNumberUntagD: public LTemplateInstruction<1, 1, 1> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001645 public:
erik.corry@gmail.comf2038fb2012-01-16 11:42:08 +00001646 explicit LNumberUntagD(LOperand* value, LOperand* temp) {
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001647 inputs_[0] = value;
erik.corry@gmail.comf2038fb2012-01-16 11:42:08 +00001648 temps_[0] = temp;
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001649 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001650
1651 DECLARE_CONCRETE_INSTRUCTION(NumberUntagD, "double-untag")
svenpanne@chromium.org6d786c92011-06-15 10:58:27 +00001652 DECLARE_HYDROGEN_ACCESSOR(Change);
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001653};
1654
1655
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +00001656class LSmiUntag: public LTemplateInstruction<1, 1, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001657 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001658 LSmiUntag(LOperand* value, bool needs_check)
1659 : needs_check_(needs_check) {
1660 inputs_[0] = value;
1661 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001662
1663 DECLARE_CONCRETE_INSTRUCTION(SmiUntag, "smi-untag")
1664
1665 bool needs_check() const { return needs_check_; }
1666
1667 private:
1668 bool needs_check_;
1669};
1670
1671
fschneider@chromium.org3a5fd782011-02-24 10:10:44 +00001672class LStoreNamedField: public LTemplateInstruction<0, 2, 1> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001673 public:
fschneider@chromium.org3a5fd782011-02-24 10:10:44 +00001674 LStoreNamedField(LOperand* obj, LOperand* val, LOperand* temp) {
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001675 inputs_[0] = obj;
1676 inputs_[1] = val;
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001677 temps_[0] = temp;
1678 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001679
1680 DECLARE_CONCRETE_INSTRUCTION(StoreNamedField, "store-named-field")
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +00001681 DECLARE_HYDROGEN_ACCESSOR(StoreNamedField)
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001682
fschneider@chromium.org3a5fd782011-02-24 10:10:44 +00001683 virtual void PrintDataTo(StringStream* stream);
1684
1685 LOperand* object() { return inputs_[0]; }
1686 LOperand* value() { return inputs_[1]; }
1687
1688 Handle<Object> name() const { return hydrogen()->name(); }
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +00001689 bool is_in_object() { return hydrogen()->is_in_object(); }
1690 int offset() { return hydrogen()->offset(); }
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +00001691 Handle<Map> transition() const { return hydrogen()->transition(); }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001692};
1693
1694
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +00001695class LStoreNamedGeneric: public LTemplateInstruction<0, 3, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001696 public:
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +00001697 LStoreNamedGeneric(LOperand* context, LOperand* object, LOperand* value) {
1698 inputs_[0] = context;
1699 inputs_[1] = object;
1700 inputs_[2] = value;
1701 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001702
1703 DECLARE_CONCRETE_INSTRUCTION(StoreNamedGeneric, "store-named-generic")
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +00001704 DECLARE_HYDROGEN_ACCESSOR(StoreNamedGeneric)
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +00001705
fschneider@chromium.org3a5fd782011-02-24 10:10:44 +00001706 virtual void PrintDataTo(StringStream* stream);
1707
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +00001708 LOperand* context() { return inputs_[0]; }
1709 LOperand* object() { return inputs_[1]; }
1710 LOperand* value() { return inputs_[2]; }
1711 Handle<Object> name() const { return hydrogen()->name(); }
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +00001712 StrictModeFlag strict_mode_flag() { return hydrogen()->strict_mode_flag(); }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001713};
1714
1715
fschneider@chromium.org3a5fd782011-02-24 10:10:44 +00001716class LStoreKeyedFastElement: public LTemplateInstruction<0, 3, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001717 public:
fschneider@chromium.org3a5fd782011-02-24 10:10:44 +00001718 LStoreKeyedFastElement(LOperand* obj, LOperand* key, LOperand* val) {
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001719 inputs_[0] = obj;
1720 inputs_[1] = key;
1721 inputs_[2] = val;
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +00001722 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001723
fschneider@chromium.org3a5fd782011-02-24 10:10:44 +00001724 DECLARE_CONCRETE_INSTRUCTION(StoreKeyedFastElement,
1725 "store-keyed-fast-element")
1726 DECLARE_HYDROGEN_ACCESSOR(StoreKeyedFastElement)
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001727
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +00001728 virtual void PrintDataTo(StringStream* stream);
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001729
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001730 LOperand* object() { return inputs_[0]; }
1731 LOperand* key() { return inputs_[1]; }
1732 LOperand* value() { return inputs_[2]; }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001733};
1734
1735
rossberg@chromium.org717967f2011-07-20 13:44:42 +00001736class LStoreKeyedFastDoubleElement: public LTemplateInstruction<0, 3, 0> {
1737 public:
1738 LStoreKeyedFastDoubleElement(LOperand* elements,
1739 LOperand* key,
1740 LOperand* val) {
1741 inputs_[0] = elements;
1742 inputs_[1] = key;
1743 inputs_[2] = val;
1744 }
1745
1746 DECLARE_CONCRETE_INSTRUCTION(StoreKeyedFastDoubleElement,
1747 "store-keyed-fast-double-element")
1748 DECLARE_HYDROGEN_ACCESSOR(StoreKeyedFastDoubleElement)
1749
1750 virtual void PrintDataTo(StringStream* stream);
1751
1752 LOperand* elements() { return inputs_[0]; }
1753 LOperand* key() { return inputs_[1]; }
1754 LOperand* value() { return inputs_[2]; }
1755};
1756
1757
ager@chromium.orgea91cc52011-05-23 06:06:11 +00001758class LStoreKeyedSpecializedArrayElement: public LTemplateInstruction<0, 3, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001759 public:
fschneider@chromium.org7979bbb2011-03-28 10:47:03 +00001760 LStoreKeyedSpecializedArrayElement(LOperand* external_pointer,
1761 LOperand* key,
ager@chromium.orgea91cc52011-05-23 06:06:11 +00001762 LOperand* val) {
fschneider@chromium.org3a5fd782011-02-24 10:10:44 +00001763 inputs_[0] = external_pointer;
1764 inputs_[1] = key;
1765 inputs_[2] = val;
fschneider@chromium.org3a5fd782011-02-24 10:10:44 +00001766 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001767
fschneider@chromium.org7979bbb2011-03-28 10:47:03 +00001768 DECLARE_CONCRETE_INSTRUCTION(StoreKeyedSpecializedArrayElement,
1769 "store-keyed-specialized-array-element")
1770 DECLARE_HYDROGEN_ACCESSOR(StoreKeyedSpecializedArrayElement)
fschneider@chromium.org3a5fd782011-02-24 10:10:44 +00001771
1772 LOperand* external_pointer() { return inputs_[0]; }
1773 LOperand* key() { return inputs_[1]; }
1774 LOperand* value() { return inputs_[2]; }
kmillikin@chromium.org83e16822011-09-13 08:21:47 +00001775 ElementsKind elements_kind() const {
svenpanne@chromium.org6d786c92011-06-15 10:58:27 +00001776 return hydrogen()->elements_kind();
fschneider@chromium.org7979bbb2011-03-28 10:47:03 +00001777 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001778};
1779
1780
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +00001781class LStoreKeyedGeneric: public LTemplateInstruction<0, 4, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001782 public:
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +00001783 LStoreKeyedGeneric(LOperand* context,
1784 LOperand* object,
1785 LOperand* key,
1786 LOperand* value) {
1787 inputs_[0] = context;
1788 inputs_[1] = object;
1789 inputs_[2] = key;
1790 inputs_[3] = value;
1791 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001792
1793 DECLARE_CONCRETE_INSTRUCTION(StoreKeyedGeneric, "store-keyed-generic")
karlklose@chromium.org44bc7082011-04-11 12:33:05 +00001794 DECLARE_HYDROGEN_ACCESSOR(StoreKeyedGeneric)
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +00001795
fschneider@chromium.org3a5fd782011-02-24 10:10:44 +00001796 virtual void PrintDataTo(StringStream* stream);
1797
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +00001798 LOperand* context() { return inputs_[0]; }
1799 LOperand* object() { return inputs_[1]; }
1800 LOperand* key() { return inputs_[2]; }
1801 LOperand* value() { return inputs_[3]; }
mstarzinger@chromium.org1b3afd12011-11-29 14:28:56 +00001802 StrictModeFlag strict_mode_flag() { return hydrogen()->strict_mode_flag(); }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001803};
1804
1805
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +00001806class LTransitionElementsKind: public LTemplateInstruction<1, 1, 2> {
1807 public:
1808 LTransitionElementsKind(LOperand* object,
1809 LOperand* new_map_temp,
1810 LOperand* temp_reg) {
1811 inputs_[0] = object;
1812 temps_[0] = new_map_temp;
1813 temps_[1] = temp_reg;
1814 }
1815
1816 DECLARE_CONCRETE_INSTRUCTION(TransitionElementsKind,
1817 "transition-elements-kind")
1818 DECLARE_HYDROGEN_ACCESSOR(TransitionElementsKind)
1819
1820 virtual void PrintDataTo(StringStream* stream);
1821
1822 LOperand* object() { return inputs_[0]; }
1823 LOperand* new_map_reg() { return temps_[0]; }
1824 LOperand* temp_reg() { return temps_[1]; }
1825 Handle<Map> original_map() { return hydrogen()->original_map(); }
1826 Handle<Map> transitioned_map() { return hydrogen()->transitioned_map(); }
1827};
1828
1829
jkummerow@chromium.orgddda9e82011-07-06 11:27:02 +00001830class LStringAdd: public LTemplateInstruction<1, 3, 0> {
danno@chromium.org160a7b02011-04-18 15:51:38 +00001831 public:
jkummerow@chromium.orgddda9e82011-07-06 11:27:02 +00001832 LStringAdd(LOperand* context, LOperand* left, LOperand* right) {
1833 inputs_[0] = context;
1834 inputs_[1] = left;
1835 inputs_[2] = right;
danno@chromium.org160a7b02011-04-18 15:51:38 +00001836 }
1837
1838 DECLARE_CONCRETE_INSTRUCTION(StringAdd, "string-add")
1839 DECLARE_HYDROGEN_ACCESSOR(StringAdd)
1840
jkummerow@chromium.orgddda9e82011-07-06 11:27:02 +00001841 LOperand* context() { return inputs_[0]; }
1842 LOperand* left() { return inputs_[1]; }
1843 LOperand* right() { return inputs_[2]; }
danno@chromium.org160a7b02011-04-18 15:51:38 +00001844};
1845
1846
jkummerow@chromium.orgddda9e82011-07-06 11:27:02 +00001847class LStringCharCodeAt: public LTemplateInstruction<1, 3, 0> {
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +00001848 public:
jkummerow@chromium.orgddda9e82011-07-06 11:27:02 +00001849 LStringCharCodeAt(LOperand* context, LOperand* string, LOperand* index) {
1850 inputs_[0] = context;
1851 inputs_[1] = string;
1852 inputs_[2] = index;
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +00001853 }
1854
1855 DECLARE_CONCRETE_INSTRUCTION(StringCharCodeAt, "string-char-code-at")
1856 DECLARE_HYDROGEN_ACCESSOR(StringCharCodeAt)
1857
jkummerow@chromium.orgddda9e82011-07-06 11:27:02 +00001858 LOperand* context() { return inputs_[0]; }
1859 LOperand* string() { return inputs_[1]; }
1860 LOperand* index() { return inputs_[2]; }
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +00001861};
1862
1863
jkummerow@chromium.orgddda9e82011-07-06 11:27:02 +00001864class LStringCharFromCode: public LTemplateInstruction<1, 2, 0> {
whesse@chromium.orgb08986c2011-03-14 16:13:42 +00001865 public:
jkummerow@chromium.orgddda9e82011-07-06 11:27:02 +00001866 LStringCharFromCode(LOperand* context, LOperand* char_code) {
1867 inputs_[0] = context;
1868 inputs_[1] = char_code;
whesse@chromium.orgb08986c2011-03-14 16:13:42 +00001869 }
1870
1871 DECLARE_CONCRETE_INSTRUCTION(StringCharFromCode, "string-char-from-code")
1872 DECLARE_HYDROGEN_ACCESSOR(StringCharFromCode)
1873
jkummerow@chromium.orgddda9e82011-07-06 11:27:02 +00001874 LOperand* context() { return inputs_[0]; }
1875 LOperand* char_code() { return inputs_[1]; }
whesse@chromium.orgb08986c2011-03-14 16:13:42 +00001876};
1877
1878
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +00001879class LStringLength: public LTemplateInstruction<1, 1, 0> {
1880 public:
1881 explicit LStringLength(LOperand* string) {
1882 inputs_[0] = string;
1883 }
1884
1885 DECLARE_CONCRETE_INSTRUCTION(StringLength, "string-length")
1886 DECLARE_HYDROGEN_ACCESSOR(StringLength)
1887
1888 LOperand* string() { return inputs_[0]; }
1889};
1890
1891
1892class LCheckFunction: public LTemplateInstruction<0, 1, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001893 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001894 explicit LCheckFunction(LOperand* value) {
1895 inputs_[0] = value;
1896 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001897
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00001898 LOperand* value() { return inputs_[0]; }
1899
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001900 DECLARE_CONCRETE_INSTRUCTION(CheckFunction, "check-function")
1901 DECLARE_HYDROGEN_ACCESSOR(CheckFunction)
1902};
1903
1904
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001905class LCheckInstanceType: public LTemplateInstruction<0, 1, 1> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001906 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001907 LCheckInstanceType(LOperand* value, LOperand* temp) {
1908 inputs_[0] = value;
1909 temps_[0] = temp;
1910 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001911
1912 DECLARE_CONCRETE_INSTRUCTION(CheckInstanceType, "check-instance-type")
1913 DECLARE_HYDROGEN_ACCESSOR(CheckInstanceType)
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001914};
1915
1916
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +00001917class LCheckMap: public LTemplateInstruction<0, 1, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001918 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001919 explicit LCheckMap(LOperand* value) {
1920 inputs_[0] = value;
1921 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001922
1923 DECLARE_CONCRETE_INSTRUCTION(CheckMap, "check-map")
1924 DECLARE_HYDROGEN_ACCESSOR(CheckMap)
1925};
1926
1927
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001928class LCheckPrototypeMaps: public LTemplateInstruction<0, 0, 1> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001929 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001930 explicit LCheckPrototypeMaps(LOperand* temp) {
1931 temps_[0] = temp;
1932 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001933
1934 DECLARE_CONCRETE_INSTRUCTION(CheckPrototypeMaps, "check-prototype-maps")
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +00001935 DECLARE_HYDROGEN_ACCESSOR(CheckPrototypeMaps)
1936
1937 Handle<JSObject> prototype() const { return hydrogen()->prototype(); }
1938 Handle<JSObject> holder() const { return hydrogen()->holder(); }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001939};
1940
1941
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +00001942class LCheckSmi: public LTemplateInstruction<0, 1, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001943 public:
ricow@chromium.orgbadaffc2011-03-17 12:15:27 +00001944 explicit LCheckSmi(LOperand* value) {
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001945 inputs_[0] = value;
1946 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001947
ricow@chromium.orgbadaffc2011-03-17 12:15:27 +00001948 DECLARE_CONCRETE_INSTRUCTION(CheckSmi, "check-smi")
1949};
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001950
ricow@chromium.orgbadaffc2011-03-17 12:15:27 +00001951
kmillikin@chromium.orgc53e10d2011-05-18 09:12:58 +00001952class LClampDToUint8: public LTemplateInstruction<1, 1, 0> {
1953 public:
1954 explicit LClampDToUint8(LOperand* value) {
1955 inputs_[0] = value;
1956 }
1957
1958 LOperand* unclamped() { return inputs_[0]; }
1959
1960 DECLARE_CONCRETE_INSTRUCTION(ClampDToUint8, "clamp-d-to-uint8")
1961};
1962
1963
1964class LClampIToUint8: public LTemplateInstruction<1, 1, 0> {
1965 public:
1966 explicit LClampIToUint8(LOperand* value) {
1967 inputs_[0] = value;
1968 }
1969
1970 LOperand* unclamped() { return inputs_[0]; }
1971
1972 DECLARE_CONCRETE_INSTRUCTION(ClampIToUint8, "clamp-i-to-uint8")
1973};
1974
1975
1976class LClampTToUint8: public LTemplateInstruction<1, 1, 1> {
1977 public:
1978 LClampTToUint8(LOperand* value, LOperand* temp) {
1979 inputs_[0] = value;
1980 temps_[0] = temp;
1981 }
1982
1983 LOperand* unclamped() { return inputs_[0]; }
1984
1985 DECLARE_CONCRETE_INSTRUCTION(ClampTToUint8, "clamp-t-to-uint8")
1986};
1987
1988
ricow@chromium.orgbadaffc2011-03-17 12:15:27 +00001989class LCheckNonSmi: public LTemplateInstruction<0, 1, 0> {
1990 public:
1991 explicit LCheckNonSmi(LOperand* value) {
1992 inputs_[0] = value;
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001993 }
1994
ricow@chromium.orgbadaffc2011-03-17 12:15:27 +00001995 DECLARE_CONCRETE_INSTRUCTION(CheckNonSmi, "check-non-smi")
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001996};
1997
1998
fschneider@chromium.org35814e52012-03-01 15:43:35 +00001999class LAllocateObject: public LTemplateInstruction<1, 1, 1> {
ulan@chromium.org967e2702012-02-28 09:49:15 +00002000 public:
fschneider@chromium.org35814e52012-03-01 15:43:35 +00002001 LAllocateObject(LOperand* context, LOperand* temp) {
ulan@chromium.org967e2702012-02-28 09:49:15 +00002002 inputs_[0] = context;
fschneider@chromium.org35814e52012-03-01 15:43:35 +00002003 temps_[0] = temp;
ulan@chromium.org967e2702012-02-28 09:49:15 +00002004 }
2005
2006 DECLARE_CONCRETE_INSTRUCTION(AllocateObject, "allocate-object")
2007 DECLARE_HYDROGEN_ACCESSOR(AllocateObject)
2008
2009 LOperand* context() { return inputs_[0]; }
2010};
2011
2012
jkummerow@chromium.orgf7a58842012-02-21 10:08:21 +00002013class LFastLiteral: public LTemplateInstruction<1, 1, 0> {
2014 public:
2015 explicit LFastLiteral(LOperand* context) {
2016 inputs_[0] = context;
2017 }
2018
2019 LOperand* context() { return inputs_[0]; }
2020
2021 DECLARE_CONCRETE_INSTRUCTION(FastLiteral, "fast-literal")
2022 DECLARE_HYDROGEN_ACCESSOR(FastLiteral)
2023};
2024
2025
jkummerow@chromium.orgddda9e82011-07-06 11:27:02 +00002026class LArrayLiteral: public LTemplateInstruction<1, 1, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00002027 public:
jkummerow@chromium.orgddda9e82011-07-06 11:27:02 +00002028 explicit LArrayLiteral(LOperand* context) {
2029 inputs_[0] = context;
2030 }
2031
2032 LOperand* context() { return inputs_[0]; }
2033
kasperl@chromium.orga5551262010-12-07 12:49:48 +00002034 DECLARE_CONCRETE_INSTRUCTION(ArrayLiteral, "array-literal")
2035 DECLARE_HYDROGEN_ACCESSOR(ArrayLiteral)
2036};
2037
2038
jkummerow@chromium.orgf7a58842012-02-21 10:08:21 +00002039class LObjectLiteral: public LTemplateInstruction<1, 1, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00002040 public:
jkummerow@chromium.orgf7a58842012-02-21 10:08:21 +00002041 explicit LObjectLiteral(LOperand* context) {
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +00002042 inputs_[0] = context;
2043 }
2044
jkummerow@chromium.orgddda9e82011-07-06 11:27:02 +00002045 LOperand* context() { return inputs_[0]; }
2046
jkummerow@chromium.orgf7a58842012-02-21 10:08:21 +00002047 DECLARE_CONCRETE_INSTRUCTION(ObjectLiteral, "object-literal")
2048 DECLARE_HYDROGEN_ACCESSOR(ObjectLiteral)
kasperl@chromium.orga5551262010-12-07 12:49:48 +00002049};
2050
2051
jkummerow@chromium.orgddda9e82011-07-06 11:27:02 +00002052class LRegExpLiteral: public LTemplateInstruction<1, 1, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00002053 public:
jkummerow@chromium.orgddda9e82011-07-06 11:27:02 +00002054 explicit LRegExpLiteral(LOperand* context) {
2055 inputs_[0] = context;
2056 }
2057
2058 LOperand* context() { return inputs_[0]; }
2059
kasperl@chromium.orga5551262010-12-07 12:49:48 +00002060 DECLARE_CONCRETE_INSTRUCTION(RegExpLiteral, "regexp-literal")
2061 DECLARE_HYDROGEN_ACCESSOR(RegExpLiteral)
2062};
2063
2064
jkummerow@chromium.orgddda9e82011-07-06 11:27:02 +00002065class LFunctionLiteral: public LTemplateInstruction<1, 1, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00002066 public:
jkummerow@chromium.orgddda9e82011-07-06 11:27:02 +00002067 explicit LFunctionLiteral(LOperand* context) {
2068 inputs_[0] = context;
2069 }
2070
2071 LOperand* context() { return inputs_[0]; }
2072
kasperl@chromium.orga5551262010-12-07 12:49:48 +00002073 DECLARE_CONCRETE_INSTRUCTION(FunctionLiteral, "function-literal")
2074 DECLARE_HYDROGEN_ACCESSOR(FunctionLiteral)
2075
2076 Handle<SharedFunctionInfo> shared_info() { return hydrogen()->shared_info(); }
2077};
2078
2079
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00002080class LToFastProperties: public LTemplateInstruction<1, 1, 0> {
2081 public:
2082 explicit LToFastProperties(LOperand* value) {
2083 inputs_[0] = value;
2084 }
2085
2086 DECLARE_CONCRETE_INSTRUCTION(ToFastProperties, "to-fast-properties")
2087 DECLARE_HYDROGEN_ACCESSOR(ToFastProperties)
2088};
2089
2090
jkummerow@chromium.orgddda9e82011-07-06 11:27:02 +00002091class LTypeof: public LTemplateInstruction<1, 2, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00002092 public:
jkummerow@chromium.orgddda9e82011-07-06 11:27:02 +00002093 LTypeof(LOperand* context, LOperand* value) {
2094 inputs_[0] = context;
2095 inputs_[1] = value;
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00002096 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00002097
2098 DECLARE_CONCRETE_INSTRUCTION(Typeof, "typeof")
2099};
2100
2101
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +00002102class LTypeofIsAndBranch: public LControlInstruction<1, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00002103 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00002104 explicit LTypeofIsAndBranch(LOperand* value) {
2105 inputs_[0] = value;
2106 }
2107
2108 DECLARE_CONCRETE_INSTRUCTION(TypeofIsAndBranch, "typeof-is-and-branch")
ricow@chromium.org4f693d62011-07-04 14:01:31 +00002109 DECLARE_HYDROGEN_ACCESSOR(TypeofIsAndBranch)
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00002110
2111 Handle<String> type_literal() { return hydrogen()->type_literal(); }
2112
2113 virtual void PrintDataTo(StringStream* stream);
2114};
2115
2116
jkummerow@chromium.orgddda9e82011-07-06 11:27:02 +00002117class LDeleteProperty: public LTemplateInstruction<1, 3, 0> {
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00002118 public:
jkummerow@chromium.orgddda9e82011-07-06 11:27:02 +00002119 LDeleteProperty(LOperand* context, LOperand* obj, LOperand* key) {
2120 inputs_[0] = context;
2121 inputs_[1] = obj;
2122 inputs_[2] = key;
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00002123 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00002124
2125 DECLARE_CONCRETE_INSTRUCTION(DeleteProperty, "delete-property")
2126
jkummerow@chromium.orgddda9e82011-07-06 11:27:02 +00002127 LOperand* context() { return inputs_[0]; }
2128 LOperand* object() { return inputs_[1]; }
2129 LOperand* key() { return inputs_[2]; }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00002130};
2131
2132
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +00002133class LOsrEntry: public LTemplateInstruction<0, 0, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00002134 public:
2135 LOsrEntry();
2136
2137 DECLARE_CONCRETE_INSTRUCTION(OsrEntry, "osr-entry")
2138
2139 LOperand** SpilledRegisterArray() { return register_spills_; }
2140 LOperand** SpilledDoubleRegisterArray() { return double_register_spills_; }
2141
2142 void MarkSpilledRegister(int allocation_index, LOperand* spill_operand);
2143 void MarkSpilledDoubleRegister(int allocation_index,
2144 LOperand* spill_operand);
2145
2146 private:
2147 // Arrays of spill slot operands for registers with an assigned spill
2148 // slot, i.e., that must also be restored to the spill slot on OSR entry.
2149 // NULL if the register has no assigned spill slot. Indexed by allocation
2150 // index.
2151 LOperand* register_spills_[Register::kNumAllocatableRegisters];
2152 LOperand* double_register_spills_[DoubleRegister::kNumAllocatableRegisters];
2153};
2154
2155
jkummerow@chromium.orgddda9e82011-07-06 11:27:02 +00002156class LStackCheck: public LTemplateInstruction<0, 1, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00002157 public:
jkummerow@chromium.orgddda9e82011-07-06 11:27:02 +00002158 explicit LStackCheck(LOperand* context) {
2159 inputs_[0] = context;
2160 }
2161
2162 LOperand* context() { return inputs_[0]; }
2163
kasperl@chromium.orga5551262010-12-07 12:49:48 +00002164 DECLARE_CONCRETE_INSTRUCTION(StackCheck, "stack-check")
ager@chromium.org04921a82011-06-27 13:21:41 +00002165 DECLARE_HYDROGEN_ACCESSOR(StackCheck)
2166
2167 Label* done_label() { return &done_label_; }
2168
2169 private:
2170 Label done_label_;
kasperl@chromium.orga5551262010-12-07 12:49:48 +00002171};
2172
2173
jkummerow@chromium.orgddda9e82011-07-06 11:27:02 +00002174class LIn: public LTemplateInstruction<1, 3, 0> {
erik.corry@gmail.com3847bd52011-04-27 10:38:56 +00002175 public:
jkummerow@chromium.orgddda9e82011-07-06 11:27:02 +00002176 LIn(LOperand* context, LOperand* key, LOperand* object) {
2177 inputs_[0] = context;
2178 inputs_[1] = key;
2179 inputs_[2] = object;
erik.corry@gmail.com3847bd52011-04-27 10:38:56 +00002180 }
2181
jkummerow@chromium.orgddda9e82011-07-06 11:27:02 +00002182 LOperand* context() { return inputs_[0]; }
2183 LOperand* key() { return inputs_[1]; }
2184 LOperand* object() { return inputs_[2]; }
erik.corry@gmail.com3847bd52011-04-27 10:38:56 +00002185
2186 DECLARE_CONCRETE_INSTRUCTION(In, "in")
2187};
2188
2189
kmillikin@chromium.orgbe6bd102012-02-23 08:45:21 +00002190class LForInPrepareMap: public LTemplateInstruction<1, 2, 0> {
2191 public:
2192 LForInPrepareMap(LOperand* context, LOperand* object) {
2193 inputs_[0] = context;
2194 inputs_[1] = object;
2195 }
2196
2197 LOperand* context() { return inputs_[0]; }
2198 LOperand* object() { return inputs_[1]; }
2199
2200 DECLARE_CONCRETE_INSTRUCTION(ForInPrepareMap, "for-in-prepare-map")
2201};
2202
2203
2204class LForInCacheArray: public LTemplateInstruction<1, 1, 0> {
2205 public:
2206 explicit LForInCacheArray(LOperand* map) {
2207 inputs_[0] = map;
2208 }
2209
2210 LOperand* map() { return inputs_[0]; }
2211
2212 DECLARE_CONCRETE_INSTRUCTION(ForInCacheArray, "for-in-cache-array")
2213
2214 int idx() {
2215 return HForInCacheArray::cast(this->hydrogen_value())->idx();
2216 }
2217};
2218
2219
2220class LCheckMapValue: public LTemplateInstruction<0, 2, 0> {
2221 public:
2222 LCheckMapValue(LOperand* value, LOperand* map) {
2223 inputs_[0] = value;
2224 inputs_[1] = map;
2225 }
2226
2227 LOperand* value() { return inputs_[0]; }
2228 LOperand* map() { return inputs_[1]; }
2229
2230 DECLARE_CONCRETE_INSTRUCTION(CheckMapValue, "check-map-value")
2231};
2232
2233
2234class LLoadFieldByIndex: public LTemplateInstruction<1, 2, 0> {
2235 public:
2236 LLoadFieldByIndex(LOperand* object, LOperand* index) {
2237 inputs_[0] = object;
2238 inputs_[1] = index;
2239 }
2240
2241 LOperand* object() { return inputs_[0]; }
2242 LOperand* index() { return inputs_[1]; }
2243
2244 DECLARE_CONCRETE_INSTRUCTION(LoadFieldByIndex, "load-field-by-index")
2245};
2246
2247
kasperl@chromium.orga5551262010-12-07 12:49:48 +00002248class LChunkBuilder;
2249class LChunk: public ZoneObject {
2250 public:
jkummerow@chromium.orgddda9e82011-07-06 11:27:02 +00002251 LChunk(CompilationInfo* info, HGraph* graph)
kmillikin@chromium.orgd2c22f02011-01-10 08:15:37 +00002252 : spill_slot_count_(0),
karlklose@chromium.org8f806e82011-03-07 14:06:08 +00002253 info_(info),
kmillikin@chromium.orgd2c22f02011-01-10 08:15:37 +00002254 graph_(graph),
2255 instructions_(32),
2256 pointer_maps_(8),
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00002257 num_double_slots_(0),
kmillikin@chromium.orgd2c22f02011-01-10 08:15:37 +00002258 inlined_closures_(1) { }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00002259
ricow@chromium.org83aa5492011-02-07 12:42:56 +00002260 void AddInstruction(LInstruction* instruction, HBasicBlock* block);
kasperl@chromium.orga5551262010-12-07 12:49:48 +00002261 LConstantOperand* DefineConstantOperand(HConstant* constant);
2262 Handle<Object> LookupLiteral(LConstantOperand* operand) const;
2263 Representation LookupLiteralRepresentation(LConstantOperand* operand) const;
2264
2265 int GetNextSpillIndex(bool is_double);
2266 LOperand* GetNextSpillSlot(bool is_double);
2267
2268 int ParameterAt(int index);
2269 int GetParameterStackSlot(int index) const;
2270 int spill_slot_count() const { return spill_slot_count_; }
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00002271 int num_double_slots() const { return num_double_slots_; }
2272
karlklose@chromium.org8f806e82011-03-07 14:06:08 +00002273 CompilationInfo* info() const { return info_; }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00002274 HGraph* graph() const { return graph_; }
2275 const ZoneList<LInstruction*>* instructions() const { return &instructions_; }
2276 void AddGapMove(int index, LOperand* from, LOperand* to);
2277 LGap* GetGapAt(int index) const;
2278 bool IsGapAt(int index) const;
2279 int NearestGapPos(int index) const;
kasperl@chromium.orga5551262010-12-07 12:49:48 +00002280 void MarkEmptyBlocks();
2281 const ZoneList<LPointerMap*>* pointer_maps() const { return &pointer_maps_; }
2282 LLabel* GetLabel(int block_id) const {
2283 HBasicBlock* block = graph_->blocks()->at(block_id);
2284 int first_instruction = block->first_instruction_index();
2285 return LLabel::cast(instructions_[first_instruction]);
2286 }
2287 int LookupDestination(int block_id) const {
2288 LLabel* cur = GetLabel(block_id);
2289 while (cur->replacement() != NULL) {
2290 cur = cur->replacement();
2291 }
2292 return cur->block_id();
2293 }
2294 Label* GetAssemblyLabel(int block_id) const {
2295 LLabel* label = GetLabel(block_id);
2296 ASSERT(!label->HasReplacement());
2297 return label->label();
2298 }
2299
2300 const ZoneList<Handle<JSFunction> >* inlined_closures() const {
2301 return &inlined_closures_;
2302 }
2303
2304 void AddInlinedClosure(Handle<JSFunction> closure) {
2305 inlined_closures_.Add(closure);
2306 }
2307
kasperl@chromium.orga5551262010-12-07 12:49:48 +00002308 private:
2309 int spill_slot_count_;
karlklose@chromium.org8f806e82011-03-07 14:06:08 +00002310 CompilationInfo* info_;
kasperl@chromium.orga5551262010-12-07 12:49:48 +00002311 HGraph* const graph_;
2312 ZoneList<LInstruction*> instructions_;
2313 ZoneList<LPointerMap*> pointer_maps_;
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00002314 int num_double_slots_;
kasperl@chromium.orga5551262010-12-07 12:49:48 +00002315 ZoneList<Handle<JSFunction> > inlined_closures_;
2316};
2317
2318
2319class LChunkBuilder BASE_EMBEDDED {
2320 public:
karlklose@chromium.org8f806e82011-03-07 14:06:08 +00002321 LChunkBuilder(CompilationInfo* info, HGraph* graph, LAllocator* allocator)
kasperl@chromium.orga5551262010-12-07 12:49:48 +00002322 : chunk_(NULL),
karlklose@chromium.org8f806e82011-03-07 14:06:08 +00002323 info_(info),
kasperl@chromium.orga5551262010-12-07 12:49:48 +00002324 graph_(graph),
ulan@chromium.org812308e2012-02-29 15:58:45 +00002325 zone_(graph->isolate()->zone()),
kasperl@chromium.orga5551262010-12-07 12:49:48 +00002326 status_(UNUSED),
2327 current_instruction_(NULL),
2328 current_block_(NULL),
2329 next_block_(NULL),
2330 argument_count_(0),
2331 allocator_(allocator),
2332 position_(RelocInfo::kNoPosition),
kmillikin@chromium.org31b12772011-02-02 16:08:26 +00002333 instruction_pending_deoptimization_environment_(NULL),
kasperl@chromium.orga5551262010-12-07 12:49:48 +00002334 pending_deoptimization_ast_id_(AstNode::kNoNumber) { }
2335
2336 // Build the sequence for the graph.
2337 LChunk* Build();
2338
2339 // Declare methods that deal with the individual node types.
2340#define DECLARE_DO(type) LInstruction* Do##type(H##type* node);
2341 HYDROGEN_CONCRETE_INSTRUCTION_LIST(DECLARE_DO)
2342#undef DECLARE_DO
2343
2344 private:
2345 enum Status {
2346 UNUSED,
2347 BUILDING,
2348 DONE,
2349 ABORTED
2350 };
2351
2352 LChunk* chunk() const { return chunk_; }
karlklose@chromium.org8f806e82011-03-07 14:06:08 +00002353 CompilationInfo* info() const { return info_; }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00002354 HGraph* graph() const { return graph_; }
ulan@chromium.org812308e2012-02-29 15:58:45 +00002355 Zone* zone() { return zone_; }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00002356
2357 bool is_unused() const { return status_ == UNUSED; }
2358 bool is_building() const { return status_ == BUILDING; }
2359 bool is_done() const { return status_ == DONE; }
2360 bool is_aborted() const { return status_ == ABORTED; }
2361
2362 void Abort(const char* format, ...);
2363
2364 // Methods for getting operands for Use / Define / Temp.
kasperl@chromium.orga5551262010-12-07 12:49:48 +00002365 LUnallocated* ToUnallocated(Register reg);
2366 LUnallocated* ToUnallocated(XMMRegister reg);
2367
2368 // Methods for setting up define-use relationships.
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00002369 MUST_USE_RESULT LOperand* Use(HValue* value, LUnallocated* operand);
2370 MUST_USE_RESULT LOperand* UseFixed(HValue* value, Register fixed_register);
2371 MUST_USE_RESULT LOperand* UseFixedDouble(HValue* value,
2372 XMMRegister fixed_register);
kasperl@chromium.orga5551262010-12-07 12:49:48 +00002373
2374 // A value that is guaranteed to be allocated to a register.
2375 // Operand created by UseRegister is guaranteed to be live until the end of
2376 // instruction. This means that register allocator will not reuse it's
2377 // register for any other operand inside instruction.
2378 // Operand created by UseRegisterAtStart is guaranteed to be live only at
2379 // instruction start. Register allocator is free to assign the same register
2380 // to some other operand used inside instruction (i.e. temporary or
2381 // output).
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00002382 MUST_USE_RESULT LOperand* UseRegister(HValue* value);
2383 MUST_USE_RESULT LOperand* UseRegisterAtStart(HValue* value);
kasperl@chromium.orga5551262010-12-07 12:49:48 +00002384
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00002385 // An input operand in a register that may be trashed.
2386 MUST_USE_RESULT LOperand* UseTempRegister(HValue* value);
2387
2388 // An input operand in a register or stack slot.
2389 MUST_USE_RESULT LOperand* Use(HValue* value);
2390 MUST_USE_RESULT LOperand* UseAtStart(HValue* value);
2391
2392 // An input operand in a register, stack slot or a constant operand.
2393 MUST_USE_RESULT LOperand* UseOrConstant(HValue* value);
2394 MUST_USE_RESULT LOperand* UseOrConstantAtStart(HValue* value);
2395
2396 // An input operand in a register or a constant operand.
2397 MUST_USE_RESULT LOperand* UseRegisterOrConstant(HValue* value);
2398 MUST_USE_RESULT LOperand* UseRegisterOrConstantAtStart(HValue* value);
2399
2400 // An input operand in register, stack slot or a constant operand.
2401 // Will not be moved to a register even if one is freely available.
2402 MUST_USE_RESULT LOperand* UseAny(HValue* value);
2403
2404 // Temporary operand that must be in a register.
2405 MUST_USE_RESULT LUnallocated* TempRegister();
2406 MUST_USE_RESULT LOperand* FixedTemp(Register reg);
2407 MUST_USE_RESULT LOperand* FixedTemp(XMMRegister reg);
kasperl@chromium.orga5551262010-12-07 12:49:48 +00002408
2409 // Methods for setting up define-use relationships.
2410 // Return the same instruction that they are passed.
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +00002411 template<int I, int T>
2412 LInstruction* Define(LTemplateInstruction<1, I, T>* instr,
2413 LUnallocated* result);
2414 template<int I, int T>
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +00002415 LInstruction* DefineAsRegister(LTemplateInstruction<1, I, T>* instr);
2416 template<int I, int T>
2417 LInstruction* DefineAsSpilled(LTemplateInstruction<1, I, T>* instr,
2418 int index);
2419 template<int I, int T>
2420 LInstruction* DefineSameAsFirst(LTemplateInstruction<1, I, T>* instr);
2421 template<int I, int T>
2422 LInstruction* DefineFixed(LTemplateInstruction<1, I, T>* instr,
2423 Register reg);
2424 template<int I, int T>
2425 LInstruction* DefineFixedDouble(LTemplateInstruction<1, I, T>* instr,
2426 XMMRegister reg);
danno@chromium.orgb6451162011-08-17 14:33:23 +00002427 // Assigns an environment to an instruction. An instruction which can
2428 // deoptimize must have an environment.
kasperl@chromium.orga5551262010-12-07 12:49:48 +00002429 LInstruction* AssignEnvironment(LInstruction* instr);
danno@chromium.orgb6451162011-08-17 14:33:23 +00002430 // Assigns a pointer map to an instruction. An instruction which can
2431 // trigger a GC or a lazy deoptimization must have a pointer map.
kasperl@chromium.orga5551262010-12-07 12:49:48 +00002432 LInstruction* AssignPointerMap(LInstruction* instr);
2433
2434 enum CanDeoptimize { CAN_DEOPTIMIZE_EAGERLY, CANNOT_DEOPTIMIZE_EAGERLY };
2435
danno@chromium.orgb6451162011-08-17 14:33:23 +00002436 // Marks a call for the register allocator. Assigns a pointer map to
2437 // support GC and lazy deoptimization. Assigns an environment to support
2438 // eager deoptimization if CAN_DEOPTIMIZE_EAGERLY.
kasperl@chromium.orga5551262010-12-07 12:49:48 +00002439 LInstruction* MarkAsCall(
2440 LInstruction* instr,
2441 HInstruction* hinstr,
2442 CanDeoptimize can_deoptimize = CANNOT_DEOPTIMIZE_EAGERLY);
kmillikin@chromium.orgd2c22f02011-01-10 08:15:37 +00002443 LInstruction* MarkAsSaveDoubles(LInstruction* instr);
kasperl@chromium.orga5551262010-12-07 12:49:48 +00002444
fschneider@chromium.org1df6b472011-01-26 08:23:03 +00002445 LInstruction* SetInstructionPendingDeoptimizationEnvironment(
2446 LInstruction* instr, int ast_id);
2447 void ClearInstructionPendingDeoptimizationEnvironment();
2448
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00002449 LEnvironment* CreateEnvironment(HEnvironment* hydrogen_env,
2450 int* argument_index_accumulator);
kasperl@chromium.orga5551262010-12-07 12:49:48 +00002451
kasperl@chromium.orga5551262010-12-07 12:49:48 +00002452 void VisitInstruction(HInstruction* current);
2453
2454 void DoBasicBlock(HBasicBlock* block, HBasicBlock* next_block);
kasperl@chromium.orga5551262010-12-07 12:49:48 +00002455 LInstruction* DoShift(Token::Value op, HBitwiseBinaryOperation* instr);
2456 LInstruction* DoArithmeticD(Token::Value op,
2457 HArithmeticBinaryOperation* instr);
2458 LInstruction* DoArithmeticT(Token::Value op,
2459 HArithmeticBinaryOperation* instr);
2460
2461 LChunk* chunk_;
karlklose@chromium.org8f806e82011-03-07 14:06:08 +00002462 CompilationInfo* info_;
kasperl@chromium.orga5551262010-12-07 12:49:48 +00002463 HGraph* const graph_;
ulan@chromium.org812308e2012-02-29 15:58:45 +00002464 Zone* zone_;
kasperl@chromium.orga5551262010-12-07 12:49:48 +00002465 Status status_;
2466 HInstruction* current_instruction_;
2467 HBasicBlock* current_block_;
2468 HBasicBlock* next_block_;
2469 int argument_count_;
2470 LAllocator* allocator_;
2471 int position_;
kmillikin@chromium.org31b12772011-02-02 16:08:26 +00002472 LInstruction* instruction_pending_deoptimization_environment_;
kasperl@chromium.orga5551262010-12-07 12:49:48 +00002473 int pending_deoptimization_ast_id_;
2474
2475 DISALLOW_COPY_AND_ASSIGN(LChunkBuilder);
2476};
2477
2478#undef DECLARE_HYDROGEN_ACCESSOR
kasperl@chromium.orga5551262010-12-07 12:49:48 +00002479#undef DECLARE_CONCRETE_INSTRUCTION
2480
2481} } // namespace v8::internal
2482
2483#endif // V8_IA32_LITHIUM_IA32_H_