blob: ccaad713605d19df8c6cef7d98df3c673e2d3690 [file] [log] [blame]
erik.corry@gmail.comf2038fb2012-01-16 11:42:08 +00001// Copyright 2012 the V8 project authors. All rights reserved.
lrn@chromium.org7516f052011-03-30 08:52:27 +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_MIPS_LITHIUM_MIPS_H_
29#define V8_MIPS_LITHIUM_MIPS_H_
30
31#include "hydrogen.h"
32#include "lithium-allocator.h"
33#include "lithium.h"
34#include "safepoint-table.h"
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +000035#include "utils.h"
lrn@chromium.org7516f052011-03-30 08:52:27 +000036
37namespace v8 {
38namespace internal {
39
40// Forward declarations.
41class LCodeGen;
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +000042
43#define LITHIUM_ALL_INSTRUCTION_LIST(V) \
44 V(ControlInstruction) \
45 V(Call) \
46 LITHIUM_CONCRETE_INSTRUCTION_LIST(V)
47
48
49#define LITHIUM_CONCRETE_INSTRUCTION_LIST(V) \
50 V(AccessArgumentsAt) \
51 V(AddI) \
ulan@chromium.org967e2702012-02-28 09:49:15 +000052 V(AllocateObject) \
hpayer@chromium.org7c3372b2013-02-13 17:26:04 +000053 V(Allocate) \
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +000054 V(ApplyArguments) \
55 V(ArgumentsElements) \
56 V(ArgumentsLength) \
57 V(ArithmeticD) \
58 V(ArithmeticT) \
59 V(ArrayLiteral) \
60 V(BitI) \
61 V(BitNotI) \
62 V(BoundsCheck) \
63 V(Branch) \
64 V(CallConstantFunction) \
65 V(CallFunction) \
66 V(CallGlobal) \
67 V(CallKeyed) \
68 V(CallKnownGlobal) \
69 V(CallNamed) \
70 V(CallNew) \
ulan@chromium.org750145a2013-03-07 15:14:13 +000071 V(CallNewArray) \
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +000072 V(CallRuntime) \
73 V(CallStub) \
74 V(CheckFunction) \
75 V(CheckInstanceType) \
jkummerow@chromium.org1456e702012-03-30 08:38:13 +000076 V(CheckMaps) \
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +000077 V(CheckNonSmi) \
78 V(CheckPrototypeMaps) \
79 V(CheckSmi) \
80 V(ClampDToUint8) \
81 V(ClampIToUint8) \
82 V(ClampTToUint8) \
83 V(ClassOfTestAndBranch) \
84 V(CmpConstantEqAndBranch) \
85 V(CmpIDAndBranch) \
86 V(CmpObjectEqAndBranch) \
87 V(CmpMapAndBranch) \
88 V(CmpT) \
89 V(ConstantD) \
90 V(ConstantI) \
91 V(ConstantT) \
92 V(Context) \
jkummerow@chromium.orgf7a58842012-02-21 10:08:21 +000093 V(DeclareGlobals) \
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +000094 V(DeleteProperty) \
95 V(Deoptimize) \
96 V(DivI) \
97 V(DoubleToI) \
yangguo@chromium.org46a2a512013-01-18 16:29:40 +000098 V(DummyUse) \
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +000099 V(ElementsKind) \
jkummerow@chromium.orgf7a58842012-02-21 10:08:21 +0000100 V(FastLiteral) \
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000101 V(FixedArrayBaseLength) \
102 V(FunctionLiteral) \
103 V(GetCachedArrayIndex) \
104 V(GlobalObject) \
105 V(GlobalReceiver) \
106 V(Goto) \
107 V(HasCachedArrayIndexAndBranch) \
108 V(HasInstanceTypeAndBranch) \
109 V(In) \
110 V(InstanceOf) \
111 V(InstanceOfKnownGlobal) \
yangguo@chromium.org4a9f6552013-03-04 14:46:33 +0000112 V(InstanceSize) \
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000113 V(InstructionGap) \
114 V(Integer32ToDouble) \
jkummerow@chromium.org78502a92012-09-06 13:50:42 +0000115 V(Uint32ToDouble) \
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000116 V(InvokeFunction) \
117 V(IsConstructCallAndBranch) \
118 V(IsNilAndBranch) \
119 V(IsObjectAndBranch) \
mstarzinger@chromium.orgf8c6bd52011-11-23 12:13:52 +0000120 V(IsStringAndBranch) \
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000121 V(IsSmiAndBranch) \
122 V(IsUndetectableAndBranch) \
123 V(JSArrayLength) \
124 V(Label) \
125 V(LazyBailout) \
126 V(LoadContextSlot) \
127 V(LoadElements) \
128 V(LoadExternalArrayPointer) \
129 V(LoadFunctionPrototype) \
130 V(LoadGlobalCell) \
131 V(LoadGlobalGeneric) \
mvstanton@chromium.orge4ac3ef2012-11-12 14:53:34 +0000132 V(LoadKeyed) \
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000133 V(LoadKeyedGeneric) \
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000134 V(LoadNamedField) \
135 V(LoadNamedFieldPolymorphic) \
136 V(LoadNamedGeneric) \
jkummerow@chromium.org78502a92012-09-06 13:50:42 +0000137 V(MapEnumLength) \
svenpanne@chromium.org83130cf2012-11-30 10:13:25 +0000138 V(MathExp) \
mstarzinger@chromium.org471f2f12012-08-10 14:46:33 +0000139 V(MathMinMax) \
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000140 V(ModI) \
141 V(MulI) \
jkummerow@chromium.org59297c72013-01-09 16:32:23 +0000142 V(MultiplyAddD) \
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000143 V(NumberTagD) \
144 V(NumberTagI) \
jkummerow@chromium.org78502a92012-09-06 13:50:42 +0000145 V(NumberTagU) \
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000146 V(NumberUntagD) \
jkummerow@chromium.orgf7a58842012-02-21 10:08:21 +0000147 V(ObjectLiteral) \
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000148 V(OsrEntry) \
149 V(OuterContext) \
150 V(Parameter) \
151 V(Power) \
152 V(PushArgument) \
erik.corry@gmail.comf2038fb2012-01-16 11:42:08 +0000153 V(Random) \
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000154 V(RegExpLiteral) \
155 V(Return) \
yangguo@chromium.orga6bbcc82012-12-21 12:35:02 +0000156 V(SeqStringSetChar) \
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000157 V(ShiftI) \
158 V(SmiTag) \
159 V(SmiUntag) \
160 V(StackCheck) \
161 V(StoreContextSlot) \
162 V(StoreGlobalCell) \
163 V(StoreGlobalGeneric) \
mvstanton@chromium.orge4ac3ef2012-11-12 14:53:34 +0000164 V(StoreKeyed) \
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000165 V(StoreKeyedGeneric) \
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000166 V(StoreNamedField) \
167 V(StoreNamedGeneric) \
168 V(StringAdd) \
169 V(StringCharCodeAt) \
170 V(StringCharFromCode) \
mstarzinger@chromium.org471f2f12012-08-10 14:46:33 +0000171 V(StringCompareAndBranch) \
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000172 V(StringLength) \
173 V(SubI) \
174 V(TaggedToI) \
175 V(ThisFunction) \
176 V(Throw) \
177 V(ToFastProperties) \
178 V(TransitionElementsKind) \
hpayer@chromium.org7c3372b2013-02-13 17:26:04 +0000179 V(TrapAllocationMemento) \
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000180 V(Typeof) \
181 V(TypeofIsAndBranch) \
182 V(UnaryMathOperation) \
183 V(UnknownOSRValue) \
ulan@chromium.org812308e2012-02-29 15:58:45 +0000184 V(ValueOf) \
185 V(ForInPrepareMap) \
186 V(ForInCacheArray) \
187 V(CheckMapValue) \
yangguo@chromium.org154ff992012-03-13 08:09:54 +0000188 V(LoadFieldByIndex) \
rossberg@chromium.org2c067b12012-03-19 11:01:52 +0000189 V(DateField) \
jkummerow@chromium.org28faa982012-04-13 09:58:30 +0000190 V(WrapReceiver) \
191 V(Drop)
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000192
193#define DECLARE_CONCRETE_INSTRUCTION(type, mnemonic) \
194 virtual Opcode opcode() const { return LInstruction::k##type; } \
195 virtual void CompileToNative(LCodeGen* generator); \
196 virtual const char* Mnemonic() const { return mnemonic; } \
197 static L##type* cast(LInstruction* instr) { \
198 ASSERT(instr->Is##type()); \
199 return reinterpret_cast<L##type*>(instr); \
200 }
201
202
203#define DECLARE_HYDROGEN_ACCESSOR(type) \
204 H##type* hydrogen() const { \
205 return H##type::cast(hydrogen_value()); \
206 }
207
lrn@chromium.org7516f052011-03-30 08:52:27 +0000208
209class LInstruction: public ZoneObject {
210 public:
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000211 LInstruction()
212 : environment_(NULL),
213 hydrogen_value_(NULL),
danno@chromium.org1044a4d2012-04-30 12:34:39 +0000214 is_call_(false) { }
lrn@chromium.org7516f052011-03-30 08:52:27 +0000215 virtual ~LInstruction() { }
216
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000217 virtual void CompileToNative(LCodeGen* generator) = 0;
218 virtual const char* Mnemonic() const = 0;
219 virtual void PrintTo(StringStream* stream);
mstarzinger@chromium.org88d326b2012-04-23 12:57:22 +0000220 virtual void PrintDataTo(StringStream* stream);
221 virtual void PrintOutputOperandTo(StringStream* stream);
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000222
223 enum Opcode {
224 // Declare a unique enum value for each instruction.
225#define DECLARE_OPCODE(type) k##type,
226 LITHIUM_CONCRETE_INSTRUCTION_LIST(DECLARE_OPCODE)
227 kNumberOfInstructions
228#undef DECLARE_OPCODE
229 };
230
231 virtual Opcode opcode() const = 0;
232
233 // Declare non-virtual type testers for all leaf IR classes.
234#define DECLARE_PREDICATE(type) \
235 bool Is##type() const { return opcode() == k##type; }
236 LITHIUM_CONCRETE_INSTRUCTION_LIST(DECLARE_PREDICATE)
237#undef DECLARE_PREDICATE
238
239 // Declare virtual predicates for instructions that don't have
240 // an opcode.
241 virtual bool IsGap() const { return false; }
242
243 virtual bool IsControl() const { return false; }
244
245 void set_environment(LEnvironment* env) { environment_ = env; }
246 LEnvironment* environment() const { return environment_; }
247 bool HasEnvironment() const { return environment_ != NULL; }
248
249 void set_pointer_map(LPointerMap* p) { pointer_map_.set(p); }
250 LPointerMap* pointer_map() const { return pointer_map_.get(); }
251 bool HasPointerMap() const { return pointer_map_.is_set(); }
252
253 void set_hydrogen_value(HValue* value) { hydrogen_value_ = value; }
254 HValue* hydrogen_value() const { return hydrogen_value_; }
255
danno@chromium.org1044a4d2012-04-30 12:34:39 +0000256 virtual void SetDeferredLazyDeoptimizationEnvironment(LEnvironment* env) { }
lrn@chromium.org7516f052011-03-30 08:52:27 +0000257
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000258 void MarkAsCall() { is_call_ = true; }
lrn@chromium.org7516f052011-03-30 08:52:27 +0000259
260 // Interface to the register allocator and iterators.
jkummerow@chromium.org59297c72013-01-09 16:32:23 +0000261 bool ClobbersTemps() const { return is_call_; }
262 bool ClobbersRegisters() const { return is_call_; }
263 bool ClobbersDoubleRegisters() const { return is_call_; }
264
265 // Interface to the register allocator and iterators.
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000266 bool IsMarkedAsCall() const { return is_call_; }
lrn@chromium.org7516f052011-03-30 08:52:27 +0000267
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000268 virtual bool HasResult() const = 0;
269 virtual LOperand* result() = 0;
lrn@chromium.org7516f052011-03-30 08:52:27 +0000270
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000271 LOperand* FirstInput() { return InputAt(0); }
272 LOperand* Output() { return HasResult() ? result() : NULL; }
lrn@chromium.org7516f052011-03-30 08:52:27 +0000273
274#ifdef DEBUG
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000275 void VerifyCall();
lrn@chromium.org7516f052011-03-30 08:52:27 +0000276#endif
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000277
278 private:
yangguo@chromium.org46839fb2012-08-28 09:06:19 +0000279 // Iterator interface.
280 friend class InputIterator;
281 virtual int InputCount() = 0;
282 virtual LOperand* InputAt(int i) = 0;
283
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +0000284 friend class TempIterator;
285 virtual int TempCount() = 0;
286 virtual LOperand* TempAt(int i) = 0;
287
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000288 LEnvironment* environment_;
289 SetOncePointer<LPointerMap> pointer_map_;
290 HValue* hydrogen_value_;
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000291 bool is_call_;
292 bool is_save_doubles_;
lrn@chromium.org7516f052011-03-30 08:52:27 +0000293};
294
295
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000296// R = number of result operands (0 or 1).
297// I = number of input operands.
298// T = number of temporary operands.
299template<int R, int I, int T>
300class LTemplateInstruction: public LInstruction {
lrn@chromium.org7516f052011-03-30 08:52:27 +0000301 public:
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000302 // Allow 0 or 1 output operands.
303 STATIC_ASSERT(R == 0 || R == 1);
304 virtual bool HasResult() const { return R != 0; }
305 void set_result(LOperand* operand) { results_[0] = operand; }
306 LOperand* result() { return results_[0]; }
lrn@chromium.org7516f052011-03-30 08:52:27 +0000307
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000308 protected:
309 EmbeddedContainer<LOperand*, R> results_;
310 EmbeddedContainer<LOperand*, I> inputs_;
311 EmbeddedContainer<LOperand*, T> temps_;
yangguo@chromium.org46839fb2012-08-28 09:06:19 +0000312
313 private:
314 virtual int InputCount() { return I; }
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +0000315 virtual LOperand* InputAt(int i) { return inputs_[i]; }
316
317 virtual int TempCount() { return T; }
318 virtual LOperand* TempAt(int i) { return temps_[i]; }
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000319};
320
321
322class LGap: public LTemplateInstruction<0, 0, 0> {
323 public:
324 explicit LGap(HBasicBlock* block)
325 : block_(block) {
326 parallel_moves_[BEFORE] = NULL;
327 parallel_moves_[START] = NULL;
328 parallel_moves_[END] = NULL;
329 parallel_moves_[AFTER] = NULL;
lrn@chromium.org7516f052011-03-30 08:52:27 +0000330 }
331
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000332 // Can't use the DECLARE-macro here because of sub-classes.
333 virtual bool IsGap() const { return true; }
334 virtual void PrintDataTo(StringStream* stream);
335 static LGap* cast(LInstruction* instr) {
336 ASSERT(instr->IsGap());
337 return reinterpret_cast<LGap*>(instr);
338 }
339
340 bool IsRedundant() const;
341
342 HBasicBlock* block() const { return block_; }
343
lrn@chromium.org7516f052011-03-30 08:52:27 +0000344 enum InnerPosition {
345 BEFORE,
346 START,
347 END,
348 AFTER,
349 FIRST_INNER_POSITION = BEFORE,
350 LAST_INNER_POSITION = AFTER
351 };
352
mmassi@chromium.org7028c052012-06-13 11:51:58 +0000353 LParallelMove* GetOrCreateParallelMove(InnerPosition pos, Zone* zone) {
354 if (parallel_moves_[pos] == NULL) {
355 parallel_moves_[pos] = new(zone) LParallelMove(zone);
356 }
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000357 return parallel_moves_[pos];
lrn@chromium.org7516f052011-03-30 08:52:27 +0000358 }
359
360 LParallelMove* GetParallelMove(InnerPosition pos) {
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000361 return parallel_moves_[pos];
lrn@chromium.org7516f052011-03-30 08:52:27 +0000362 }
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000363
364 private:
365 LParallelMove* parallel_moves_[LAST_INNER_POSITION + 1];
366 HBasicBlock* block_;
367};
368
369
370class LInstructionGap: public LGap {
371 public:
372 explicit LInstructionGap(HBasicBlock* block) : LGap(block) { }
373
374 DECLARE_CONCRETE_INSTRUCTION(InstructionGap, "gap")
375};
376
377
378class LGoto: public LTemplateInstruction<0, 0, 0> {
379 public:
380 explicit LGoto(int block_id) : block_id_(block_id) { }
381
382 DECLARE_CONCRETE_INSTRUCTION(Goto, "goto")
383 virtual void PrintDataTo(StringStream* stream);
384 virtual bool IsControl() const { return true; }
385
386 int block_id() const { return block_id_; }
387
388 private:
389 int block_id_;
390};
391
392
393class LLazyBailout: public LTemplateInstruction<0, 0, 0> {
394 public:
395 LLazyBailout() : gap_instructions_size_(0) { }
396
397 DECLARE_CONCRETE_INSTRUCTION(LazyBailout, "lazy-bailout")
398
399 void set_gap_instructions_size(int gap_instructions_size) {
400 gap_instructions_size_ = gap_instructions_size;
401 }
402 int gap_instructions_size() { return gap_instructions_size_; }
403
404 private:
405 int gap_instructions_size_;
406};
407
408
yangguo@chromium.org46a2a512013-01-18 16:29:40 +0000409class LDummyUse: public LTemplateInstruction<1, 1, 0> {
410 public:
411 explicit LDummyUse(LOperand* value) {
412 inputs_[0] = value;
413 }
414 DECLARE_CONCRETE_INSTRUCTION(DummyUse, "dummy-use")
415};
416
417
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000418class LDeoptimize: public LTemplateInstruction<0, 0, 0> {
419 public:
420 DECLARE_CONCRETE_INSTRUCTION(Deoptimize, "deoptimize")
lrn@chromium.org7516f052011-03-30 08:52:27 +0000421};
422
423
424class LLabel: public LGap {
425 public:
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000426 explicit LLabel(HBasicBlock* block)
427 : LGap(block), replacement_(NULL) { }
428
429 DECLARE_CONCRETE_INSTRUCTION(Label, "label")
430
431 virtual void PrintDataTo(StringStream* stream);
432
433 int block_id() const { return block()->block_id(); }
434 bool is_loop_header() const { return block()->IsLoopHeader(); }
435 Label* label() { return &label_; }
436 LLabel* replacement() const { return replacement_; }
437 void set_replacement(LLabel* label) { replacement_ = label; }
438 bool HasReplacement() const { return replacement_ != NULL; }
439
440 private:
441 Label label_;
442 LLabel* replacement_;
lrn@chromium.org7516f052011-03-30 08:52:27 +0000443};
444
445
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000446class LParameter: public LTemplateInstruction<1, 0, 0> {
lrn@chromium.org7516f052011-03-30 08:52:27 +0000447 public:
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000448 DECLARE_CONCRETE_INSTRUCTION(Parameter, "parameter")
449};
lrn@chromium.org7516f052011-03-30 08:52:27 +0000450
lrn@chromium.org7516f052011-03-30 08:52:27 +0000451
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000452class LCallStub: public LTemplateInstruction<1, 0, 0> {
453 public:
454 DECLARE_CONCRETE_INSTRUCTION(CallStub, "call-stub")
455 DECLARE_HYDROGEN_ACCESSOR(CallStub)
456
457 TranscendentalCache::Type transcendental_type() {
458 return hydrogen()->transcendental_type();
lrn@chromium.org7516f052011-03-30 08:52:27 +0000459 }
460};
461
462
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000463class LUnknownOSRValue: public LTemplateInstruction<1, 0, 0> {
464 public:
465 DECLARE_CONCRETE_INSTRUCTION(UnknownOSRValue, "unknown-osr-value")
466};
467
468
469template<int I, int T>
470class LControlInstruction: public LTemplateInstruction<0, I, T> {
471 public:
472 virtual bool IsControl() const { return true; }
473
474 int SuccessorCount() { return hydrogen()->SuccessorCount(); }
475 HBasicBlock* SuccessorAt(int i) { return hydrogen()->SuccessorAt(i); }
476 int true_block_id() { return hydrogen()->SuccessorAt(0)->block_id(); }
477 int false_block_id() { return hydrogen()->SuccessorAt(1)->block_id(); }
478
479 private:
480 HControlInstruction* hydrogen() {
481 return HControlInstruction::cast(this->hydrogen_value());
482 }
483};
484
485
rossberg@chromium.org2c067b12012-03-19 11:01:52 +0000486class LWrapReceiver: public LTemplateInstruction<1, 2, 0> {
487 public:
488 LWrapReceiver(LOperand* receiver, LOperand* function) {
489 inputs_[0] = receiver;
490 inputs_[1] = function;
491 }
492
493 DECLARE_CONCRETE_INSTRUCTION(WrapReceiver, "wrap-receiver")
494
495 LOperand* receiver() { return inputs_[0]; }
496 LOperand* function() { return inputs_[1]; }
497};
498
499
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000500class LApplyArguments: public LTemplateInstruction<1, 4, 0> {
501 public:
502 LApplyArguments(LOperand* function,
503 LOperand* receiver,
504 LOperand* length,
505 LOperand* elements) {
506 inputs_[0] = function;
507 inputs_[1] = receiver;
508 inputs_[2] = length;
509 inputs_[3] = elements;
510 }
511
512 DECLARE_CONCRETE_INSTRUCTION(ApplyArguments, "apply-arguments")
513
514 LOperand* function() { return inputs_[0]; }
515 LOperand* receiver() { return inputs_[1]; }
516 LOperand* length() { return inputs_[2]; }
517 LOperand* elements() { return inputs_[3]; }
518};
519
520
521class LAccessArgumentsAt: public LTemplateInstruction<1, 3, 0> {
522 public:
523 LAccessArgumentsAt(LOperand* arguments, LOperand* length, LOperand* index) {
524 inputs_[0] = arguments;
525 inputs_[1] = length;
526 inputs_[2] = index;
527 }
528
529 DECLARE_CONCRETE_INSTRUCTION(AccessArgumentsAt, "access-arguments-at")
530
531 LOperand* arguments() { return inputs_[0]; }
532 LOperand* length() { return inputs_[1]; }
533 LOperand* index() { return inputs_[2]; }
534
535 virtual void PrintDataTo(StringStream* stream);
536};
537
538
539class LArgumentsLength: public LTemplateInstruction<1, 1, 0> {
540 public:
541 explicit LArgumentsLength(LOperand* elements) {
542 inputs_[0] = elements;
543 }
544
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +0000545 LOperand* elements() { return inputs_[0]; }
546
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000547 DECLARE_CONCRETE_INSTRUCTION(ArgumentsLength, "arguments-length")
548};
549
550
551class LArgumentsElements: public LTemplateInstruction<1, 0, 0> {
552 public:
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000553 DECLARE_CONCRETE_INSTRUCTION(ArgumentsElements, "arguments-elements")
jkummerow@chromium.org28faa982012-04-13 09:58:30 +0000554 DECLARE_HYDROGEN_ACCESSOR(ArgumentsElements)
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000555};
556
557
558class LModI: public LTemplateInstruction<1, 2, 3> {
559 public:
560 // Used when the right hand is a constant power of 2.
561 LModI(LOperand* left,
562 LOperand* right) {
563 inputs_[0] = left;
564 inputs_[1] = right;
565 temps_[0] = NULL;
566 temps_[1] = NULL;
567 temps_[2] = NULL;
568 }
569
570 // Used for the standard case.
571 LModI(LOperand* left,
572 LOperand* right,
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +0000573 LOperand* temp,
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000574 LOperand* temp2,
575 LOperand* temp3) {
576 inputs_[0] = left;
577 inputs_[1] = right;
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +0000578 temps_[0] = temp;
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000579 temps_[1] = temp2;
580 temps_[2] = temp3;
581 }
582
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +0000583 LOperand* left() { return inputs_[0]; }
584 LOperand* right() { return inputs_[1]; }
585 LOperand* temp() { return temps_[0]; }
586 LOperand* temp2() { return temps_[1]; }
587 LOperand* temp3() { return temps_[2]; }
588
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000589 DECLARE_CONCRETE_INSTRUCTION(ModI, "mod-i")
590 DECLARE_HYDROGEN_ACCESSOR(Mod)
591};
592
593
594class LDivI: public LTemplateInstruction<1, 2, 0> {
595 public:
596 LDivI(LOperand* left, LOperand* right) {
597 inputs_[0] = left;
598 inputs_[1] = right;
599 }
600
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +0000601 LOperand* left() { return inputs_[0]; }
602 LOperand* right() { return inputs_[1]; }
603
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000604 DECLARE_CONCRETE_INSTRUCTION(DivI, "div-i")
605 DECLARE_HYDROGEN_ACCESSOR(Div)
606};
607
608
609class LMulI: public LTemplateInstruction<1, 2, 1> {
610 public:
611 LMulI(LOperand* left, LOperand* right, LOperand* temp) {
612 inputs_[0] = left;
613 inputs_[1] = right;
614 temps_[0] = temp;
615 }
616
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +0000617 LOperand* left() { return inputs_[0]; }
618 LOperand* right() { return inputs_[1]; }
619 LOperand* temp() { return temps_[0]; }
620
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000621 DECLARE_CONCRETE_INSTRUCTION(MulI, "mul-i")
622 DECLARE_HYDROGEN_ACCESSOR(Mul)
623};
624
625
jkummerow@chromium.org59297c72013-01-09 16:32:23 +0000626// Instruction for computing multiplier * multiplicand + addend.
627class LMultiplyAddD: public LTemplateInstruction<1, 3, 0> {
628 public:
629 LMultiplyAddD(LOperand* addend, LOperand* multiplier,
630 LOperand* multiplicand) {
631 inputs_[0] = addend;
632 inputs_[1] = multiplier;
633 inputs_[2] = multiplicand;
634 }
635
636 LOperand* addend() { return inputs_[0]; }
637 LOperand* multiplier() { return inputs_[1]; }
638 LOperand* multiplicand() { return inputs_[2]; }
639
640 DECLARE_CONCRETE_INSTRUCTION(MultiplyAddD, "multiply-add-d")
641};
642
643
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000644class LCmpIDAndBranch: public LControlInstruction<2, 0> {
645 public:
646 LCmpIDAndBranch(LOperand* left, LOperand* right) {
647 inputs_[0] = left;
648 inputs_[1] = right;
649 }
650
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +0000651 LOperand* left() { return inputs_[0]; }
652 LOperand* right() { return inputs_[1]; }
653
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000654 DECLARE_CONCRETE_INSTRUCTION(CmpIDAndBranch, "cmp-id-and-branch")
655 DECLARE_HYDROGEN_ACCESSOR(CompareIDAndBranch)
656
657 Token::Value op() const { return hydrogen()->token(); }
658 bool is_double() const {
ulan@chromium.org8e8d8822012-11-23 14:36:46 +0000659 return hydrogen()->representation().IsDouble();
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000660 }
661
662 virtual void PrintDataTo(StringStream* stream);
663};
664
665
666class LUnaryMathOperation: public LTemplateInstruction<1, 1, 1> {
667 public:
668 LUnaryMathOperation(LOperand* value, LOperand* temp) {
669 inputs_[0] = value;
670 temps_[0] = temp;
671 }
672
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +0000673 LOperand* value() { return inputs_[0]; }
674 LOperand* temp() { return temps_[0]; }
675
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000676 DECLARE_CONCRETE_INSTRUCTION(UnaryMathOperation, "unary-math-operation")
677 DECLARE_HYDROGEN_ACCESSOR(UnaryMathOperation)
678
679 virtual void PrintDataTo(StringStream* stream);
680 BuiltinFunctionId op() const { return hydrogen()->op(); }
681};
682
683
svenpanne@chromium.org83130cf2012-11-30 10:13:25 +0000684class LMathExp: public LTemplateInstruction<1, 1, 3> {
685 public:
686 LMathExp(LOperand* value,
687 LOperand* double_temp,
688 LOperand* temp1,
689 LOperand* temp2) {
690 inputs_[0] = value;
691 temps_[0] = temp1;
692 temps_[1] = temp2;
693 temps_[2] = double_temp;
694 ExternalReference::InitializeMathExpData();
695 }
696
697 LOperand* value() { return inputs_[0]; }
698 LOperand* temp1() { return temps_[0]; }
699 LOperand* temp2() { return temps_[1]; }
700 LOperand* double_temp() { return temps_[2]; }
701
702 DECLARE_CONCRETE_INSTRUCTION(MathExp, "math-exp")
703
704 virtual void PrintDataTo(StringStream* stream);
705};
706
707
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000708class LCmpObjectEqAndBranch: public LControlInstruction<2, 0> {
709 public:
710 LCmpObjectEqAndBranch(LOperand* left, LOperand* right) {
711 inputs_[0] = left;
712 inputs_[1] = right;
713 }
714
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +0000715 LOperand* left() { return inputs_[0]; }
716 LOperand* right() { return inputs_[1]; }
717
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000718 DECLARE_CONCRETE_INSTRUCTION(CmpObjectEqAndBranch,
719 "cmp-object-eq-and-branch")
720 DECLARE_HYDROGEN_ACCESSOR(CompareObjectEqAndBranch)
721};
722
723
724class LCmpConstantEqAndBranch: public LControlInstruction<1, 0> {
725 public:
726 explicit LCmpConstantEqAndBranch(LOperand* left) {
727 inputs_[0] = left;
728 }
729
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +0000730 LOperand* left() { return inputs_[0]; }
731
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000732 DECLARE_CONCRETE_INSTRUCTION(CmpConstantEqAndBranch,
733 "cmp-constant-eq-and-branch")
734 DECLARE_HYDROGEN_ACCESSOR(CompareConstantEqAndBranch)
735};
736
737
738class LIsNilAndBranch: public LControlInstruction<1, 0> {
739 public:
740 explicit LIsNilAndBranch(LOperand* value) {
741 inputs_[0] = value;
742 }
743
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +0000744 LOperand* value() { return inputs_[0]; }
745
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000746 DECLARE_CONCRETE_INSTRUCTION(IsNilAndBranch, "is-nil-and-branch")
747 DECLARE_HYDROGEN_ACCESSOR(IsNilAndBranch)
748
749 EqualityKind kind() const { return hydrogen()->kind(); }
750 NilValue nil() const { return hydrogen()->nil(); }
751
752 virtual void PrintDataTo(StringStream* stream);
753};
754
755
756class LIsObjectAndBranch: public LControlInstruction<1, 1> {
757 public:
758 LIsObjectAndBranch(LOperand* value, LOperand* temp) {
759 inputs_[0] = value;
760 temps_[0] = temp;
761 }
762
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +0000763 LOperand* value() { return inputs_[0]; }
764 LOperand* temp() { return temps_[0]; }
765
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000766 DECLARE_CONCRETE_INSTRUCTION(IsObjectAndBranch, "is-object-and-branch")
767 DECLARE_HYDROGEN_ACCESSOR(IsObjectAndBranch)
768
769 virtual void PrintDataTo(StringStream* stream);
770};
771
772
mstarzinger@chromium.orgf8c6bd52011-11-23 12:13:52 +0000773class LIsStringAndBranch: public LControlInstruction<1, 1> {
774 public:
775 LIsStringAndBranch(LOperand* value, LOperand* temp) {
776 inputs_[0] = value;
777 temps_[0] = temp;
778 }
779
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +0000780 LOperand* value() { return inputs_[0]; }
781 LOperand* temp() { return temps_[0]; }
782
mstarzinger@chromium.orgf8c6bd52011-11-23 12:13:52 +0000783 DECLARE_CONCRETE_INSTRUCTION(IsStringAndBranch, "is-string-and-branch")
784 DECLARE_HYDROGEN_ACCESSOR(IsStringAndBranch)
785
786 virtual void PrintDataTo(StringStream* stream);
787};
788
789
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000790class LIsSmiAndBranch: public LControlInstruction<1, 0> {
791 public:
792 explicit LIsSmiAndBranch(LOperand* value) {
793 inputs_[0] = value;
794 }
795
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +0000796 LOperand* value() { return inputs_[0]; }
797
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000798 DECLARE_CONCRETE_INSTRUCTION(IsSmiAndBranch, "is-smi-and-branch")
799 DECLARE_HYDROGEN_ACCESSOR(IsSmiAndBranch)
800
801 virtual void PrintDataTo(StringStream* stream);
802};
803
804
805class LIsUndetectableAndBranch: public LControlInstruction<1, 1> {
806 public:
807 explicit LIsUndetectableAndBranch(LOperand* value, LOperand* temp) {
808 inputs_[0] = value;
809 temps_[0] = temp;
810 }
811
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +0000812 LOperand* value() { return inputs_[0]; }
813 LOperand* temp() { return temps_[0]; }
814
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000815 DECLARE_CONCRETE_INSTRUCTION(IsUndetectableAndBranch,
816 "is-undetectable-and-branch")
817 DECLARE_HYDROGEN_ACCESSOR(IsUndetectableAndBranch)
818
819 virtual void PrintDataTo(StringStream* stream);
820};
821
822
mstarzinger@chromium.orgf8c6bd52011-11-23 12:13:52 +0000823class LStringCompareAndBranch: public LControlInstruction<2, 0> {
824 public:
825 LStringCompareAndBranch(LOperand* left, LOperand* right) {
826 inputs_[0] = left;
827 inputs_[1] = right;
828 }
829
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +0000830 LOperand* left() { return inputs_[0]; }
831 LOperand* right() { return inputs_[1]; }
832
mstarzinger@chromium.orgf8c6bd52011-11-23 12:13:52 +0000833 DECLARE_CONCRETE_INSTRUCTION(StringCompareAndBranch,
834 "string-compare-and-branch")
835 DECLARE_HYDROGEN_ACCESSOR(StringCompareAndBranch)
836
837 Token::Value op() const { return hydrogen()->token(); }
838
839 virtual void PrintDataTo(StringStream* stream);
840};
841
842
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000843class LHasInstanceTypeAndBranch: public LControlInstruction<1, 0> {
844 public:
845 explicit LHasInstanceTypeAndBranch(LOperand* value) {
846 inputs_[0] = value;
847 }
848
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +0000849 LOperand* value() { return inputs_[0]; }
850
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000851 DECLARE_CONCRETE_INSTRUCTION(HasInstanceTypeAndBranch,
852 "has-instance-type-and-branch")
853 DECLARE_HYDROGEN_ACCESSOR(HasInstanceTypeAndBranch)
854
855 virtual void PrintDataTo(StringStream* stream);
856};
857
858
859class LGetCachedArrayIndex: public LTemplateInstruction<1, 1, 0> {
860 public:
861 explicit LGetCachedArrayIndex(LOperand* value) {
862 inputs_[0] = value;
863 }
864
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +0000865 LOperand* value() { return inputs_[0]; }
866
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000867 DECLARE_CONCRETE_INSTRUCTION(GetCachedArrayIndex, "get-cached-array-index")
868 DECLARE_HYDROGEN_ACCESSOR(GetCachedArrayIndex)
869};
870
871
872class LHasCachedArrayIndexAndBranch: public LControlInstruction<1, 0> {
873 public:
874 explicit LHasCachedArrayIndexAndBranch(LOperand* value) {
875 inputs_[0] = value;
876 }
877
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +0000878 LOperand* value() { return inputs_[0]; }
879
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000880 DECLARE_CONCRETE_INSTRUCTION(HasCachedArrayIndexAndBranch,
881 "has-cached-array-index-and-branch")
882 DECLARE_HYDROGEN_ACCESSOR(HasCachedArrayIndexAndBranch)
883
884 virtual void PrintDataTo(StringStream* stream);
885};
886
887
888class LClassOfTestAndBranch: public LControlInstruction<1, 1> {
889 public:
890 LClassOfTestAndBranch(LOperand* value, LOperand* temp) {
891 inputs_[0] = value;
892 temps_[0] = temp;
893 }
894
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +0000895 LOperand* value() { return inputs_[0]; }
896 LOperand* temp() { return temps_[0]; }
897
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000898 DECLARE_CONCRETE_INSTRUCTION(ClassOfTestAndBranch,
899 "class-of-test-and-branch")
900 DECLARE_HYDROGEN_ACCESSOR(ClassOfTestAndBranch)
901
902 virtual void PrintDataTo(StringStream* stream);
903};
904
905
906class LCmpT: public LTemplateInstruction<1, 2, 0> {
907 public:
908 LCmpT(LOperand* left, LOperand* right) {
909 inputs_[0] = left;
910 inputs_[1] = right;
911 }
912
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +0000913 LOperand* left() { return inputs_[0]; }
914 LOperand* right() { return inputs_[1]; }
915
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000916 DECLARE_CONCRETE_INSTRUCTION(CmpT, "cmp-t")
917 DECLARE_HYDROGEN_ACCESSOR(CompareGeneric)
918
919 Token::Value op() const { return hydrogen()->token(); }
920};
921
922
923class LInstanceOf: public LTemplateInstruction<1, 2, 0> {
924 public:
925 LInstanceOf(LOperand* left, LOperand* right) {
926 inputs_[0] = left;
927 inputs_[1] = right;
928 }
929
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +0000930 LOperand* left() { return inputs_[0]; }
931 LOperand* right() { return inputs_[1]; }
932
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000933 DECLARE_CONCRETE_INSTRUCTION(InstanceOf, "instance-of")
934};
935
936
937class LInstanceOfKnownGlobal: public LTemplateInstruction<1, 1, 1> {
938 public:
939 LInstanceOfKnownGlobal(LOperand* value, LOperand* temp) {
940 inputs_[0] = value;
941 temps_[0] = temp;
942 }
943
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +0000944 LOperand* value() { return inputs_[0]; }
945 LOperand* temp() { return temps_[0]; }
946
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000947 DECLARE_CONCRETE_INSTRUCTION(InstanceOfKnownGlobal,
948 "instance-of-known-global")
949 DECLARE_HYDROGEN_ACCESSOR(InstanceOfKnownGlobal)
950
951 Handle<JSFunction> function() const { return hydrogen()->function(); }
danno@chromium.org1044a4d2012-04-30 12:34:39 +0000952 LEnvironment* GetDeferredLazyDeoptimizationEnvironment() {
953 return lazy_deopt_env_;
954 }
955 virtual void SetDeferredLazyDeoptimizationEnvironment(LEnvironment* env) {
956 lazy_deopt_env_ = env;
957 }
958
959 private:
960 LEnvironment* lazy_deopt_env_;
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000961};
962
963
yangguo@chromium.org4a9f6552013-03-04 14:46:33 +0000964class LInstanceSize: public LTemplateInstruction<1, 1, 0> {
965 public:
966 explicit LInstanceSize(LOperand* object) {
967 inputs_[0] = object;
968 }
969
970 LOperand* object() { return inputs_[0]; }
971
972 DECLARE_CONCRETE_INSTRUCTION(InstanceSize, "instance-size")
973 DECLARE_HYDROGEN_ACCESSOR(InstanceSize)
974};
975
976
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000977class LBoundsCheck: public LTemplateInstruction<0, 2, 0> {
978 public:
979 LBoundsCheck(LOperand* index, LOperand* length) {
980 inputs_[0] = index;
981 inputs_[1] = length;
982 }
983
984 LOperand* index() { return inputs_[0]; }
985 LOperand* length() { return inputs_[1]; }
986
987 DECLARE_CONCRETE_INSTRUCTION(BoundsCheck, "bounds-check")
danno@chromium.org129d3982012-07-25 15:01:47 +0000988 DECLARE_HYDROGEN_ACCESSOR(BoundsCheck)
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000989};
990
991
992class LBitI: public LTemplateInstruction<1, 2, 0> {
993 public:
994 LBitI(LOperand* left, LOperand* right) {
995 inputs_[0] = left;
996 inputs_[1] = right;
997 }
998
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +0000999 LOperand* left() { return inputs_[0]; }
1000 LOperand* right() { return inputs_[1]; }
1001
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001002 Token::Value op() const { return hydrogen()->op(); }
1003
1004 DECLARE_CONCRETE_INSTRUCTION(BitI, "bit-i")
1005 DECLARE_HYDROGEN_ACCESSOR(Bitwise)
1006};
1007
1008
1009class LShiftI: public LTemplateInstruction<1, 2, 0> {
1010 public:
1011 LShiftI(Token::Value op, LOperand* left, LOperand* right, bool can_deopt)
1012 : op_(op), can_deopt_(can_deopt) {
1013 inputs_[0] = left;
1014 inputs_[1] = right;
1015 }
1016
1017 Token::Value op() const { return op_; }
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00001018 LOperand* left() { return inputs_[0]; }
1019 LOperand* right() { return inputs_[1]; }
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001020 bool can_deopt() const { return can_deopt_; }
1021
1022 DECLARE_CONCRETE_INSTRUCTION(ShiftI, "shift-i")
1023
1024 private:
1025 Token::Value op_;
1026 bool can_deopt_;
1027};
1028
1029
1030class LSubI: public LTemplateInstruction<1, 2, 0> {
1031 public:
1032 LSubI(LOperand* left, LOperand* right) {
1033 inputs_[0] = left;
1034 inputs_[1] = right;
1035 }
1036
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00001037 LOperand* left() { return inputs_[0]; }
1038 LOperand* right() { return inputs_[1]; }
1039
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001040 DECLARE_CONCRETE_INSTRUCTION(SubI, "sub-i")
1041 DECLARE_HYDROGEN_ACCESSOR(Sub)
1042};
1043
1044
1045class LConstantI: public LTemplateInstruction<1, 0, 0> {
1046 public:
1047 DECLARE_CONCRETE_INSTRUCTION(ConstantI, "constant-i")
1048 DECLARE_HYDROGEN_ACCESSOR(Constant)
1049
1050 int32_t value() const { return hydrogen()->Integer32Value(); }
1051};
1052
1053
1054class LConstantD: public LTemplateInstruction<1, 0, 0> {
1055 public:
1056 DECLARE_CONCRETE_INSTRUCTION(ConstantD, "constant-d")
1057 DECLARE_HYDROGEN_ACCESSOR(Constant)
1058
1059 double value() const { return hydrogen()->DoubleValue(); }
1060};
1061
1062
1063class LConstantT: public LTemplateInstruction<1, 0, 0> {
1064 public:
1065 DECLARE_CONCRETE_INSTRUCTION(ConstantT, "constant-t")
1066 DECLARE_HYDROGEN_ACCESSOR(Constant)
1067
1068 Handle<Object> value() const { return hydrogen()->handle(); }
1069};
1070
1071
1072class LBranch: public LControlInstruction<1, 0> {
1073 public:
1074 explicit LBranch(LOperand* value) {
1075 inputs_[0] = value;
1076 }
1077
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00001078 LOperand* value() { return inputs_[0]; }
1079
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001080 DECLARE_CONCRETE_INSTRUCTION(Branch, "branch")
1081 DECLARE_HYDROGEN_ACCESSOR(Branch)
1082
1083 virtual void PrintDataTo(StringStream* stream);
1084};
1085
1086
1087class LCmpMapAndBranch: public LTemplateInstruction<0, 1, 1> {
1088 public:
1089 LCmpMapAndBranch(LOperand* value, LOperand* temp) {
1090 inputs_[0] = value;
1091 temps_[0] = temp;
1092 }
1093
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00001094 LOperand* value() { return inputs_[0]; }
1095 LOperand* temp() { return temps_[0]; }
1096
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001097 DECLARE_CONCRETE_INSTRUCTION(CmpMapAndBranch, "cmp-map-and-branch")
1098 DECLARE_HYDROGEN_ACCESSOR(CompareMap)
1099
1100 virtual bool IsControl() const { return true; }
1101
1102 Handle<Map> map() const { return hydrogen()->map(); }
1103 int true_block_id() const {
1104 return hydrogen()->FirstSuccessor()->block_id();
1105 }
1106 int false_block_id() const {
1107 return hydrogen()->SecondSuccessor()->block_id();
1108 }
1109};
1110
1111
1112class LJSArrayLength: public LTemplateInstruction<1, 1, 0> {
1113 public:
1114 explicit LJSArrayLength(LOperand* value) {
1115 inputs_[0] = value;
1116 }
1117
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00001118 LOperand* value() { return inputs_[0]; }
1119
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001120 DECLARE_CONCRETE_INSTRUCTION(JSArrayLength, "js-array-length")
1121 DECLARE_HYDROGEN_ACCESSOR(JSArrayLength)
1122};
1123
1124
1125class LFixedArrayBaseLength: public LTemplateInstruction<1, 1, 0> {
1126 public:
1127 explicit LFixedArrayBaseLength(LOperand* value) {
1128 inputs_[0] = value;
1129 }
1130
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00001131 LOperand* value() { return inputs_[0]; }
1132
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001133 DECLARE_CONCRETE_INSTRUCTION(FixedArrayBaseLength,
1134 "fixed-array-base-length")
1135 DECLARE_HYDROGEN_ACCESSOR(FixedArrayBaseLength)
1136};
1137
1138
jkummerow@chromium.org78502a92012-09-06 13:50:42 +00001139class LMapEnumLength: public LTemplateInstruction<1, 1, 0> {
1140 public:
1141 explicit LMapEnumLength(LOperand* value) {
1142 inputs_[0] = value;
1143 }
1144
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00001145 LOperand* value() { return inputs_[0]; }
1146
jkummerow@chromium.org78502a92012-09-06 13:50:42 +00001147 DECLARE_CONCRETE_INSTRUCTION(MapEnumLength, "map-enum-length")
1148};
1149
1150
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001151class LElementsKind: public LTemplateInstruction<1, 1, 0> {
1152 public:
1153 explicit LElementsKind(LOperand* value) {
1154 inputs_[0] = value;
1155 }
1156
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00001157 LOperand* value() { return inputs_[0]; }
1158
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001159 DECLARE_CONCRETE_INSTRUCTION(ElementsKind, "elements-kind")
1160 DECLARE_HYDROGEN_ACCESSOR(ElementsKind)
1161};
1162
1163
1164class LValueOf: public LTemplateInstruction<1, 1, 1> {
1165 public:
1166 LValueOf(LOperand* value, LOperand* temp) {
1167 inputs_[0] = value;
1168 temps_[0] = temp;
1169 }
1170
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00001171 LOperand* value() { return inputs_[0]; }
1172 LOperand* temp() { return temps_[0]; }
1173
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001174 DECLARE_CONCRETE_INSTRUCTION(ValueOf, "value-of")
1175 DECLARE_HYDROGEN_ACCESSOR(ValueOf)
1176};
1177
1178
yangguo@chromium.org154ff992012-03-13 08:09:54 +00001179class LDateField: public LTemplateInstruction<1, 1, 1> {
1180 public:
1181 LDateField(LOperand* date, LOperand* temp, Smi* index) : index_(index) {
1182 inputs_[0] = date;
1183 temps_[0] = temp;
1184 }
1185
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00001186 LOperand* date() { return inputs_[0]; }
1187 LOperand* temp() { return temps_[0]; }
1188 Smi* index() const { return index_; }
1189
yangguo@chromium.org154ff992012-03-13 08:09:54 +00001190 DECLARE_CONCRETE_INSTRUCTION(ValueOf, "date-field")
1191 DECLARE_HYDROGEN_ACCESSOR(ValueOf)
yangguo@chromium.org154ff992012-03-13 08:09:54 +00001192
1193 private:
1194 Smi* index_;
1195};
1196
1197
yangguo@chromium.orga6bbcc82012-12-21 12:35:02 +00001198class LSeqStringSetChar: public LTemplateInstruction<1, 3, 0> {
1199 public:
1200 LSeqStringSetChar(String::Encoding encoding,
1201 LOperand* string,
1202 LOperand* index,
1203 LOperand* value) : encoding_(encoding) {
1204 inputs_[0] = string;
1205 inputs_[1] = index;
1206 inputs_[2] = value;
1207 }
1208
1209 String::Encoding encoding() { return encoding_; }
1210 LOperand* string() { return inputs_[0]; }
1211 LOperand* index() { return inputs_[1]; }
1212 LOperand* value() { return inputs_[2]; }
1213
1214 DECLARE_CONCRETE_INSTRUCTION(SeqStringSetChar, "seq-string-set-char")
1215 DECLARE_HYDROGEN_ACCESSOR(SeqStringSetChar)
1216
1217 private:
1218 String::Encoding encoding_;
1219};
1220
1221
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001222class LThrow: public LTemplateInstruction<0, 1, 0> {
1223 public:
1224 explicit LThrow(LOperand* value) {
1225 inputs_[0] = value;
1226 }
1227
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00001228 LOperand* value() { return inputs_[0]; }
1229
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001230 DECLARE_CONCRETE_INSTRUCTION(Throw, "throw")
1231};
1232
1233
1234class LBitNotI: public LTemplateInstruction<1, 1, 0> {
1235 public:
1236 explicit LBitNotI(LOperand* value) {
1237 inputs_[0] = value;
1238 }
1239
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00001240 LOperand* value() { return inputs_[0]; }
1241
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001242 DECLARE_CONCRETE_INSTRUCTION(BitNotI, "bit-not-i")
1243};
1244
1245
1246class LAddI: public LTemplateInstruction<1, 2, 0> {
1247 public:
1248 LAddI(LOperand* left, LOperand* right) {
1249 inputs_[0] = left;
1250 inputs_[1] = right;
1251 }
1252
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00001253 LOperand* left() { return inputs_[0]; }
1254 LOperand* right() { return inputs_[1]; }
1255
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001256 DECLARE_CONCRETE_INSTRUCTION(AddI, "add-i")
1257 DECLARE_HYDROGEN_ACCESSOR(Add)
1258};
1259
1260
mstarzinger@chromium.org471f2f12012-08-10 14:46:33 +00001261class LMathMinMax: public LTemplateInstruction<1, 2, 0> {
1262 public:
1263 LMathMinMax(LOperand* left, LOperand* right) {
1264 inputs_[0] = left;
1265 inputs_[1] = right;
1266 }
1267
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00001268 LOperand* left() { return inputs_[0]; }
1269 LOperand* right() { return inputs_[1]; }
1270
mstarzinger@chromium.org471f2f12012-08-10 14:46:33 +00001271 DECLARE_CONCRETE_INSTRUCTION(MathMinMax, "min-max")
1272 DECLARE_HYDROGEN_ACCESSOR(MathMinMax)
1273};
1274
1275
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001276class LPower: public LTemplateInstruction<1, 2, 0> {
1277 public:
1278 LPower(LOperand* left, LOperand* right) {
1279 inputs_[0] = left;
1280 inputs_[1] = right;
1281 }
1282
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00001283 LOperand* left() { return inputs_[0]; }
1284 LOperand* right() { return inputs_[1]; }
1285
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001286 DECLARE_CONCRETE_INSTRUCTION(Power, "power")
1287 DECLARE_HYDROGEN_ACCESSOR(Power)
1288};
1289
1290
erik.corry@gmail.comf2038fb2012-01-16 11:42:08 +00001291class LRandom: public LTemplateInstruction<1, 1, 0> {
1292 public:
1293 explicit LRandom(LOperand* global_object) {
1294 inputs_[0] = global_object;
1295 }
1296
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00001297 LOperand* global_object() { return inputs_[0]; }
1298
erik.corry@gmail.comf2038fb2012-01-16 11:42:08 +00001299 DECLARE_CONCRETE_INSTRUCTION(Random, "random")
1300 DECLARE_HYDROGEN_ACCESSOR(Random)
1301};
1302
1303
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001304class LArithmeticD: public LTemplateInstruction<1, 2, 0> {
1305 public:
1306 LArithmeticD(Token::Value op, LOperand* left, LOperand* right)
1307 : op_(op) {
1308 inputs_[0] = left;
1309 inputs_[1] = right;
1310 }
1311
1312 Token::Value op() const { return op_; }
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00001313 LOperand* left() { return inputs_[0]; }
1314 LOperand* right() { return inputs_[1]; }
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001315
1316 virtual Opcode opcode() const { return LInstruction::kArithmeticD; }
1317 virtual void CompileToNative(LCodeGen* generator);
1318 virtual const char* Mnemonic() const;
1319
1320 private:
1321 Token::Value op_;
1322};
1323
1324
1325class LArithmeticT: public LTemplateInstruction<1, 2, 0> {
1326 public:
1327 LArithmeticT(Token::Value op, LOperand* left, LOperand* right)
1328 : op_(op) {
1329 inputs_[0] = left;
1330 inputs_[1] = right;
1331 }
1332
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00001333 LOperand* left() { return inputs_[0]; }
1334 LOperand* right() { return inputs_[1]; }
1335 Token::Value op() const { return op_; }
1336
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001337 virtual Opcode opcode() const { return LInstruction::kArithmeticT; }
1338 virtual void CompileToNative(LCodeGen* generator);
1339 virtual const char* Mnemonic() const;
1340
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001341 private:
1342 Token::Value op_;
1343};
1344
1345
ulan@chromium.org6e196bf2013-03-13 09:38:22 +00001346class LReturn: public LTemplateInstruction<0, 2, 0> {
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001347 public:
ulan@chromium.org6e196bf2013-03-13 09:38:22 +00001348 explicit LReturn(LOperand* value, LOperand* parameter_count) {
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001349 inputs_[0] = value;
ulan@chromium.org6e196bf2013-03-13 09:38:22 +00001350 inputs_[1] = parameter_count;
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001351 }
1352
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00001353 LOperand* value() { return inputs_[0]; }
1354
ulan@chromium.org6e196bf2013-03-13 09:38:22 +00001355 bool has_constant_parameter_count() {
1356 return parameter_count()->IsConstantOperand();
1357 }
1358 LConstantOperand* constant_parameter_count() {
1359 ASSERT(has_constant_parameter_count());
1360 return LConstantOperand::cast(parameter_count());
1361 }
1362 LOperand* parameter_count() { return inputs_[1]; }
1363
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001364 DECLARE_CONCRETE_INSTRUCTION(Return, "return")
1365};
1366
1367
1368class LLoadNamedField: public LTemplateInstruction<1, 1, 0> {
1369 public:
1370 explicit LLoadNamedField(LOperand* object) {
1371 inputs_[0] = object;
1372 }
1373
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00001374 LOperand* object() { return inputs_[0]; }
1375
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001376 DECLARE_CONCRETE_INSTRUCTION(LoadNamedField, "load-named-field")
1377 DECLARE_HYDROGEN_ACCESSOR(LoadNamedField)
1378};
1379
1380
1381class LLoadNamedFieldPolymorphic: public LTemplateInstruction<1, 1, 0> {
1382 public:
1383 explicit LLoadNamedFieldPolymorphic(LOperand* object) {
1384 inputs_[0] = object;
1385 }
1386
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00001387 LOperand* object() { return inputs_[0]; }
1388
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001389 DECLARE_CONCRETE_INSTRUCTION(LoadNamedField, "load-named-field-polymorphic")
1390 DECLARE_HYDROGEN_ACCESSOR(LoadNamedFieldPolymorphic)
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001391};
1392
1393
1394class LLoadNamedGeneric: public LTemplateInstruction<1, 1, 0> {
1395 public:
1396 explicit LLoadNamedGeneric(LOperand* object) {
1397 inputs_[0] = object;
1398 }
1399
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00001400 LOperand* object() { return inputs_[0]; }
1401
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001402 DECLARE_CONCRETE_INSTRUCTION(LoadNamedGeneric, "load-named-generic")
1403 DECLARE_HYDROGEN_ACCESSOR(LoadNamedGeneric)
1404
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001405 Handle<Object> name() const { return hydrogen()->name(); }
1406};
1407
1408
1409class LLoadFunctionPrototype: public LTemplateInstruction<1, 1, 0> {
1410 public:
1411 explicit LLoadFunctionPrototype(LOperand* function) {
1412 inputs_[0] = function;
1413 }
1414
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00001415 LOperand* function() { return inputs_[0]; }
1416
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001417 DECLARE_CONCRETE_INSTRUCTION(LoadFunctionPrototype, "load-function-prototype")
1418 DECLARE_HYDROGEN_ACCESSOR(LoadFunctionPrototype)
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001419};
1420
1421
1422class LLoadElements: public LTemplateInstruction<1, 1, 0> {
1423 public:
1424 explicit LLoadElements(LOperand* object) {
1425 inputs_[0] = object;
1426 }
1427
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00001428 LOperand* object() { return inputs_[0]; }
1429
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001430 DECLARE_CONCRETE_INSTRUCTION(LoadElements, "load-elements")
1431};
1432
1433
1434class LLoadExternalArrayPointer: public LTemplateInstruction<1, 1, 0> {
1435 public:
1436 explicit LLoadExternalArrayPointer(LOperand* object) {
1437 inputs_[0] = object;
1438 }
1439
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00001440 LOperand* object() { return inputs_[0]; }
1441
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001442 DECLARE_CONCRETE_INSTRUCTION(LoadExternalArrayPointer,
1443 "load-external-array-pointer")
1444};
1445
1446
mvstanton@chromium.orge4ac3ef2012-11-12 14:53:34 +00001447class LLoadKeyed: public LTemplateInstruction<1, 2, 0> {
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001448 public:
mvstanton@chromium.orge4ac3ef2012-11-12 14:53:34 +00001449 LLoadKeyed(LOperand* elements, LOperand* key) {
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001450 inputs_[0] = elements;
1451 inputs_[1] = key;
1452 }
1453
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00001454 LOperand* elements() { return inputs_[0]; }
1455 LOperand* key() { return inputs_[1]; }
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001456 ElementsKind elements_kind() const {
1457 return hydrogen()->elements_kind();
1458 }
mvstanton@chromium.orge4ac3ef2012-11-12 14:53:34 +00001459 bool is_external() const {
1460 return hydrogen()->is_external();
1461 }
1462
1463 DECLARE_CONCRETE_INSTRUCTION(LoadKeyed, "load-keyed")
1464 DECLARE_HYDROGEN_ACCESSOR(LoadKeyed)
1465
ulan@chromium.org8e8d8822012-11-23 14:36:46 +00001466 virtual void PrintDataTo(StringStream* stream);
jkummerow@chromium.org777db6f2012-05-24 09:33:09 +00001467 uint32_t additional_index() const { return hydrogen()->index_offset(); }
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001468};
1469
1470
1471class LLoadKeyedGeneric: public LTemplateInstruction<1, 2, 0> {
1472 public:
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00001473 LLoadKeyedGeneric(LOperand* object, LOperand* key) {
1474 inputs_[0] = object;
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001475 inputs_[1] = key;
1476 }
1477
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001478 LOperand* object() { return inputs_[0]; }
1479 LOperand* key() { return inputs_[1]; }
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00001480
1481 DECLARE_CONCRETE_INSTRUCTION(LoadKeyedGeneric, "load-keyed-generic")
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001482};
1483
1484
1485class LLoadGlobalCell: public LTemplateInstruction<1, 0, 0> {
1486 public:
1487 DECLARE_CONCRETE_INSTRUCTION(LoadGlobalCell, "load-global-cell")
1488 DECLARE_HYDROGEN_ACCESSOR(LoadGlobalCell)
1489};
1490
1491
1492class LLoadGlobalGeneric: public LTemplateInstruction<1, 1, 0> {
1493 public:
1494 explicit LLoadGlobalGeneric(LOperand* global_object) {
1495 inputs_[0] = global_object;
1496 }
1497
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00001498 LOperand* global_object() { return inputs_[0]; }
1499
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001500 DECLARE_CONCRETE_INSTRUCTION(LoadGlobalGeneric, "load-global-generic")
1501 DECLARE_HYDROGEN_ACCESSOR(LoadGlobalGeneric)
1502
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001503 Handle<Object> name() const { return hydrogen()->name(); }
1504 bool for_typeof() const { return hydrogen()->for_typeof(); }
1505};
1506
1507
1508class LStoreGlobalCell: public LTemplateInstruction<0, 1, 1> {
1509 public:
1510 LStoreGlobalCell(LOperand* value, LOperand* temp) {
1511 inputs_[0] = value;
1512 temps_[0] = temp;
1513 }
1514
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00001515 LOperand* value() { return inputs_[0]; }
1516 LOperand* temp() { return temps_[0]; }
1517
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001518 DECLARE_CONCRETE_INSTRUCTION(StoreGlobalCell, "store-global-cell")
1519 DECLARE_HYDROGEN_ACCESSOR(StoreGlobalCell)
1520};
1521
1522
1523class LStoreGlobalGeneric: public LTemplateInstruction<0, 2, 0> {
1524 public:
1525 explicit LStoreGlobalGeneric(LOperand* global_object,
1526 LOperand* value) {
1527 inputs_[0] = global_object;
1528 inputs_[1] = value;
1529 }
1530
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00001531 LOperand* global_object() { return inputs_[0]; }
1532 LOperand* value() { return inputs_[1]; }
1533
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001534 DECLARE_CONCRETE_INSTRUCTION(StoreGlobalGeneric, "store-global-generic")
1535 DECLARE_HYDROGEN_ACCESSOR(StoreGlobalGeneric)
1536
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001537 Handle<Object> name() const { return hydrogen()->name(); }
mstarzinger@chromium.org1b3afd12011-11-29 14:28:56 +00001538 StrictModeFlag strict_mode_flag() { return hydrogen()->strict_mode_flag(); }
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001539};
1540
1541
1542class LLoadContextSlot: public LTemplateInstruction<1, 1, 0> {
1543 public:
1544 explicit LLoadContextSlot(LOperand* context) {
1545 inputs_[0] = context;
1546 }
1547
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00001548 LOperand* context() { return inputs_[0]; }
1549
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001550 DECLARE_CONCRETE_INSTRUCTION(LoadContextSlot, "load-context-slot")
1551 DECLARE_HYDROGEN_ACCESSOR(LoadContextSlot)
1552
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001553 int slot_index() { return hydrogen()->slot_index(); }
1554
1555 virtual void PrintDataTo(StringStream* stream);
1556};
1557
1558
1559class LStoreContextSlot: public LTemplateInstruction<0, 2, 0> {
1560 public:
1561 LStoreContextSlot(LOperand* context, LOperand* value) {
1562 inputs_[0] = context;
1563 inputs_[1] = value;
1564 }
1565
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00001566 LOperand* context() { return inputs_[0]; }
1567 LOperand* value() { return inputs_[1]; }
1568
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001569 DECLARE_CONCRETE_INSTRUCTION(StoreContextSlot, "store-context-slot")
1570 DECLARE_HYDROGEN_ACCESSOR(StoreContextSlot)
1571
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001572 int slot_index() { return hydrogen()->slot_index(); }
1573
1574 virtual void PrintDataTo(StringStream* stream);
1575};
1576
1577
1578class LPushArgument: public LTemplateInstruction<0, 1, 0> {
1579 public:
1580 explicit LPushArgument(LOperand* value) {
1581 inputs_[0] = value;
1582 }
1583
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00001584 LOperand* value() { return inputs_[0]; }
1585
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001586 DECLARE_CONCRETE_INSTRUCTION(PushArgument, "push-argument")
1587};
1588
1589
jkummerow@chromium.org28faa982012-04-13 09:58:30 +00001590class LDrop: public LTemplateInstruction<0, 0, 0> {
1591 public:
1592 explicit LDrop(int count) : count_(count) { }
1593
1594 int count() const { return count_; }
1595
1596 DECLARE_CONCRETE_INSTRUCTION(Drop, "drop")
1597
1598 private:
1599 int count_;
1600};
1601
1602
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001603class LThisFunction: public LTemplateInstruction<1, 0, 0> {
1604 public:
1605 DECLARE_CONCRETE_INSTRUCTION(ThisFunction, "this-function")
1606 DECLARE_HYDROGEN_ACCESSOR(ThisFunction)
1607};
1608
1609
1610class LContext: public LTemplateInstruction<1, 0, 0> {
1611 public:
1612 DECLARE_CONCRETE_INSTRUCTION(Context, "context")
hpayer@chromium.org7c3372b2013-02-13 17:26:04 +00001613 DECLARE_HYDROGEN_ACCESSOR(Context)
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001614};
1615
1616
1617class LOuterContext: public LTemplateInstruction<1, 1, 0> {
1618 public:
1619 explicit LOuterContext(LOperand* context) {
1620 inputs_[0] = context;
1621 }
1622
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00001623 LOperand* context() { return inputs_[0]; }
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001624
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00001625 DECLARE_CONCRETE_INSTRUCTION(OuterContext, "outer-context")
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001626};
1627
1628
jkummerow@chromium.orgf7a58842012-02-21 10:08:21 +00001629class LDeclareGlobals: public LTemplateInstruction<0, 0, 0> {
1630 public:
1631 DECLARE_CONCRETE_INSTRUCTION(DeclareGlobals, "declare-globals")
1632 DECLARE_HYDROGEN_ACCESSOR(DeclareGlobals)
1633};
1634
1635
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001636class LGlobalObject: public LTemplateInstruction<1, 1, 0> {
1637 public:
1638 explicit LGlobalObject(LOperand* context) {
1639 inputs_[0] = context;
1640 }
1641
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00001642 LOperand* context() { return inputs_[0]; }
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001643
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00001644 DECLARE_CONCRETE_INSTRUCTION(GlobalObject, "global-object")
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001645};
1646
1647
1648class LGlobalReceiver: public LTemplateInstruction<1, 1, 0> {
1649 public:
1650 explicit LGlobalReceiver(LOperand* global_object) {
1651 inputs_[0] = global_object;
1652 }
1653
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00001654 LOperand* global_object() { return inputs_[0]; }
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001655
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00001656 DECLARE_CONCRETE_INSTRUCTION(GlobalReceiver, "global-receiver")
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001657};
1658
1659
1660class LCallConstantFunction: public LTemplateInstruction<1, 0, 0> {
1661 public:
1662 DECLARE_CONCRETE_INSTRUCTION(CallConstantFunction, "call-constant-function")
1663 DECLARE_HYDROGEN_ACCESSOR(CallConstantFunction)
1664
1665 virtual void PrintDataTo(StringStream* stream);
1666
1667 Handle<JSFunction> function() { return hydrogen()->function(); }
1668 int arity() const { return hydrogen()->argument_count() - 1; }
1669};
1670
1671
1672class LInvokeFunction: public LTemplateInstruction<1, 1, 0> {
1673 public:
1674 explicit LInvokeFunction(LOperand* function) {
1675 inputs_[0] = function;
1676 }
1677
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00001678 LOperand* function() { return inputs_[0]; }
1679
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001680 DECLARE_CONCRETE_INSTRUCTION(InvokeFunction, "invoke-function")
1681 DECLARE_HYDROGEN_ACCESSOR(InvokeFunction)
1682
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001683 virtual void PrintDataTo(StringStream* stream);
1684
1685 int arity() const { return hydrogen()->argument_count() - 1; }
svenpanne@chromium.orgfb046332012-04-19 12:02:44 +00001686 Handle<JSFunction> known_function() { return hydrogen()->known_function(); }
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001687};
1688
1689
1690class LCallKeyed: public LTemplateInstruction<1, 1, 0> {
1691 public:
1692 explicit LCallKeyed(LOperand* key) {
1693 inputs_[0] = key;
1694 }
1695
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00001696 LOperand* key() { return inputs_[0]; }
1697
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001698 DECLARE_CONCRETE_INSTRUCTION(CallKeyed, "call-keyed")
1699 DECLARE_HYDROGEN_ACCESSOR(CallKeyed)
1700
1701 virtual void PrintDataTo(StringStream* stream);
1702
1703 int arity() const { return hydrogen()->argument_count() - 1; }
1704};
1705
1706
1707
1708class LCallNamed: public LTemplateInstruction<1, 0, 0> {
1709 public:
1710 DECLARE_CONCRETE_INSTRUCTION(CallNamed, "call-named")
1711 DECLARE_HYDROGEN_ACCESSOR(CallNamed)
1712
1713 virtual void PrintDataTo(StringStream* stream);
1714
1715 Handle<String> name() const { return hydrogen()->name(); }
1716 int arity() const { return hydrogen()->argument_count() - 1; }
1717};
1718
1719
danno@chromium.orgc612e022011-11-10 11:38:15 +00001720class LCallFunction: public LTemplateInstruction<1, 1, 0> {
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001721 public:
danno@chromium.orgc612e022011-11-10 11:38:15 +00001722 explicit LCallFunction(LOperand* function) {
1723 inputs_[0] = function;
1724 }
1725
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00001726 LOperand* function() { return inputs_[0]; }
1727
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001728 DECLARE_CONCRETE_INSTRUCTION(CallFunction, "call-function")
1729 DECLARE_HYDROGEN_ACCESSOR(CallFunction)
1730
danno@chromium.orgc612e022011-11-10 11:38:15 +00001731 int arity() const { return hydrogen()->argument_count() - 1; }
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001732};
1733
1734
1735class LCallGlobal: public LTemplateInstruction<1, 0, 0> {
1736 public:
1737 DECLARE_CONCRETE_INSTRUCTION(CallGlobal, "call-global")
1738 DECLARE_HYDROGEN_ACCESSOR(CallGlobal)
1739
1740 virtual void PrintDataTo(StringStream* stream);
1741
1742 Handle<String> name() const {return hydrogen()->name(); }
1743 int arity() const { return hydrogen()->argument_count() - 1; }
1744};
1745
1746
1747class LCallKnownGlobal: public LTemplateInstruction<1, 0, 0> {
1748 public:
1749 DECLARE_CONCRETE_INSTRUCTION(CallKnownGlobal, "call-known-global")
1750 DECLARE_HYDROGEN_ACCESSOR(CallKnownGlobal)
1751
1752 virtual void PrintDataTo(StringStream* stream);
1753
1754 Handle<JSFunction> target() const { return hydrogen()->target(); }
1755 int arity() const { return hydrogen()->argument_count() - 1; }
1756};
1757
1758
1759class LCallNew: public LTemplateInstruction<1, 1, 0> {
1760 public:
1761 explicit LCallNew(LOperand* constructor) {
1762 inputs_[0] = constructor;
1763 }
1764
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00001765 LOperand* constructor() { return inputs_[0]; }
1766
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001767 DECLARE_CONCRETE_INSTRUCTION(CallNew, "call-new")
1768 DECLARE_HYDROGEN_ACCESSOR(CallNew)
1769
1770 virtual void PrintDataTo(StringStream* stream);
1771
1772 int arity() const { return hydrogen()->argument_count() - 1; }
1773};
1774
1775
ulan@chromium.org750145a2013-03-07 15:14:13 +00001776class LCallNewArray: public LTemplateInstruction<1, 1, 0> {
1777 public:
1778 explicit LCallNewArray(LOperand* constructor) {
1779 inputs_[0] = constructor;
1780 }
1781
1782 LOperand* constructor() { return inputs_[0]; }
1783
1784 DECLARE_CONCRETE_INSTRUCTION(CallNewArray, "call-new-array")
1785 DECLARE_HYDROGEN_ACCESSOR(CallNewArray)
1786
1787 virtual void PrintDataTo(StringStream* stream);
1788
1789 int arity() const { return hydrogen()->argument_count() - 1; }
1790};
1791
1792
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001793class LCallRuntime: public LTemplateInstruction<1, 0, 0> {
1794 public:
1795 DECLARE_CONCRETE_INSTRUCTION(CallRuntime, "call-runtime")
1796 DECLARE_HYDROGEN_ACCESSOR(CallRuntime)
1797
1798 const Runtime::Function* function() const { return hydrogen()->function(); }
1799 int arity() const { return hydrogen()->argument_count(); }
1800};
1801
1802
1803class LInteger32ToDouble: public LTemplateInstruction<1, 1, 0> {
1804 public:
1805 explicit LInteger32ToDouble(LOperand* value) {
1806 inputs_[0] = value;
1807 }
1808
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00001809 LOperand* value() { return inputs_[0]; }
1810
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001811 DECLARE_CONCRETE_INSTRUCTION(Integer32ToDouble, "int32-to-double")
1812};
1813
1814
jkummerow@chromium.org78502a92012-09-06 13:50:42 +00001815class LUint32ToDouble: public LTemplateInstruction<1, 1, 0> {
1816 public:
1817 explicit LUint32ToDouble(LOperand* value) {
1818 inputs_[0] = value;
1819 }
1820
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00001821 LOperand* value() { return inputs_[0]; }
1822
jkummerow@chromium.org78502a92012-09-06 13:50:42 +00001823 DECLARE_CONCRETE_INSTRUCTION(Uint32ToDouble, "uint32-to-double")
1824};
1825
1826
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001827class LNumberTagI: public LTemplateInstruction<1, 1, 0> {
1828 public:
1829 explicit LNumberTagI(LOperand* value) {
1830 inputs_[0] = value;
1831 }
1832
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00001833 LOperand* value() { return inputs_[0]; }
1834
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001835 DECLARE_CONCRETE_INSTRUCTION(NumberTagI, "number-tag-i")
1836};
1837
1838
jkummerow@chromium.org78502a92012-09-06 13:50:42 +00001839class LNumberTagU: public LTemplateInstruction<1, 1, 0> {
1840 public:
1841 explicit LNumberTagU(LOperand* value) {
1842 inputs_[0] = value;
1843 }
1844
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00001845 LOperand* value() { return inputs_[0]; }
1846
jkummerow@chromium.org78502a92012-09-06 13:50:42 +00001847 DECLARE_CONCRETE_INSTRUCTION(NumberTagU, "number-tag-u")
1848};
1849
1850
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001851class LNumberTagD: public LTemplateInstruction<1, 1, 2> {
1852 public:
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00001853 LNumberTagD(LOperand* value, LOperand* temp, LOperand* temp2) {
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001854 inputs_[0] = value;
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00001855 temps_[0] = temp;
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001856 temps_[1] = temp2;
1857 }
1858
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00001859 LOperand* value() { return inputs_[0]; }
1860 LOperand* temp() { return temps_[0]; }
1861 LOperand* temp2() { return temps_[1]; }
1862
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001863 DECLARE_CONCRETE_INSTRUCTION(NumberTagD, "number-tag-d")
hpayer@chromium.org7c3372b2013-02-13 17:26:04 +00001864 DECLARE_HYDROGEN_ACCESSOR(Change)
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001865};
1866
1867
1868// Sometimes truncating conversion from a tagged value to an int32.
1869class LDoubleToI: public LTemplateInstruction<1, 1, 2> {
1870 public:
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00001871 LDoubleToI(LOperand* value, LOperand* temp, LOperand* temp2) {
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001872 inputs_[0] = value;
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00001873 temps_[0] = temp;
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001874 temps_[1] = temp2;
1875 }
1876
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00001877 LOperand* value() { return inputs_[0]; }
1878 LOperand* temp() { return temps_[0]; }
1879 LOperand* temp2() { return temps_[1]; }
1880
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001881 DECLARE_CONCRETE_INSTRUCTION(DoubleToI, "double-to-i")
1882 DECLARE_HYDROGEN_ACCESSOR(UnaryOperation)
1883
1884 bool truncating() { return hydrogen()->CanTruncateToInt32(); }
1885};
1886
1887
1888// Truncating conversion from a tagged value to an int32.
1889class LTaggedToI: public LTemplateInstruction<1, 1, 3> {
1890 public:
1891 LTaggedToI(LOperand* value,
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00001892 LOperand* temp,
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001893 LOperand* temp2,
1894 LOperand* temp3) {
1895 inputs_[0] = value;
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00001896 temps_[0] = temp;
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001897 temps_[1] = temp2;
1898 temps_[2] = temp3;
1899 }
1900
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00001901 LOperand* value() { return inputs_[0]; }
1902 LOperand* temp() { return temps_[0]; }
1903 LOperand* temp2() { return temps_[1]; }
1904 LOperand* temp3() { return temps_[2]; }
1905
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001906 DECLARE_CONCRETE_INSTRUCTION(TaggedToI, "tagged-to-i")
1907 DECLARE_HYDROGEN_ACCESSOR(UnaryOperation)
1908
1909 bool truncating() { return hydrogen()->CanTruncateToInt32(); }
1910};
1911
1912
1913class LSmiTag: public LTemplateInstruction<1, 1, 0> {
1914 public:
1915 explicit LSmiTag(LOperand* value) {
1916 inputs_[0] = value;
1917 }
1918
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00001919 LOperand* value() { return inputs_[0]; }
1920
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001921 DECLARE_CONCRETE_INSTRUCTION(SmiTag, "smi-tag")
1922};
1923
1924
1925class LNumberUntagD: public LTemplateInstruction<1, 1, 0> {
1926 public:
1927 explicit LNumberUntagD(LOperand* value) {
1928 inputs_[0] = value;
1929 }
1930
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00001931 LOperand* value() { return inputs_[0]; }
1932
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001933 DECLARE_CONCRETE_INSTRUCTION(NumberUntagD, "double-untag")
1934 DECLARE_HYDROGEN_ACCESSOR(Change)
1935};
1936
1937
1938class LSmiUntag: public LTemplateInstruction<1, 1, 0> {
1939 public:
1940 LSmiUntag(LOperand* value, bool needs_check)
1941 : needs_check_(needs_check) {
1942 inputs_[0] = value;
1943 }
1944
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00001945 LOperand* value() { return inputs_[0]; }
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001946 bool needs_check() const { return needs_check_; }
1947
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00001948 DECLARE_CONCRETE_INSTRUCTION(SmiUntag, "smi-untag")
1949
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001950 private:
1951 bool needs_check_;
1952};
1953
1954
verwaest@chromium.org37141392012-05-31 13:27:02 +00001955class LStoreNamedField: public LTemplateInstruction<0, 2, 1> {
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001956 public:
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00001957 LStoreNamedField(LOperand* object, LOperand* value, LOperand* temp) {
1958 inputs_[0] = object;
1959 inputs_[1] = value;
verwaest@chromium.org37141392012-05-31 13:27:02 +00001960 temps_[0] = temp;
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001961 }
1962
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00001963 LOperand* object() { return inputs_[0]; }
1964 LOperand* value() { return inputs_[1]; }
1965 LOperand* temp() { return temps_[0]; }
1966
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001967 DECLARE_CONCRETE_INSTRUCTION(StoreNamedField, "store-named-field")
1968 DECLARE_HYDROGEN_ACCESSOR(StoreNamedField)
1969
1970 virtual void PrintDataTo(StringStream* stream);
1971
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001972 Handle<Object> name() const { return hydrogen()->name(); }
1973 bool is_in_object() { return hydrogen()->is_in_object(); }
1974 int offset() { return hydrogen()->offset(); }
1975 Handle<Map> transition() const { return hydrogen()->transition(); }
1976};
1977
1978
1979class LStoreNamedGeneric: public LTemplateInstruction<0, 2, 0> {
1980 public:
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00001981 LStoreNamedGeneric(LOperand* object, LOperand* value) {
1982 inputs_[0] = object;
1983 inputs_[1] = value;
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001984 }
1985
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00001986 LOperand* object() { return inputs_[0]; }
1987 LOperand* value() { return inputs_[1]; }
1988
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001989 DECLARE_CONCRETE_INSTRUCTION(StoreNamedGeneric, "store-named-generic")
1990 DECLARE_HYDROGEN_ACCESSOR(StoreNamedGeneric)
1991
1992 virtual void PrintDataTo(StringStream* stream);
1993
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001994 Handle<Object> name() const { return hydrogen()->name(); }
1995 StrictModeFlag strict_mode_flag() { return hydrogen()->strict_mode_flag(); }
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00001996};
1997
1998
mvstanton@chromium.orge4ac3ef2012-11-12 14:53:34 +00001999class LStoreKeyed: public LTemplateInstruction<0, 3, 0> {
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00002000 public:
mvstanton@chromium.orge4ac3ef2012-11-12 14:53:34 +00002001 LStoreKeyed(LOperand* object, LOperand* key, LOperand* value) {
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00002002 inputs_[0] = object;
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00002003 inputs_[1] = key;
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00002004 inputs_[2] = value;
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00002005 }
2006
mvstanton@chromium.orge4ac3ef2012-11-12 14:53:34 +00002007 bool is_external() const { return hydrogen()->is_external(); }
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00002008 LOperand* elements() { return inputs_[0]; }
2009 LOperand* key() { return inputs_[1]; }
2010 LOperand* value() { return inputs_[2]; }
mvstanton@chromium.orge4ac3ef2012-11-12 14:53:34 +00002011 ElementsKind elements_kind() const {
2012 return hydrogen()->elements_kind();
2013 }
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00002014
mvstanton@chromium.orge4ac3ef2012-11-12 14:53:34 +00002015 DECLARE_CONCRETE_INSTRUCTION(StoreKeyed, "store-keyed")
2016 DECLARE_HYDROGEN_ACCESSOR(StoreKeyed)
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00002017
2018 virtual void PrintDataTo(StringStream* stream);
svenpanne@chromium.orgfb046332012-04-19 12:02:44 +00002019 bool NeedsCanonicalization() { return hydrogen()->NeedsCanonicalization(); }
mvstanton@chromium.orge4ac3ef2012-11-12 14:53:34 +00002020 uint32_t additional_index() const { return hydrogen()->index_offset(); }
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00002021};
2022
2023
2024class LStoreKeyedGeneric: public LTemplateInstruction<0, 3, 0> {
2025 public:
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00002026 LStoreKeyedGeneric(LOperand* obj, LOperand* key, LOperand* value) {
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00002027 inputs_[0] = obj;
2028 inputs_[1] = key;
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00002029 inputs_[2] = value;
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00002030 }
2031
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00002032 LOperand* object() { return inputs_[0]; }
2033 LOperand* key() { return inputs_[1]; }
2034 LOperand* value() { return inputs_[2]; }
2035
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00002036 DECLARE_CONCRETE_INSTRUCTION(StoreKeyedGeneric, "store-keyed-generic")
2037 DECLARE_HYDROGEN_ACCESSOR(StoreKeyedGeneric)
2038
2039 virtual void PrintDataTo(StringStream* stream);
2040
mstarzinger@chromium.org1b3afd12011-11-29 14:28:56 +00002041 StrictModeFlag strict_mode_flag() { return hydrogen()->strict_mode_flag(); }
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00002042};
2043
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00002044
2045class LTransitionElementsKind: public LTemplateInstruction<1, 1, 2> {
2046 public:
2047 LTransitionElementsKind(LOperand* object,
2048 LOperand* new_map_temp,
hpayer@chromium.org7c3372b2013-02-13 17:26:04 +00002049 LOperand* fixed_object_temp) {
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00002050 inputs_[0] = object;
2051 temps_[0] = new_map_temp;
hpayer@chromium.org7c3372b2013-02-13 17:26:04 +00002052 temps_[1] = fixed_object_temp;
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00002053 }
2054
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00002055 LOperand* object() { return inputs_[0]; }
2056 LOperand* new_map_temp() { return temps_[0]; }
2057 LOperand* temp() { return temps_[1]; }
2058
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00002059 DECLARE_CONCRETE_INSTRUCTION(TransitionElementsKind,
2060 "transition-elements-kind")
2061 DECLARE_HYDROGEN_ACCESSOR(TransitionElementsKind)
2062
2063 virtual void PrintDataTo(StringStream* stream);
2064
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00002065 Handle<Map> original_map() { return hydrogen()->original_map(); }
2066 Handle<Map> transitioned_map() { return hydrogen()->transitioned_map(); }
yangguo@chromium.org003650e2013-01-24 16:31:08 +00002067 ElementsKind from_kind() { return hydrogen()->from_kind(); }
2068 ElementsKind to_kind() { return hydrogen()->to_kind(); }
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00002069};
2070
2071
hpayer@chromium.org7c3372b2013-02-13 17:26:04 +00002072class LTrapAllocationMemento : public LTemplateInstruction<0, 1, 1> {
2073 public:
2074 LTrapAllocationMemento(LOperand* object,
2075 LOperand* temp) {
2076 inputs_[0] = object;
2077 temps_[0] = temp;
2078 }
2079
2080 LOperand* object() { return inputs_[0]; }
2081 LOperand* temp() { return temps_[0]; }
2082
2083 DECLARE_CONCRETE_INSTRUCTION(TrapAllocationMemento,
2084 "trap-allocation-memento")
2085};
2086
2087
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00002088class LStringAdd: public LTemplateInstruction<1, 2, 0> {
2089 public:
2090 LStringAdd(LOperand* left, LOperand* right) {
2091 inputs_[0] = left;
2092 inputs_[1] = right;
2093 }
2094
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00002095 LOperand* left() { return inputs_[0]; }
2096 LOperand* right() { return inputs_[1]; }
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00002097
2098 DECLARE_CONCRETE_INSTRUCTION(StringAdd, "string-add")
2099 DECLARE_HYDROGEN_ACCESSOR(StringAdd)
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00002100};
2101
2102
2103
2104class LStringCharCodeAt: public LTemplateInstruction<1, 2, 0> {
2105 public:
2106 LStringCharCodeAt(LOperand* string, LOperand* index) {
2107 inputs_[0] = string;
2108 inputs_[1] = index;
2109 }
2110
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00002111 LOperand* string() { return inputs_[0]; }
2112 LOperand* index() { return inputs_[1]; }
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00002113
2114 DECLARE_CONCRETE_INSTRUCTION(StringCharCodeAt, "string-char-code-at")
2115 DECLARE_HYDROGEN_ACCESSOR(StringCharCodeAt)
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00002116};
2117
2118
2119class LStringCharFromCode: public LTemplateInstruction<1, 1, 0> {
2120 public:
2121 explicit LStringCharFromCode(LOperand* char_code) {
2122 inputs_[0] = char_code;
2123 }
2124
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00002125 LOperand* char_code() { return inputs_[0]; }
2126
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00002127 DECLARE_CONCRETE_INSTRUCTION(StringCharFromCode, "string-char-from-code")
2128 DECLARE_HYDROGEN_ACCESSOR(StringCharFromCode)
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00002129};
2130
2131
2132class LStringLength: public LTemplateInstruction<1, 1, 0> {
2133 public:
2134 explicit LStringLength(LOperand* string) {
2135 inputs_[0] = string;
2136 }
2137
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00002138 LOperand* string() { return inputs_[0]; }
2139
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00002140 DECLARE_CONCRETE_INSTRUCTION(StringLength, "string-length")
2141 DECLARE_HYDROGEN_ACCESSOR(StringLength)
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00002142};
2143
2144
2145class LCheckFunction: public LTemplateInstruction<0, 1, 0> {
2146 public:
2147 explicit LCheckFunction(LOperand* value) {
2148 inputs_[0] = value;
2149 }
2150
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00002151 LOperand* value() { return inputs_[0]; }
ricow@chromium.org64e3a4b2011-12-13 08:07:27 +00002152
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00002153 DECLARE_CONCRETE_INSTRUCTION(CheckFunction, "check-function")
2154 DECLARE_HYDROGEN_ACCESSOR(CheckFunction)
2155};
2156
2157
2158class LCheckInstanceType: public LTemplateInstruction<0, 1, 0> {
2159 public:
2160 explicit LCheckInstanceType(LOperand* value) {
2161 inputs_[0] = value;
2162 }
2163
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00002164 LOperand* value() { return inputs_[0]; }
2165
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00002166 DECLARE_CONCRETE_INSTRUCTION(CheckInstanceType, "check-instance-type")
2167 DECLARE_HYDROGEN_ACCESSOR(CheckInstanceType)
2168};
2169
2170
jkummerow@chromium.org1456e702012-03-30 08:38:13 +00002171class LCheckMaps: public LTemplateInstruction<0, 1, 0> {
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00002172 public:
jkummerow@chromium.org1456e702012-03-30 08:38:13 +00002173 explicit LCheckMaps(LOperand* value) {
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00002174 inputs_[0] = value;
2175 }
2176
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00002177 LOperand* value() { return inputs_[0]; }
2178
jkummerow@chromium.org1456e702012-03-30 08:38:13 +00002179 DECLARE_CONCRETE_INSTRUCTION(CheckMaps, "check-maps")
2180 DECLARE_HYDROGEN_ACCESSOR(CheckMaps)
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00002181};
2182
2183
verwaest@chromium.orge4ee6de2012-11-06 12:13:00 +00002184class LCheckPrototypeMaps: public LTemplateInstruction<1, 0, 2> {
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00002185 public:
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00002186 LCheckPrototypeMaps(LOperand* temp, LOperand* temp2) {
2187 temps_[0] = temp;
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00002188 temps_[1] = temp2;
2189 }
2190
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00002191 LOperand* temp() { return temps_[0]; }
2192 LOperand* temp2() { return temps_[1]; }
2193
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00002194 DECLARE_CONCRETE_INSTRUCTION(CheckPrototypeMaps, "check-prototype-maps")
2195 DECLARE_HYDROGEN_ACCESSOR(CheckPrototypeMaps)
2196
yangguo@chromium.org003650e2013-01-24 16:31:08 +00002197 ZoneList<Handle<JSObject> >* prototypes() const {
2198 return hydrogen()->prototypes();
2199 }
2200 ZoneList<Handle<Map> >* maps() const { return hydrogen()->maps(); }
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00002201};
2202
2203
2204class LCheckSmi: public LTemplateInstruction<0, 1, 0> {
2205 public:
2206 explicit LCheckSmi(LOperand* value) {
2207 inputs_[0] = value;
2208 }
2209
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00002210 LOperand* value() { return inputs_[0]; }
2211
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00002212 DECLARE_CONCRETE_INSTRUCTION(CheckSmi, "check-smi")
2213};
2214
2215
2216class LCheckNonSmi: public LTemplateInstruction<0, 1, 0> {
2217 public:
2218 explicit LCheckNonSmi(LOperand* value) {
2219 inputs_[0] = value;
2220 }
2221
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00002222 LOperand* value() { return inputs_[0]; }
2223
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00002224 DECLARE_CONCRETE_INSTRUCTION(CheckNonSmi, "check-non-smi")
2225};
2226
2227
2228class LClampDToUint8: public LTemplateInstruction<1, 1, 1> {
2229 public:
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00002230 LClampDToUint8(LOperand* unclamped, LOperand* temp) {
2231 inputs_[0] = unclamped;
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00002232 temps_[0] = temp;
2233 }
2234
2235 LOperand* unclamped() { return inputs_[0]; }
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00002236 LOperand* temp() { return temps_[0]; }
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00002237
2238 DECLARE_CONCRETE_INSTRUCTION(ClampDToUint8, "clamp-d-to-uint8")
2239};
2240
2241
2242class LClampIToUint8: public LTemplateInstruction<1, 1, 0> {
2243 public:
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00002244 explicit LClampIToUint8(LOperand* unclamped) {
2245 inputs_[0] = unclamped;
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00002246 }
2247
2248 LOperand* unclamped() { return inputs_[0]; }
2249
2250 DECLARE_CONCRETE_INSTRUCTION(ClampIToUint8, "clamp-i-to-uint8")
2251};
2252
2253
2254class LClampTToUint8: public LTemplateInstruction<1, 1, 1> {
2255 public:
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00002256 LClampTToUint8(LOperand* unclamped, LOperand* temp) {
2257 inputs_[0] = unclamped;
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00002258 temps_[0] = temp;
2259 }
2260
2261 LOperand* unclamped() { return inputs_[0]; }
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00002262 LOperand* temp() { return temps_[0]; }
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00002263
2264 DECLARE_CONCRETE_INSTRUCTION(ClampTToUint8, "clamp-t-to-uint8")
2265};
2266
2267
hpayer@chromium.org7c3372b2013-02-13 17:26:04 +00002268class LAllocateObject: public LTemplateInstruction<1, 1, 2> {
ulan@chromium.org967e2702012-02-28 09:49:15 +00002269 public:
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00002270 LAllocateObject(LOperand* temp, LOperand* temp2) {
2271 temps_[0] = temp;
fschneider@chromium.org35814e52012-03-01 15:43:35 +00002272 temps_[1] = temp2;
2273 }
2274
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00002275 LOperand* temp() { return temps_[0]; }
2276 LOperand* temp2() { return temps_[1]; }
2277
ulan@chromium.org967e2702012-02-28 09:49:15 +00002278 DECLARE_CONCRETE_INSTRUCTION(AllocateObject, "allocate-object")
2279 DECLARE_HYDROGEN_ACCESSOR(AllocateObject)
2280};
2281
2282
hpayer@chromium.org7c3372b2013-02-13 17:26:04 +00002283class LAllocate: public LTemplateInstruction<1, 2, 2> {
2284 public:
2285 LAllocate(LOperand* size, LOperand* temp1, LOperand* temp2) {
2286 inputs_[1] = size;
2287 temps_[0] = temp1;
2288 temps_[1] = temp2;
2289 }
2290
2291 LOperand* size() { return inputs_[1]; }
2292 LOperand* temp1() { return temps_[0]; }
2293 LOperand* temp2() { return temps_[1]; }
2294
2295 DECLARE_CONCRETE_INSTRUCTION(Allocate, "allocate")
2296 DECLARE_HYDROGEN_ACCESSOR(Allocate)
2297};
2298
2299
jkummerow@chromium.orgf7a58842012-02-21 10:08:21 +00002300class LFastLiteral: public LTemplateInstruction<1, 0, 0> {
2301 public:
2302 DECLARE_CONCRETE_INSTRUCTION(FastLiteral, "fast-literal")
2303 DECLARE_HYDROGEN_ACCESSOR(FastLiteral)
2304};
2305
2306
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00002307class LArrayLiteral: public LTemplateInstruction<1, 0, 0> {
2308 public:
2309 DECLARE_CONCRETE_INSTRUCTION(ArrayLiteral, "array-literal")
2310 DECLARE_HYDROGEN_ACCESSOR(ArrayLiteral)
2311};
2312
2313
jkummerow@chromium.orgf7a58842012-02-21 10:08:21 +00002314class LObjectLiteral: public LTemplateInstruction<1, 0, 0> {
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00002315 public:
jkummerow@chromium.orgf7a58842012-02-21 10:08:21 +00002316 DECLARE_CONCRETE_INSTRUCTION(ObjectLiteral, "object-literal")
2317 DECLARE_HYDROGEN_ACCESSOR(ObjectLiteral)
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00002318};
2319
2320
2321class LRegExpLiteral: public LTemplateInstruction<1, 0, 0> {
2322 public:
2323 DECLARE_CONCRETE_INSTRUCTION(RegExpLiteral, "regexp-literal")
2324 DECLARE_HYDROGEN_ACCESSOR(RegExpLiteral)
2325};
2326
2327
2328class LFunctionLiteral: public LTemplateInstruction<1, 0, 0> {
2329 public:
2330 DECLARE_CONCRETE_INSTRUCTION(FunctionLiteral, "function-literal")
2331 DECLARE_HYDROGEN_ACCESSOR(FunctionLiteral)
2332
2333 Handle<SharedFunctionInfo> shared_info() { return hydrogen()->shared_info(); }
2334};
2335
2336
2337class LToFastProperties: public LTemplateInstruction<1, 1, 0> {
2338 public:
2339 explicit LToFastProperties(LOperand* value) {
2340 inputs_[0] = value;
2341 }
2342
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00002343 LOperand* value() { return inputs_[0]; }
2344
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00002345 DECLARE_CONCRETE_INSTRUCTION(ToFastProperties, "to-fast-properties")
2346 DECLARE_HYDROGEN_ACCESSOR(ToFastProperties)
2347};
2348
2349
2350class LTypeof: public LTemplateInstruction<1, 1, 0> {
2351 public:
2352 explicit LTypeof(LOperand* value) {
2353 inputs_[0] = value;
2354 }
2355
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00002356 LOperand* value() { return inputs_[0]; }
2357
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00002358 DECLARE_CONCRETE_INSTRUCTION(Typeof, "typeof")
2359};
2360
2361
2362class LTypeofIsAndBranch: public LControlInstruction<1, 0> {
2363 public:
2364 explicit LTypeofIsAndBranch(LOperand* value) {
2365 inputs_[0] = value;
2366 }
2367
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00002368 LOperand* value() { return inputs_[0]; }
2369
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00002370 DECLARE_CONCRETE_INSTRUCTION(TypeofIsAndBranch, "typeof-is-and-branch")
2371 DECLARE_HYDROGEN_ACCESSOR(TypeofIsAndBranch)
2372
2373 Handle<String> type_literal() { return hydrogen()->type_literal(); }
2374
2375 virtual void PrintDataTo(StringStream* stream);
2376};
2377
2378
2379class LIsConstructCallAndBranch: public LControlInstruction<0, 1> {
2380 public:
2381 explicit LIsConstructCallAndBranch(LOperand* temp) {
2382 temps_[0] = temp;
2383 }
2384
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00002385 LOperand* temp() { return temps_[0]; }
2386
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00002387 DECLARE_CONCRETE_INSTRUCTION(IsConstructCallAndBranch,
2388 "is-construct-call-and-branch")
2389};
2390
2391
2392class LDeleteProperty: public LTemplateInstruction<1, 2, 0> {
2393 public:
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00002394 LDeleteProperty(LOperand* object, LOperand* key) {
2395 inputs_[0] = object;
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00002396 inputs_[1] = key;
2397 }
2398
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00002399 LOperand* object() { return inputs_[0]; }
2400 LOperand* key() { return inputs_[1]; }
svenpanne@chromium.orgc859c4f2012-10-15 11:51:39 +00002401
2402 DECLARE_CONCRETE_INSTRUCTION(DeleteProperty, "delete-property")
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00002403};
2404
2405
2406class LOsrEntry: public LTemplateInstruction<0, 0, 0> {
2407 public:
2408 LOsrEntry();
2409
2410 DECLARE_CONCRETE_INSTRUCTION(OsrEntry, "osr-entry")
2411
2412 LOperand** SpilledRegisterArray() { return register_spills_; }
2413 LOperand** SpilledDoubleRegisterArray() { return double_register_spills_; }
2414
2415 void MarkSpilledRegister(int allocation_index, LOperand* spill_operand);
2416 void MarkSpilledDoubleRegister(int allocation_index,
2417 LOperand* spill_operand);
2418
2419 private:
2420 // Arrays of spill slot operands for registers with an assigned spill
2421 // slot, i.e., that must also be restored to the spill slot on OSR entry.
2422 // NULL if the register has no assigned spill slot. Indexed by allocation
2423 // index.
jkummerow@chromium.org59297c72013-01-09 16:32:23 +00002424 LOperand* register_spills_[Register::kMaxNumAllocatableRegisters];
2425 LOperand* double_register_spills_[
2426 DoubleRegister::kMaxNumAllocatableRegisters];
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00002427};
2428
2429
2430class LStackCheck: public LTemplateInstruction<0, 0, 0> {
2431 public:
2432 DECLARE_CONCRETE_INSTRUCTION(StackCheck, "stack-check")
2433 DECLARE_HYDROGEN_ACCESSOR(StackCheck)
2434
2435 Label* done_label() { return &done_label_; }
2436
2437 private:
2438 Label done_label_;
2439};
2440
2441
2442class LIn: public LTemplateInstruction<1, 2, 0> {
2443 public:
2444 LIn(LOperand* key, LOperand* object) {
2445 inputs_[0] = key;
2446 inputs_[1] = object;
2447 }
2448
2449 LOperand* key() { return inputs_[0]; }
2450 LOperand* object() { return inputs_[1]; }
2451
2452 DECLARE_CONCRETE_INSTRUCTION(In, "in")
2453};
2454
2455
ulan@chromium.org812308e2012-02-29 15:58:45 +00002456class LForInPrepareMap: public LTemplateInstruction<1, 1, 0> {
2457 public:
2458 explicit LForInPrepareMap(LOperand* object) {
2459 inputs_[0] = object;
2460 }
2461
2462 LOperand* object() { return inputs_[0]; }
2463
2464 DECLARE_CONCRETE_INSTRUCTION(ForInPrepareMap, "for-in-prepare-map")
2465};
2466
2467
rossberg@chromium.org89e18f52012-10-22 13:09:53 +00002468class LForInCacheArray: public LTemplateInstruction<1, 1, 0> {
ulan@chromium.org812308e2012-02-29 15:58:45 +00002469 public:
rossberg@chromium.org89e18f52012-10-22 13:09:53 +00002470 explicit LForInCacheArray(LOperand* map) {
ulan@chromium.org812308e2012-02-29 15:58:45 +00002471 inputs_[0] = map;
2472 }
2473
2474 LOperand* map() { return inputs_[0]; }
2475
2476 DECLARE_CONCRETE_INSTRUCTION(ForInCacheArray, "for-in-cache-array")
2477
2478 int idx() {
2479 return HForInCacheArray::cast(this->hydrogen_value())->idx();
2480 }
2481};
2482
2483
2484class LCheckMapValue: public LTemplateInstruction<0, 2, 0> {
2485 public:
2486 LCheckMapValue(LOperand* value, LOperand* map) {
2487 inputs_[0] = value;
2488 inputs_[1] = map;
2489 }
2490
2491 LOperand* value() { return inputs_[0]; }
2492 LOperand* map() { return inputs_[1]; }
2493
2494 DECLARE_CONCRETE_INSTRUCTION(CheckMapValue, "check-map-value")
2495};
2496
2497
2498class LLoadFieldByIndex: public LTemplateInstruction<1, 2, 0> {
2499 public:
2500 LLoadFieldByIndex(LOperand* object, LOperand* index) {
2501 inputs_[0] = object;
2502 inputs_[1] = index;
2503 }
2504
2505 LOperand* object() { return inputs_[0]; }
2506 LOperand* index() { return inputs_[1]; }
2507
2508 DECLARE_CONCRETE_INSTRUCTION(LoadFieldByIndex, "load-field-by-index")
2509};
2510
2511
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00002512class LChunkBuilder;
jkummerow@chromium.org28583c92012-07-16 11:31:55 +00002513class LPlatformChunk: public LChunk {
lrn@chromium.org7516f052011-03-30 08:52:27 +00002514 public:
jkummerow@chromium.org28583c92012-07-16 11:31:55 +00002515 LPlatformChunk(CompilationInfo* info, HGraph* graph)
2516 : LChunk(info, graph) { }
lrn@chromium.org7516f052011-03-30 08:52:27 +00002517
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00002518 int GetNextSpillIndex(bool is_double);
2519 LOperand* GetNextSpillSlot(bool is_double);
lrn@chromium.org7516f052011-03-30 08:52:27 +00002520};
2521
2522
2523class LChunkBuilder BASE_EMBEDDED {
2524 public:
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00002525 LChunkBuilder(CompilationInfo* info, HGraph* graph, LAllocator* allocator)
2526 : chunk_(NULL),
2527 info_(info),
2528 graph_(graph),
mmassi@chromium.org7028c052012-06-13 11:51:58 +00002529 zone_(graph->zone()),
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00002530 status_(UNUSED),
2531 current_instruction_(NULL),
2532 current_block_(NULL),
2533 next_block_(NULL),
2534 argument_count_(0),
2535 allocator_(allocator),
2536 position_(RelocInfo::kNoPosition),
2537 instruction_pending_deoptimization_environment_(NULL),
mstarzinger@chromium.org471f2f12012-08-10 14:46:33 +00002538 pending_deoptimization_ast_id_(BailoutId::None()) { }
lrn@chromium.org7516f052011-03-30 08:52:27 +00002539
2540 // Build the sequence for the graph.
jkummerow@chromium.org28583c92012-07-16 11:31:55 +00002541 LPlatformChunk* Build();
lrn@chromium.org7516f052011-03-30 08:52:27 +00002542
2543 // Declare methods that deal with the individual node types.
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00002544#define DECLARE_DO(type) LInstruction* Do##type(H##type* node);
lrn@chromium.org7516f052011-03-30 08:52:27 +00002545 HYDROGEN_CONCRETE_INSTRUCTION_LIST(DECLARE_DO)
2546#undef DECLARE_DO
2547
jkummerow@chromium.org59297c72013-01-09 16:32:23 +00002548 LInstruction* DoMultiplyAdd(HMul* mul, HValue* addend);
2549
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00002550 private:
2551 enum Status {
2552 UNUSED,
2553 BUILDING,
2554 DONE,
2555 ABORTED
2556 };
2557
jkummerow@chromium.org28583c92012-07-16 11:31:55 +00002558 LPlatformChunk* chunk() const { return chunk_; }
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00002559 CompilationInfo* info() const { return info_; }
2560 HGraph* graph() const { return graph_; }
ulan@chromium.org812308e2012-02-29 15:58:45 +00002561 Zone* zone() const { return zone_; }
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00002562
2563 bool is_unused() const { return status_ == UNUSED; }
2564 bool is_building() const { return status_ == BUILDING; }
2565 bool is_done() const { return status_ == DONE; }
2566 bool is_aborted() const { return status_ == ABORTED; }
2567
yangguo@chromium.org46839fb2012-08-28 09:06:19 +00002568 void Abort(const char* reason);
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00002569
2570 // Methods for getting operands for Use / Define / Temp.
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00002571 LUnallocated* ToUnallocated(Register reg);
2572 LUnallocated* ToUnallocated(DoubleRegister reg);
2573
2574 // Methods for setting up define-use relationships.
2575 MUST_USE_RESULT LOperand* Use(HValue* value, LUnallocated* operand);
2576 MUST_USE_RESULT LOperand* UseFixed(HValue* value, Register fixed_register);
2577 MUST_USE_RESULT LOperand* UseFixedDouble(HValue* value,
2578 DoubleRegister fixed_register);
2579
2580 // A value that is guaranteed to be allocated to a register.
2581 // Operand created by UseRegister is guaranteed to be live until the end of
2582 // instruction. This means that register allocator will not reuse it's
2583 // register for any other operand inside instruction.
2584 // Operand created by UseRegisterAtStart is guaranteed to be live only at
2585 // instruction start. Register allocator is free to assign the same register
2586 // to some other operand used inside instruction (i.e. temporary or
2587 // output).
2588 MUST_USE_RESULT LOperand* UseRegister(HValue* value);
2589 MUST_USE_RESULT LOperand* UseRegisterAtStart(HValue* value);
2590
2591 // An input operand in a register that may be trashed.
2592 MUST_USE_RESULT LOperand* UseTempRegister(HValue* value);
2593
2594 // An input operand in a register or stack slot.
2595 MUST_USE_RESULT LOperand* Use(HValue* value);
2596 MUST_USE_RESULT LOperand* UseAtStart(HValue* value);
2597
2598 // An input operand in a register, stack slot or a constant operand.
2599 MUST_USE_RESULT LOperand* UseOrConstant(HValue* value);
2600 MUST_USE_RESULT LOperand* UseOrConstantAtStart(HValue* value);
2601
2602 // An input operand in a register or a constant operand.
2603 MUST_USE_RESULT LOperand* UseRegisterOrConstant(HValue* value);
2604 MUST_USE_RESULT LOperand* UseRegisterOrConstantAtStart(HValue* value);
2605
2606 // An input operand in register, stack slot or a constant operand.
2607 // Will not be moved to a register even if one is freely available.
2608 MUST_USE_RESULT LOperand* UseAny(HValue* value);
2609
2610 // Temporary operand that must be in a register.
2611 MUST_USE_RESULT LUnallocated* TempRegister();
2612 MUST_USE_RESULT LOperand* FixedTemp(Register reg);
2613 MUST_USE_RESULT LOperand* FixedTemp(DoubleRegister reg);
2614
2615 // Methods for setting up define-use relationships.
2616 // Return the same instruction that they are passed.
2617 template<int I, int T>
2618 LInstruction* Define(LTemplateInstruction<1, I, T>* instr,
2619 LUnallocated* result);
2620 template<int I, int T>
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00002621 LInstruction* DefineAsRegister(LTemplateInstruction<1, I, T>* instr);
2622 template<int I, int T>
2623 LInstruction* DefineAsSpilled(LTemplateInstruction<1, I, T>* instr,
2624 int index);
2625 template<int I, int T>
2626 LInstruction* DefineSameAsFirst(LTemplateInstruction<1, I, T>* instr);
2627 template<int I, int T>
2628 LInstruction* DefineFixed(LTemplateInstruction<1, I, T>* instr,
2629 Register reg);
2630 template<int I, int T>
2631 LInstruction* DefineFixedDouble(LTemplateInstruction<1, I, T>* instr,
2632 DoubleRegister reg);
2633 LInstruction* AssignEnvironment(LInstruction* instr);
2634 LInstruction* AssignPointerMap(LInstruction* instr);
2635
2636 enum CanDeoptimize { CAN_DEOPTIMIZE_EAGERLY, CANNOT_DEOPTIMIZE_EAGERLY };
2637
2638 // By default we assume that instruction sequences generated for calls
2639 // cannot deoptimize eagerly and we do not attach environment to this
2640 // instruction.
2641 LInstruction* MarkAsCall(
2642 LInstruction* instr,
2643 HInstruction* hinstr,
2644 CanDeoptimize can_deoptimize = CANNOT_DEOPTIMIZE_EAGERLY);
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00002645
2646 LEnvironment* CreateEnvironment(HEnvironment* hydrogen_env,
2647 int* argument_index_accumulator);
2648
2649 void VisitInstruction(HInstruction* current);
2650
2651 void DoBasicBlock(HBasicBlock* block, HBasicBlock* next_block);
2652 LInstruction* DoBit(Token::Value op, HBitwiseBinaryOperation* instr);
2653 LInstruction* DoShift(Token::Value op, HBitwiseBinaryOperation* instr);
2654 LInstruction* DoArithmeticD(Token::Value op,
2655 HArithmeticBinaryOperation* instr);
2656 LInstruction* DoArithmeticT(Token::Value op,
2657 HArithmeticBinaryOperation* instr);
2658
jkummerow@chromium.org28583c92012-07-16 11:31:55 +00002659 LPlatformChunk* chunk_;
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00002660 CompilationInfo* info_;
2661 HGraph* const graph_;
ulan@chromium.org812308e2012-02-29 15:58:45 +00002662 Zone* zone_;
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00002663 Status status_;
2664 HInstruction* current_instruction_;
2665 HBasicBlock* current_block_;
2666 HBasicBlock* next_block_;
2667 int argument_count_;
2668 LAllocator* allocator_;
2669 int position_;
2670 LInstruction* instruction_pending_deoptimization_environment_;
mstarzinger@chromium.org471f2f12012-08-10 14:46:33 +00002671 BailoutId pending_deoptimization_ast_id_;
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00002672
lrn@chromium.org7516f052011-03-30 08:52:27 +00002673 DISALLOW_COPY_AND_ASSIGN(LChunkBuilder);
2674};
2675
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00002676#undef DECLARE_HYDROGEN_ACCESSOR
2677#undef DECLARE_CONCRETE_INSTRUCTION
lrn@chromium.org7516f052011-03-30 08:52:27 +00002678
2679} } // namespace v8::internal
2680
2681#endif // V8_MIPS_LITHIUM_MIPS_H_