blob: 9a07c6f2a15da905358bd07d88b514ba9cd53684 [file] [log] [blame]
kmillikin@chromium.orgd2c22f02011-01-10 08:15:37 +00001// Copyright 2011 the V8 project authors. All rights reserved.
kasperl@chromium.orga5551262010-12-07 12:49:48 +00002// Redistribution and use in source and binary forms, with or without
3// modification, are permitted provided that the following conditions are
4// met:
5//
6// * Redistributions of source code must retain the above copyright
7// notice, this list of conditions and the following disclaimer.
8// * Redistributions in binary form must reproduce the above
9// copyright notice, this list of conditions and the following
10// disclaimer in the documentation and/or other materials provided
11// with the distribution.
12// * Neither the name of Google Inc. nor the names of its
13// contributors may be used to endorse or promote products derived
14// from this software without specific prior written permission.
15//
16// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
28#ifndef V8_IA32_LITHIUM_IA32_H_
29#define V8_IA32_LITHIUM_IA32_H_
30
31#include "hydrogen.h"
32#include "lithium-allocator.h"
kmillikin@chromium.orgd2c22f02011-01-10 08:15:37 +000033#include "lithium.h"
kasperl@chromium.orga5551262010-12-07 12:49:48 +000034#include "safepoint-table.h"
35
36namespace v8 {
37namespace internal {
38
39// Forward declarations.
40class LCodeGen;
kasperl@chromium.orga5551262010-12-07 12:49:48 +000041
kasperl@chromium.orga5551262010-12-07 12:49:48 +000042#define LITHIUM_ALL_INSTRUCTION_LIST(V) \
erik.corry@gmail.com0511e242011-01-19 11:11:08 +000043 V(ControlInstruction) \
kasperl@chromium.orga5551262010-12-07 12:49:48 +000044 V(Call) \
kasperl@chromium.orga5551262010-12-07 12:49:48 +000045 LITHIUM_CONCRETE_INSTRUCTION_LIST(V)
46
47
48#define LITHIUM_CONCRETE_INSTRUCTION_LIST(V) \
49 V(AccessArgumentsAt) \
50 V(AddI) \
51 V(ApplyArguments) \
52 V(ArgumentsElements) \
53 V(ArgumentsLength) \
54 V(ArithmeticD) \
55 V(ArithmeticT) \
kasperl@chromium.orga5551262010-12-07 12:49:48 +000056 V(ArrayLiteral) \
57 V(BitI) \
58 V(BitNotI) \
59 V(BoundsCheck) \
60 V(Branch) \
61 V(CallConstantFunction) \
62 V(CallFunction) \
63 V(CallGlobal) \
64 V(CallKeyed) \
65 V(CallKnownGlobal) \
66 V(CallNamed) \
67 V(CallNew) \
68 V(CallRuntime) \
69 V(CallStub) \
70 V(CheckFunction) \
71 V(CheckInstanceType) \
72 V(CheckMap) \
73 V(CheckPrototypeMaps) \
74 V(CheckSmi) \
ricow@chromium.org83aa5492011-02-07 12:42:56 +000075 V(ClassOfTest) \
76 V(ClassOfTestAndBranch) \
kasperl@chromium.orga5551262010-12-07 12:49:48 +000077 V(CmpID) \
78 V(CmpIDAndBranch) \
79 V(CmpJSObjectEq) \
80 V(CmpJSObjectEqAndBranch) \
81 V(CmpMapAndBranch) \
82 V(CmpT) \
83 V(CmpTAndBranch) \
84 V(ConstantD) \
85 V(ConstantI) \
86 V(ConstantT) \
ricow@chromium.org83aa5492011-02-07 12:42:56 +000087 V(Context) \
kasperl@chromium.orga5551262010-12-07 12:49:48 +000088 V(DeleteProperty) \
89 V(Deoptimize) \
90 V(DivI) \
91 V(DoubleToI) \
danno@chromium.org4d3fe4e2011-03-10 10:14:28 +000092 V(ExternalArrayLength) \
ricow@chromium.org83aa5492011-02-07 12:42:56 +000093 V(FixedArrayLength) \
kasperl@chromium.orga5551262010-12-07 12:49:48 +000094 V(FunctionLiteral) \
95 V(Gap) \
karlklose@chromium.org8f806e82011-03-07 14:06:08 +000096 V(GetCachedArrayIndex) \
kasperl@chromium.orga5551262010-12-07 12:49:48 +000097 V(GlobalObject) \
98 V(GlobalReceiver) \
99 V(Goto) \
ricow@chromium.org83aa5492011-02-07 12:42:56 +0000100 V(HasCachedArrayIndex) \
101 V(HasCachedArrayIndexAndBranch) \
102 V(HasInstanceType) \
103 V(HasInstanceTypeAndBranch) \
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000104 V(InstanceOf) \
105 V(InstanceOfAndBranch) \
kmillikin@chromium.orgd2c22f02011-01-10 08:15:37 +0000106 V(InstanceOfKnownGlobal) \
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000107 V(Integer32ToDouble) \
108 V(IsNull) \
109 V(IsNullAndBranch) \
ager@chromium.org5f0c45f2010-12-17 08:51:21 +0000110 V(IsObject) \
111 V(IsObjectAndBranch) \
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000112 V(IsSmi) \
113 V(IsSmiAndBranch) \
erik.corry@gmail.comd91075f2011-02-10 07:45:38 +0000114 V(IsConstructCall) \
115 V(IsConstructCallAndBranch) \
fschneider@chromium.org9e3e0b62011-01-03 10:16:46 +0000116 V(JSArrayLength) \
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000117 V(Label) \
118 V(LazyBailout) \
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000119 V(LoadContextSlot) \
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000120 V(LoadElements) \
danno@chromium.org4d3fe4e2011-03-10 10:14:28 +0000121 V(LoadExternalArrayPointer) \
ricow@chromium.org83aa5492011-02-07 12:42:56 +0000122 V(LoadFunctionPrototype) \
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000123 V(LoadGlobal) \
124 V(LoadKeyedFastElement) \
125 V(LoadKeyedGeneric) \
126 V(LoadNamedField) \
127 V(LoadNamedGeneric) \
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +0000128 V(LoadPixelArrayElement) \
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000129 V(ModI) \
130 V(MulI) \
131 V(NumberTagD) \
132 V(NumberTagI) \
133 V(NumberUntagD) \
134 V(ObjectLiteral) \
135 V(OsrEntry) \
ricow@chromium.org83aa5492011-02-07 12:42:56 +0000136 V(OuterContext) \
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000137 V(Parameter) \
ager@chromium.org5f0c45f2010-12-17 08:51:21 +0000138 V(Power) \
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000139 V(PushArgument) \
140 V(RegExpLiteral) \
141 V(Return) \
142 V(ShiftI) \
143 V(SmiTag) \
144 V(SmiUntag) \
145 V(StackCheck) \
ricow@chromium.org83aa5492011-02-07 12:42:56 +0000146 V(StoreContextSlot) \
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000147 V(StoreGlobal) \
148 V(StoreKeyedFastElement) \
149 V(StoreKeyedGeneric) \
150 V(StoreNamedField) \
151 V(StoreNamedGeneric) \
fschneider@chromium.org3a5fd782011-02-24 10:10:44 +0000152 V(StorePixelArrayElement) \
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +0000153 V(StringCharCodeAt) \
whesse@chromium.orgb08986c2011-03-14 16:13:42 +0000154 V(StringCharFromCode) \
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +0000155 V(StringLength) \
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000156 V(SubI) \
157 V(TaggedToI) \
158 V(Throw) \
159 V(Typeof) \
160 V(TypeofIs) \
161 V(TypeofIsAndBranch) \
162 V(UnaryMathOperation) \
163 V(UnknownOSRValue) \
164 V(ValueOf)
165
166
167#define DECLARE_INSTRUCTION(type) \
168 virtual bool Is##type() const { return true; } \
169 static L##type* cast(LInstruction* instr) { \
170 ASSERT(instr->Is##type()); \
171 return reinterpret_cast<L##type*>(instr); \
172 }
173
174
175#define DECLARE_CONCRETE_INSTRUCTION(type, mnemonic) \
176 virtual void CompileToNative(LCodeGen* generator); \
177 virtual const char* Mnemonic() const { return mnemonic; } \
178 DECLARE_INSTRUCTION(type)
179
180
181#define DECLARE_HYDROGEN_ACCESSOR(type) \
182 H##type* hydrogen() const { \
183 return H##type::cast(hydrogen_value()); \
184 }
185
186
187class LInstruction: public ZoneObject {
188 public:
189 LInstruction()
ricow@chromium.org83aa5492011-02-07 12:42:56 +0000190 : environment_(NULL),
191 hydrogen_value_(NULL),
192 is_call_(false),
193 is_save_doubles_(false) { }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000194 virtual ~LInstruction() { }
195
196 virtual void CompileToNative(LCodeGen* generator) = 0;
197 virtual const char* Mnemonic() const = 0;
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000198 virtual void PrintTo(StringStream* stream);
199 virtual void PrintDataTo(StringStream* stream) = 0;
200 virtual void PrintOutputOperandTo(StringStream* stream) = 0;
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000201
202 // Declare virtual type testers.
203#define DECLARE_DO(type) virtual bool Is##type() const { return false; }
204 LITHIUM_ALL_INSTRUCTION_LIST(DECLARE_DO)
205#undef DECLARE_DO
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000206
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000207 virtual bool IsControl() const { return false; }
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000208 virtual void SetBranchTargets(int true_block_id, int false_block_id) { }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000209
ricow@chromium.org83aa5492011-02-07 12:42:56 +0000210 void set_environment(LEnvironment* env) { environment_ = env; }
211 LEnvironment* environment() const { return environment_; }
212 bool HasEnvironment() const { return environment_ != NULL; }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000213
214 void set_pointer_map(LPointerMap* p) { pointer_map_.set(p); }
215 LPointerMap* pointer_map() const { return pointer_map_.get(); }
216 bool HasPointerMap() const { return pointer_map_.is_set(); }
217
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000218
219 void set_hydrogen_value(HValue* value) { hydrogen_value_ = value; }
220 HValue* hydrogen_value() const { return hydrogen_value_; }
221
fschneider@chromium.org1df6b472011-01-26 08:23:03 +0000222 void set_deoptimization_environment(LEnvironment* env) {
223 deoptimization_environment_.set(env);
224 }
225 LEnvironment* deoptimization_environment() const {
226 return deoptimization_environment_.get();
227 }
228 bool HasDeoptimizationEnvironment() const {
229 return deoptimization_environment_.is_set();
230 }
231
ricow@chromium.org83aa5492011-02-07 12:42:56 +0000232 void MarkAsCall() { is_call_ = true; }
233 void MarkAsSaveDoubles() { is_save_doubles_ = true; }
234
235 // Interface to the register allocator and iterators.
236 bool IsMarkedAsCall() const { return is_call_; }
237 bool IsMarkedAsSaveDoubles() const { return is_save_doubles_; }
238
239 virtual bool HasResult() const = 0;
240 virtual LOperand* result() = 0;
241
242 virtual int InputCount() = 0;
243 virtual LOperand* InputAt(int i) = 0;
244 virtual int TempCount() = 0;
245 virtual LOperand* TempAt(int i) = 0;
246
247 LOperand* FirstInput() { return InputAt(0); }
248 LOperand* Output() { return HasResult() ? result() : NULL; }
249
250#ifdef DEBUG
251 void VerifyCall();
252#endif
253
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000254 private:
ricow@chromium.org83aa5492011-02-07 12:42:56 +0000255 LEnvironment* environment_;
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000256 SetOncePointer<LPointerMap> pointer_map_;
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000257 HValue* hydrogen_value_;
fschneider@chromium.org1df6b472011-01-26 08:23:03 +0000258 SetOncePointer<LEnvironment> deoptimization_environment_;
ricow@chromium.org83aa5492011-02-07 12:42:56 +0000259 bool is_call_;
260 bool is_save_doubles_;
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000261};
262
263
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +0000264template<typename ElementType, int NumElements>
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000265class OperandContainer {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000266 public:
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000267 OperandContainer() {
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +0000268 for (int i = 0; i < NumElements; i++) elems_[i] = NULL;
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000269 }
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +0000270 int length() { return NumElements; }
271 ElementType& operator[](int i) {
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000272 ASSERT(i < length());
273 return elems_[i];
274 }
275 void PrintOperandsTo(StringStream* stream);
276
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000277 private:
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +0000278 ElementType elems_[NumElements];
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000279};
280
281
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +0000282template<typename ElementType>
283class OperandContainer<ElementType, 0> {
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000284 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000285 int length() { return 0; }
286 void PrintOperandsTo(StringStream* stream) { }
ricow@chromium.org83aa5492011-02-07 12:42:56 +0000287 ElementType& operator[](int i) {
288 UNREACHABLE();
289 static ElementType t = 0;
290 return t;
291 }
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000292};
293
294
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +0000295// R = number of result operands (0 or 1).
296// I = number of input operands.
297// T = number of temporary operands.
298template<int R, int I, int T>
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000299class LTemplateInstruction: public LInstruction {
300 public:
301 // Allow 0 or 1 output operands.
302 STATIC_ASSERT(R == 0 || R == 1);
303 virtual bool HasResult() const { return R != 0; }
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000304 void set_result(LOperand* operand) { results_[0] = operand; }
305 LOperand* result() { return results_[0]; }
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000306
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000307 int InputCount() { return I; }
308 LOperand* InputAt(int i) { return inputs_[i]; }
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000309
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000310 int TempCount() { return T; }
311 LOperand* TempAt(int i) { return temps_[i]; }
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000312
313 virtual void PrintDataTo(StringStream* stream);
314 virtual void PrintOutputOperandTo(StringStream* stream);
315
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000316 protected:
317 OperandContainer<LOperand*, R> results_;
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000318 OperandContainer<LOperand*, I> inputs_;
319 OperandContainer<LOperand*, T> temps_;
320};
321
322
323class LGap: public LTemplateInstruction<0, 0, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000324 public:
325 explicit LGap(HBasicBlock* block)
326 : block_(block) {
327 parallel_moves_[BEFORE] = NULL;
328 parallel_moves_[START] = NULL;
329 parallel_moves_[END] = NULL;
330 parallel_moves_[AFTER] = NULL;
331 }
332
333 DECLARE_CONCRETE_INSTRUCTION(Gap, "gap")
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000334 virtual void PrintDataTo(StringStream* stream);
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000335
336 bool IsRedundant() const;
337
338 HBasicBlock* block() const { return block_; }
339
340 enum InnerPosition {
341 BEFORE,
342 START,
343 END,
344 AFTER,
345 FIRST_INNER_POSITION = BEFORE,
346 LAST_INNER_POSITION = AFTER
347 };
348
349 LParallelMove* GetOrCreateParallelMove(InnerPosition pos) {
350 if (parallel_moves_[pos] == NULL) parallel_moves_[pos] = new LParallelMove;
351 return parallel_moves_[pos];
352 }
353
354 LParallelMove* GetParallelMove(InnerPosition pos) {
355 return parallel_moves_[pos];
356 }
357
358 private:
359 LParallelMove* parallel_moves_[LAST_INNER_POSITION + 1];
360 HBasicBlock* block_;
361};
362
363
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000364class LGoto: public LTemplateInstruction<0, 0, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000365 public:
366 LGoto(int block_id, bool include_stack_check = false)
367 : block_id_(block_id), include_stack_check_(include_stack_check) { }
368
369 DECLARE_CONCRETE_INSTRUCTION(Goto, "goto")
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000370 virtual void PrintDataTo(StringStream* stream);
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000371 virtual bool IsControl() const { return true; }
372
373 int block_id() const { return block_id_; }
374 bool include_stack_check() const { return include_stack_check_; }
375
376 private:
377 int block_id_;
378 bool include_stack_check_;
379};
380
381
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000382class LLazyBailout: public LTemplateInstruction<0, 0, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000383 public:
384 LLazyBailout() : gap_instructions_size_(0) { }
385
386 DECLARE_CONCRETE_INSTRUCTION(LazyBailout, "lazy-bailout")
387
388 void set_gap_instructions_size(int gap_instructions_size) {
389 gap_instructions_size_ = gap_instructions_size;
390 }
391 int gap_instructions_size() { return gap_instructions_size_; }
392
393 private:
394 int gap_instructions_size_;
395};
396
397
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000398class LDeoptimize: public LTemplateInstruction<0, 0, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000399 public:
400 DECLARE_CONCRETE_INSTRUCTION(Deoptimize, "deoptimize")
401};
402
403
404class LLabel: public LGap {
405 public:
406 explicit LLabel(HBasicBlock* block)
407 : LGap(block), replacement_(NULL) { }
408
409 DECLARE_CONCRETE_INSTRUCTION(Label, "label")
410
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000411 virtual void PrintDataTo(StringStream* stream);
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000412
413 int block_id() const { return block()->block_id(); }
414 bool is_loop_header() const { return block()->IsLoopHeader(); }
415 Label* label() { return &label_; }
416 LLabel* replacement() const { return replacement_; }
417 void set_replacement(LLabel* label) { replacement_ = label; }
418 bool HasReplacement() const { return replacement_ != NULL; }
419
420 private:
421 Label label_;
422 LLabel* replacement_;
423};
424
425
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000426class LParameter: public LTemplateInstruction<1, 0, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000427 public:
428 DECLARE_CONCRETE_INSTRUCTION(Parameter, "parameter")
429};
430
431
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +0000432class LCallStub: public LTemplateInstruction<1, 1, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000433 public:
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +0000434 explicit LCallStub(LOperand* context) {
435 inputs_[0] = context;
436 }
437
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000438 DECLARE_CONCRETE_INSTRUCTION(CallStub, "call-stub")
439 DECLARE_HYDROGEN_ACCESSOR(CallStub)
440
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +0000441 LOperand* context() { return inputs_[0]; }
442
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000443 TranscendentalCache::Type transcendental_type() {
444 return hydrogen()->transcendental_type();
445 }
446};
447
448
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000449class LUnknownOSRValue: public LTemplateInstruction<1, 0, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000450 public:
451 DECLARE_CONCRETE_INSTRUCTION(UnknownOSRValue, "unknown-osr-value")
452};
453
454
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +0000455template<int I, int T>
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000456class LControlInstruction: public LTemplateInstruction<0, I, T> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000457 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000458 DECLARE_INSTRUCTION(ControlInstruction)
459 virtual bool IsControl() const { return true; }
460
461 int true_block_id() const { return true_block_id_; }
462 int false_block_id() const { return false_block_id_; }
463 void SetBranchTargets(int true_block_id, int false_block_id) {
464 true_block_id_ = true_block_id;
465 false_block_id_ = false_block_id;
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000466 }
467
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000468 private:
469 int true_block_id_;
470 int false_block_id_;
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000471};
472
473
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +0000474class LApplyArguments: public LTemplateInstruction<1, 4, 1> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000475 public:
476 LApplyArguments(LOperand* function,
477 LOperand* receiver,
478 LOperand* length,
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +0000479 LOperand* elements,
480 LOperand* temp) {
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000481 inputs_[0] = function;
482 inputs_[1] = receiver;
483 inputs_[2] = length;
484 inputs_[3] = elements;
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +0000485 temps_[0] = temp;
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000486 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000487
488 DECLARE_CONCRETE_INSTRUCTION(ApplyArguments, "apply-arguments")
489
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000490 LOperand* function() { return inputs_[0]; }
491 LOperand* receiver() { return inputs_[1]; }
492 LOperand* length() { return inputs_[2]; }
493 LOperand* elements() { return inputs_[3]; }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000494};
495
496
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000497class LAccessArgumentsAt: public LTemplateInstruction<1, 3, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000498 public:
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000499 LAccessArgumentsAt(LOperand* arguments, LOperand* length, LOperand* index) {
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000500 inputs_[0] = arguments;
501 inputs_[1] = length;
502 inputs_[2] = index;
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000503 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000504
505 DECLARE_CONCRETE_INSTRUCTION(AccessArgumentsAt, "access-arguments-at")
506
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000507 LOperand* arguments() { return inputs_[0]; }
508 LOperand* length() { return inputs_[1]; }
509 LOperand* index() { return inputs_[2]; }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000510
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000511 virtual void PrintDataTo(StringStream* stream);
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000512};
513
514
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +0000515class LArgumentsLength: public LTemplateInstruction<1, 1, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000516 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000517 explicit LArgumentsLength(LOperand* elements) {
518 inputs_[0] = elements;
519 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000520
521 DECLARE_CONCRETE_INSTRUCTION(ArgumentsLength, "arguments-length")
522};
523
524
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000525class LArgumentsElements: public LTemplateInstruction<1, 0, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000526 public:
527 LArgumentsElements() { }
528
529 DECLARE_CONCRETE_INSTRUCTION(ArgumentsElements, "arguments-elements")
530};
531
532
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000533class LModI: public LTemplateInstruction<1, 2, 1> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000534 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000535 LModI(LOperand* left, LOperand* right, LOperand* temp) {
536 inputs_[0] = left;
537 inputs_[1] = right;
538 temps_[0] = temp;
539 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000540
541 DECLARE_CONCRETE_INSTRUCTION(ModI, "mod-i")
542 DECLARE_HYDROGEN_ACCESSOR(Mod)
543};
544
545
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000546class LDivI: public LTemplateInstruction<1, 2, 1> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000547 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000548 LDivI(LOperand* left, LOperand* right, LOperand* temp) {
549 inputs_[0] = left;
550 inputs_[1] = right;
551 temps_[0] = temp;
552 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000553
554 DECLARE_CONCRETE_INSTRUCTION(DivI, "div-i")
555 DECLARE_HYDROGEN_ACCESSOR(Div)
556};
557
558
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000559class LMulI: public LTemplateInstruction<1, 2, 1> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000560 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000561 LMulI(LOperand* left, LOperand* right, LOperand* temp) {
562 inputs_[0] = left;
563 inputs_[1] = right;
564 temps_[0] = temp;
565 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000566
567 DECLARE_CONCRETE_INSTRUCTION(MulI, "mul-i")
568 DECLARE_HYDROGEN_ACCESSOR(Mul)
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000569};
570
571
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +0000572class LCmpID: public LTemplateInstruction<1, 2, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000573 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000574 LCmpID(LOperand* left, LOperand* right) {
575 inputs_[0] = left;
576 inputs_[1] = right;
577 }
578
579 DECLARE_CONCRETE_INSTRUCTION(CmpID, "cmp-id")
580 DECLARE_HYDROGEN_ACCESSOR(Compare)
581
582 Token::Value op() const { return hydrogen()->token(); }
583 bool is_double() const {
584 return hydrogen()->GetInputRepresentation().IsDouble();
585 }
586};
587
588
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +0000589class LCmpIDAndBranch: public LControlInstruction<2, 0> {
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000590 public:
591 LCmpIDAndBranch(LOperand* left, LOperand* right) {
592 inputs_[0] = left;
593 inputs_[1] = right;
594 }
595
596 DECLARE_CONCRETE_INSTRUCTION(CmpIDAndBranch, "cmp-id-and-branch")
597 DECLARE_HYDROGEN_ACCESSOR(Compare)
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000598
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000599 Token::Value op() const { return hydrogen()->token(); }
600 bool is_double() const {
601 return hydrogen()->GetInputRepresentation().IsDouble();
602 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000603
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000604 virtual void PrintDataTo(StringStream* stream);
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000605};
606
607
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +0000608class LUnaryMathOperation: public LTemplateInstruction<1, 1, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000609 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000610 explicit LUnaryMathOperation(LOperand* value) {
611 inputs_[0] = value;
612 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000613
614 DECLARE_CONCRETE_INSTRUCTION(UnaryMathOperation, "unary-math-operation")
615 DECLARE_HYDROGEN_ACCESSOR(UnaryMathOperation)
616
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000617 virtual void PrintDataTo(StringStream* stream);
ager@chromium.org5f0c45f2010-12-17 08:51:21 +0000618 BuiltinFunctionId op() const { return hydrogen()->op(); }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000619};
620
621
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +0000622class LCmpJSObjectEq: public LTemplateInstruction<1, 2, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000623 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000624 LCmpJSObjectEq(LOperand* left, LOperand* right) {
625 inputs_[0] = left;
626 inputs_[1] = right;
627 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000628
629 DECLARE_CONCRETE_INSTRUCTION(CmpJSObjectEq, "cmp-jsobject-eq")
630};
631
632
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +0000633class LCmpJSObjectEqAndBranch: public LControlInstruction<2, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000634 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000635 LCmpJSObjectEqAndBranch(LOperand* left, LOperand* right) {
636 inputs_[0] = left;
637 inputs_[1] = right;
638 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000639
640 DECLARE_CONCRETE_INSTRUCTION(CmpJSObjectEqAndBranch,
641 "cmp-jsobject-eq-and-branch")
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000642};
643
644
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +0000645class LIsNull: public LTemplateInstruction<1, 1, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000646 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000647 explicit LIsNull(LOperand* value) {
648 inputs_[0] = value;
649 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000650
651 DECLARE_CONCRETE_INSTRUCTION(IsNull, "is-null")
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000652 DECLARE_HYDROGEN_ACCESSOR(IsNull)
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000653
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000654 bool is_strict() const { return hydrogen()->is_strict(); }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000655};
656
657
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000658class LIsNullAndBranch: public LControlInstruction<1, 1> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000659 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000660 LIsNullAndBranch(LOperand* value, LOperand* temp) {
661 inputs_[0] = value;
662 temps_[0] = temp;
663 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000664
665 DECLARE_CONCRETE_INSTRUCTION(IsNullAndBranch, "is-null-and-branch")
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000666 DECLARE_HYDROGEN_ACCESSOR(IsNull)
667
668 bool is_strict() const { return hydrogen()->is_strict(); }
669
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000670 virtual void PrintDataTo(StringStream* stream);
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000671};
672
673
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000674class LIsObject: public LTemplateInstruction<1, 1, 1> {
ager@chromium.org5f0c45f2010-12-17 08:51:21 +0000675 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000676 LIsObject(LOperand* value, LOperand* temp) {
677 inputs_[0] = value;
678 temps_[0] = temp;
679 }
ager@chromium.org5f0c45f2010-12-17 08:51:21 +0000680
681 DECLARE_CONCRETE_INSTRUCTION(IsObject, "is-object")
ager@chromium.org5f0c45f2010-12-17 08:51:21 +0000682};
683
684
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000685class LIsObjectAndBranch: public LControlInstruction<1, 2> {
ager@chromium.org5f0c45f2010-12-17 08:51:21 +0000686 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000687 LIsObjectAndBranch(LOperand* value, LOperand* temp, LOperand* temp2) {
688 inputs_[0] = value;
689 temps_[0] = temp;
690 temps_[1] = temp2;
691 }
ager@chromium.org5f0c45f2010-12-17 08:51:21 +0000692
693 DECLARE_CONCRETE_INSTRUCTION(IsObjectAndBranch, "is-object-and-branch")
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000694
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000695 virtual void PrintDataTo(StringStream* stream);
ager@chromium.org5f0c45f2010-12-17 08:51:21 +0000696};
697
698
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +0000699class LIsSmi: public LTemplateInstruction<1, 1, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000700 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000701 explicit LIsSmi(LOperand* value) {
702 inputs_[0] = value;
703 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000704
705 DECLARE_CONCRETE_INSTRUCTION(IsSmi, "is-smi")
706 DECLARE_HYDROGEN_ACCESSOR(IsSmi)
707};
708
709
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +0000710class LIsSmiAndBranch: public LControlInstruction<1, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000711 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000712 explicit LIsSmiAndBranch(LOperand* value) {
713 inputs_[0] = value;
714 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000715
716 DECLARE_CONCRETE_INSTRUCTION(IsSmiAndBranch, "is-smi-and-branch")
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000717
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000718 virtual void PrintDataTo(StringStream* stream);
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000719};
720
721
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +0000722class LHasInstanceType: public LTemplateInstruction<1, 1, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000723 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000724 explicit LHasInstanceType(LOperand* value) {
725 inputs_[0] = value;
726 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000727
728 DECLARE_CONCRETE_INSTRUCTION(HasInstanceType, "has-instance-type")
729 DECLARE_HYDROGEN_ACCESSOR(HasInstanceType)
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000730};
731
732
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000733class LHasInstanceTypeAndBranch: public LControlInstruction<1, 1> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000734 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000735 LHasInstanceTypeAndBranch(LOperand* value, LOperand* temp) {
736 inputs_[0] = value;
737 temps_[0] = temp;
738 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000739
740 DECLARE_CONCRETE_INSTRUCTION(HasInstanceTypeAndBranch,
741 "has-instance-type-and-branch")
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000742 DECLARE_HYDROGEN_ACCESSOR(HasInstanceType)
743
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000744 virtual void PrintDataTo(StringStream* stream);
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000745};
746
747
karlklose@chromium.org8f806e82011-03-07 14:06:08 +0000748class LGetCachedArrayIndex: public LTemplateInstruction<1, 1, 0> {
749 public:
750 explicit LGetCachedArrayIndex(LOperand* value) {
751 inputs_[0] = value;
752 }
753
754 DECLARE_CONCRETE_INSTRUCTION(GetCachedArrayIndex, "get-cached-array-index")
755 DECLARE_HYDROGEN_ACCESSOR(GetCachedArrayIndex)
756};
757
758
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +0000759class LHasCachedArrayIndex: public LTemplateInstruction<1, 1, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000760 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000761 explicit LHasCachedArrayIndex(LOperand* value) {
762 inputs_[0] = value;
763 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000764
765 DECLARE_CONCRETE_INSTRUCTION(HasCachedArrayIndex, "has-cached-array-index")
766 DECLARE_HYDROGEN_ACCESSOR(HasCachedArrayIndex)
767};
768
769
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +0000770class LHasCachedArrayIndexAndBranch: public LControlInstruction<1, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000771 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000772 explicit LHasCachedArrayIndexAndBranch(LOperand* value) {
773 inputs_[0] = value;
774 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000775
776 DECLARE_CONCRETE_INSTRUCTION(HasCachedArrayIndexAndBranch,
777 "has-cached-array-index-and-branch")
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000778 virtual void PrintDataTo(StringStream* stream);
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000779};
780
781
erik.corry@gmail.comd91075f2011-02-10 07:45:38 +0000782class LIsConstructCall: public LTemplateInstruction<1, 0, 0> {
783 public:
784 DECLARE_CONCRETE_INSTRUCTION(IsConstructCall, "is-construct-call")
785 DECLARE_HYDROGEN_ACCESSOR(IsConstructCall)
786};
787
788
789class LIsConstructCallAndBranch: public LControlInstruction<0, 1> {
790 public:
791 explicit LIsConstructCallAndBranch(LOperand* temp) {
792 temps_[0] = temp;
793 }
794
795 DECLARE_CONCRETE_INSTRUCTION(IsConstructCallAndBranch,
796 "is-construct-call-and-branch")
797};
798
799
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000800class LClassOfTest: public LTemplateInstruction<1, 1, 1> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000801 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000802 LClassOfTest(LOperand* value, LOperand* temp) {
803 inputs_[0] = value;
804 temps_[0] = temp;
805 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000806
807 DECLARE_CONCRETE_INSTRUCTION(ClassOfTest, "class-of-test")
808 DECLARE_HYDROGEN_ACCESSOR(ClassOfTest)
809
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000810 virtual void PrintDataTo(StringStream* stream);
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000811};
812
813
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000814class LClassOfTestAndBranch: public LControlInstruction<1, 2> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000815 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000816 LClassOfTestAndBranch(LOperand* value, LOperand* temp, LOperand* temp2) {
817 inputs_[0] = value;
818 temps_[0] = temp;
819 temps_[1] = temp2;
820 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000821
822 DECLARE_CONCRETE_INSTRUCTION(ClassOfTestAndBranch,
823 "class-of-test-and-branch")
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000824 DECLARE_HYDROGEN_ACCESSOR(ClassOfTest)
825
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000826 virtual void PrintDataTo(StringStream* stream);
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000827};
828
829
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +0000830class LCmpT: public LTemplateInstruction<1, 2, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000831 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000832 LCmpT(LOperand* left, LOperand* right) {
833 inputs_[0] = left;
834 inputs_[1] = right;
835 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000836
837 DECLARE_CONCRETE_INSTRUCTION(CmpT, "cmp-t")
838 DECLARE_HYDROGEN_ACCESSOR(Compare)
839
840 Token::Value op() const { return hydrogen()->token(); }
841};
842
843
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +0000844class LCmpTAndBranch: public LControlInstruction<2, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000845 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000846 LCmpTAndBranch(LOperand* left, LOperand* right) {
847 inputs_[0] = left;
848 inputs_[1] = right;
849 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000850
851 DECLARE_CONCRETE_INSTRUCTION(CmpTAndBranch, "cmp-t-and-branch")
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000852 DECLARE_HYDROGEN_ACCESSOR(Compare)
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000853
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000854 Token::Value op() const { return hydrogen()->token(); }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000855};
856
857
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +0000858class LInstanceOf: public LTemplateInstruction<1, 3, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000859 public:
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +0000860 LInstanceOf(LOperand* context, LOperand* left, LOperand* right) {
861 inputs_[0] = context;
862 inputs_[1] = left;
863 inputs_[2] = right;
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000864 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000865
866 DECLARE_CONCRETE_INSTRUCTION(InstanceOf, "instance-of")
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +0000867
868 LOperand* context() { return inputs_[0]; }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000869};
870
871
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +0000872class LInstanceOfAndBranch: public LControlInstruction<3, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000873 public:
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +0000874 LInstanceOfAndBranch(LOperand* context, LOperand* left, LOperand* right) {
875 inputs_[0] = context;
876 inputs_[1] = left;
877 inputs_[2] = right;
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000878 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000879
880 DECLARE_CONCRETE_INSTRUCTION(InstanceOfAndBranch, "instance-of-and-branch")
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +0000881
882 LOperand* context() { return inputs_[0]; }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000883};
884
885
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000886class LInstanceOfKnownGlobal: public LTemplateInstruction<1, 1, 1> {
kmillikin@chromium.orgd2c22f02011-01-10 08:15:37 +0000887 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000888 LInstanceOfKnownGlobal(LOperand* value, LOperand* temp) {
889 inputs_[0] = value;
890 temps_[0] = temp;
891 }
kmillikin@chromium.orgd2c22f02011-01-10 08:15:37 +0000892
893 DECLARE_CONCRETE_INSTRUCTION(InstanceOfKnownGlobal,
894 "instance-of-known-global")
895 DECLARE_HYDROGEN_ACCESSOR(InstanceOfKnownGlobal)
896
897 Handle<JSFunction> function() const { return hydrogen()->function(); }
kmillikin@chromium.orgd2c22f02011-01-10 08:15:37 +0000898};
899
900
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000901class LBoundsCheck: public LTemplateInstruction<0, 2, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000902 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000903 LBoundsCheck(LOperand* index, LOperand* length) {
904 inputs_[0] = index;
905 inputs_[1] = length;
906 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000907
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000908 LOperand* index() { return inputs_[0]; }
909 LOperand* length() { return inputs_[1]; }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000910
911 DECLARE_CONCRETE_INSTRUCTION(BoundsCheck, "bounds-check")
912};
913
914
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +0000915class LBitI: public LTemplateInstruction<1, 2, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000916 public:
917 LBitI(Token::Value op, LOperand* left, LOperand* right)
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000918 : op_(op) {
919 inputs_[0] = left;
920 inputs_[1] = right;
921 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000922
923 Token::Value op() const { return op_; }
924
925 DECLARE_CONCRETE_INSTRUCTION(BitI, "bit-i")
926
927 private:
928 Token::Value op_;
929};
930
931
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +0000932class LShiftI: public LTemplateInstruction<1, 2, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000933 public:
934 LShiftI(Token::Value op, LOperand* left, LOperand* right, bool can_deopt)
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000935 : op_(op), can_deopt_(can_deopt) {
936 inputs_[0] = left;
937 inputs_[1] = right;
938 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000939
940 Token::Value op() const { return op_; }
941
942 bool can_deopt() const { return can_deopt_; }
943
944 DECLARE_CONCRETE_INSTRUCTION(ShiftI, "shift-i")
945
946 private:
947 Token::Value op_;
948 bool can_deopt_;
949};
950
951
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +0000952class LSubI: public LTemplateInstruction<1, 2, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000953 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000954 LSubI(LOperand* left, LOperand* right) {
955 inputs_[0] = left;
956 inputs_[1] = right;
957 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000958
959 DECLARE_CONCRETE_INSTRUCTION(SubI, "sub-i")
960 DECLARE_HYDROGEN_ACCESSOR(Sub)
961};
962
963
erik.corry@gmail.comd91075f2011-02-10 07:45:38 +0000964class LConstantI: public LTemplateInstruction<1, 0, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000965 public:
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000966 DECLARE_CONCRETE_INSTRUCTION(ConstantI, "constant-i")
erik.corry@gmail.comd91075f2011-02-10 07:45:38 +0000967 DECLARE_HYDROGEN_ACCESSOR(Constant)
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000968
erik.corry@gmail.comd91075f2011-02-10 07:45:38 +0000969 int32_t value() const { return hydrogen()->Integer32Value(); }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000970};
971
972
erik.corry@gmail.comd91075f2011-02-10 07:45:38 +0000973class LConstantD: public LTemplateInstruction<1, 0, 1> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000974 public:
erik.corry@gmail.comd91075f2011-02-10 07:45:38 +0000975 explicit LConstantD(LOperand* temp) {
976 temps_[0] = temp;
977 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000978
979 DECLARE_CONCRETE_INSTRUCTION(ConstantD, "constant-d")
erik.corry@gmail.comd91075f2011-02-10 07:45:38 +0000980 DECLARE_HYDROGEN_ACCESSOR(Constant)
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000981
erik.corry@gmail.comd91075f2011-02-10 07:45:38 +0000982 double value() const { return hydrogen()->DoubleValue(); }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000983};
984
985
erik.corry@gmail.comd91075f2011-02-10 07:45:38 +0000986class LConstantT: public LTemplateInstruction<1, 0, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000987 public:
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000988 DECLARE_CONCRETE_INSTRUCTION(ConstantT, "constant-t")
erik.corry@gmail.comd91075f2011-02-10 07:45:38 +0000989 DECLARE_HYDROGEN_ACCESSOR(Constant)
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000990
erik.corry@gmail.comd91075f2011-02-10 07:45:38 +0000991 Handle<Object> value() const { return hydrogen()->handle(); }
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000992};
993
994
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +0000995class LBranch: public LControlInstruction<1, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000996 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000997 explicit LBranch(LOperand* value) {
998 inputs_[0] = value;
999 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001000
1001 DECLARE_CONCRETE_INSTRUCTION(Branch, "branch")
1002 DECLARE_HYDROGEN_ACCESSOR(Value)
1003
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +00001004 virtual void PrintDataTo(StringStream* stream);
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001005};
1006
1007
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +00001008class LCmpMapAndBranch: public LTemplateInstruction<0, 1, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001009 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001010 explicit LCmpMapAndBranch(LOperand* value) {
1011 inputs_[0] = value;
1012 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001013
1014 DECLARE_CONCRETE_INSTRUCTION(CmpMapAndBranch, "cmp-map-and-branch")
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +00001015 DECLARE_HYDROGEN_ACCESSOR(CompareMap)
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001016
1017 virtual bool IsControl() const { return true; }
1018
kmillikin@chromium.orgd2c22f02011-01-10 08:15:37 +00001019 Handle<Map> map() const { return hydrogen()->map(); }
1020 int true_block_id() const {
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +00001021 return hydrogen()->FirstSuccessor()->block_id();
kmillikin@chromium.orgd2c22f02011-01-10 08:15:37 +00001022 }
1023 int false_block_id() const {
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +00001024 return hydrogen()->SecondSuccessor()->block_id();
kmillikin@chromium.orgd2c22f02011-01-10 08:15:37 +00001025 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001026};
1027
1028
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +00001029class LJSArrayLength: public LTemplateInstruction<1, 1, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001030 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001031 explicit LJSArrayLength(LOperand* value) {
1032 inputs_[0] = value;
1033 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001034
fschneider@chromium.org9e3e0b62011-01-03 10:16:46 +00001035 DECLARE_CONCRETE_INSTRUCTION(JSArrayLength, "js-array-length")
1036 DECLARE_HYDROGEN_ACCESSOR(JSArrayLength)
1037};
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001038
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001039
danno@chromium.org4d3fe4e2011-03-10 10:14:28 +00001040class LExternalArrayLength: public LTemplateInstruction<1, 1, 0> {
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +00001041 public:
danno@chromium.org4d3fe4e2011-03-10 10:14:28 +00001042 explicit LExternalArrayLength(LOperand* value) {
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +00001043 inputs_[0] = value;
1044 }
1045
danno@chromium.org4d3fe4e2011-03-10 10:14:28 +00001046 DECLARE_CONCRETE_INSTRUCTION(ExternalArrayLength, "external-array-length")
1047 DECLARE_HYDROGEN_ACCESSOR(ExternalArrayLength)
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +00001048};
1049
1050
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +00001051class LFixedArrayLength: public LTemplateInstruction<1, 1, 0> {
fschneider@chromium.org9e3e0b62011-01-03 10:16:46 +00001052 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001053 explicit LFixedArrayLength(LOperand* value) {
1054 inputs_[0] = value;
1055 }
fschneider@chromium.org9e3e0b62011-01-03 10:16:46 +00001056
1057 DECLARE_CONCRETE_INSTRUCTION(FixedArrayLength, "fixed-array-length")
1058 DECLARE_HYDROGEN_ACCESSOR(FixedArrayLength)
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001059};
1060
1061
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001062class LValueOf: public LTemplateInstruction<1, 1, 1> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001063 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001064 LValueOf(LOperand* value, LOperand* temp) {
1065 inputs_[0] = value;
1066 temps_[0] = temp;
1067 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001068
1069 DECLARE_CONCRETE_INSTRUCTION(ValueOf, "value-of")
1070 DECLARE_HYDROGEN_ACCESSOR(ValueOf)
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001071};
1072
1073
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +00001074class LThrow: public LTemplateInstruction<0, 1, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001075 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001076 explicit LThrow(LOperand* value) {
1077 inputs_[0] = value;
1078 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001079
1080 DECLARE_CONCRETE_INSTRUCTION(Throw, "throw")
1081};
1082
1083
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +00001084class LBitNotI: public LTemplateInstruction<1, 1, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001085 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001086 explicit LBitNotI(LOperand* value) {
1087 inputs_[0] = value;
1088 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001089
1090 DECLARE_CONCRETE_INSTRUCTION(BitNotI, "bit-not-i")
1091};
1092
1093
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +00001094class LAddI: public LTemplateInstruction<1, 2, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001095 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001096 LAddI(LOperand* left, LOperand* right) {
1097 inputs_[0] = left;
1098 inputs_[1] = right;
1099 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001100
1101 DECLARE_CONCRETE_INSTRUCTION(AddI, "add-i")
1102 DECLARE_HYDROGEN_ACCESSOR(Add)
1103};
1104
1105
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +00001106class LPower: public LTemplateInstruction<1, 2, 0> {
ager@chromium.org5f0c45f2010-12-17 08:51:21 +00001107 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001108 LPower(LOperand* left, LOperand* right) {
1109 inputs_[0] = left;
1110 inputs_[1] = right;
1111 }
ager@chromium.org5f0c45f2010-12-17 08:51:21 +00001112
1113 DECLARE_CONCRETE_INSTRUCTION(Power, "power")
1114 DECLARE_HYDROGEN_ACCESSOR(Power)
1115};
1116
1117
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +00001118class LArithmeticD: public LTemplateInstruction<1, 2, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001119 public:
1120 LArithmeticD(Token::Value op, LOperand* left, LOperand* right)
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001121 : op_(op) {
1122 inputs_[0] = left;
1123 inputs_[1] = right;
1124 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001125
1126 Token::Value op() const { return op_; }
1127
1128 virtual void CompileToNative(LCodeGen* generator);
1129 virtual const char* Mnemonic() const;
1130
1131 private:
1132 Token::Value op_;
1133};
1134
1135
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +00001136class LArithmeticT: public LTemplateInstruction<1, 2, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001137 public:
1138 LArithmeticT(Token::Value op, LOperand* left, LOperand* right)
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001139 : op_(op) {
1140 inputs_[0] = left;
1141 inputs_[1] = right;
1142 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001143
1144 virtual void CompileToNative(LCodeGen* generator);
1145 virtual const char* Mnemonic() const;
1146
1147 Token::Value op() const { return op_; }
1148
1149 private:
1150 Token::Value op_;
1151};
1152
1153
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +00001154class LReturn: public LTemplateInstruction<0, 1, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001155 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001156 explicit LReturn(LOperand* value) {
1157 inputs_[0] = value;
1158 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001159
1160 DECLARE_CONCRETE_INSTRUCTION(Return, "return")
1161};
1162
1163
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +00001164class LLoadNamedField: public LTemplateInstruction<1, 1, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001165 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001166 explicit LLoadNamedField(LOperand* object) {
1167 inputs_[0] = object;
1168 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001169
1170 DECLARE_CONCRETE_INSTRUCTION(LoadNamedField, "load-named-field")
1171 DECLARE_HYDROGEN_ACCESSOR(LoadNamedField)
1172};
1173
1174
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +00001175class LLoadNamedGeneric: public LTemplateInstruction<1, 2, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001176 public:
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +00001177 LLoadNamedGeneric(LOperand* context, LOperand* object) {
1178 inputs_[0] = context;
1179 inputs_[1] = object;
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001180 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001181
1182 DECLARE_CONCRETE_INSTRUCTION(LoadNamedGeneric, "load-named-generic")
1183 DECLARE_HYDROGEN_ACCESSOR(LoadNamedGeneric)
1184
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +00001185 LOperand* context() { return inputs_[0]; }
1186 LOperand* object() { return inputs_[1]; }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001187 Handle<Object> name() const { return hydrogen()->name(); }
1188};
1189
1190
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001191class LLoadFunctionPrototype: public LTemplateInstruction<1, 1, 1> {
fschneider@chromium.org9e3e0b62011-01-03 10:16:46 +00001192 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001193 LLoadFunctionPrototype(LOperand* function, LOperand* temp) {
1194 inputs_[0] = function;
1195 temps_[0] = temp;
1196 }
fschneider@chromium.org9e3e0b62011-01-03 10:16:46 +00001197
1198 DECLARE_CONCRETE_INSTRUCTION(LoadFunctionPrototype, "load-function-prototype")
1199 DECLARE_HYDROGEN_ACCESSOR(LoadFunctionPrototype)
1200
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001201 LOperand* function() { return inputs_[0]; }
fschneider@chromium.org9e3e0b62011-01-03 10:16:46 +00001202};
1203
1204
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +00001205class LLoadElements: public LTemplateInstruction<1, 1, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001206 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001207 explicit LLoadElements(LOperand* object) {
1208 inputs_[0] = object;
1209 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001210
1211 DECLARE_CONCRETE_INSTRUCTION(LoadElements, "load-elements")
1212};
1213
1214
danno@chromium.org4d3fe4e2011-03-10 10:14:28 +00001215class LLoadExternalArrayPointer: public LTemplateInstruction<1, 1, 0> {
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +00001216 public:
danno@chromium.org4d3fe4e2011-03-10 10:14:28 +00001217 explicit LLoadExternalArrayPointer(LOperand* object) {
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +00001218 inputs_[0] = object;
1219 }
1220
danno@chromium.org4d3fe4e2011-03-10 10:14:28 +00001221 DECLARE_CONCRETE_INSTRUCTION(LoadExternalArrayPointer,
1222 "load-external-array-pointer")
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +00001223};
1224
1225
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +00001226class LLoadKeyedFastElement: public LTemplateInstruction<1, 2, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001227 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001228 LLoadKeyedFastElement(LOperand* elements, LOperand* key) {
1229 inputs_[0] = elements;
1230 inputs_[1] = key;
1231 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001232
1233 DECLARE_CONCRETE_INSTRUCTION(LoadKeyedFastElement, "load-keyed-fast-element")
1234 DECLARE_HYDROGEN_ACCESSOR(LoadKeyedFastElement)
1235
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001236 LOperand* elements() { return inputs_[0]; }
1237 LOperand* key() { return inputs_[1]; }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001238};
1239
1240
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +00001241class LLoadPixelArrayElement: public LTemplateInstruction<1, 2, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001242 public:
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +00001243 LLoadPixelArrayElement(LOperand* external_pointer, LOperand* key) {
1244 inputs_[0] = external_pointer;
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001245 inputs_[1] = key;
1246 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001247
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +00001248 DECLARE_CONCRETE_INSTRUCTION(LoadPixelArrayElement,
1249 "load-pixel-array-element")
1250 DECLARE_HYDROGEN_ACCESSOR(LoadPixelArrayElement)
1251
1252 LOperand* external_pointer() { return inputs_[0]; }
1253 LOperand* key() { return inputs_[1]; }
1254};
1255
1256
1257class LLoadKeyedGeneric: public LTemplateInstruction<1, 3, 0> {
1258 public:
1259 LLoadKeyedGeneric(LOperand* context, LOperand* obj, LOperand* key) {
1260 inputs_[0] = context;
1261 inputs_[1] = obj;
1262 inputs_[2] = key;
1263 }
1264
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001265 DECLARE_CONCRETE_INSTRUCTION(LoadKeyedGeneric, "load-keyed-generic")
1266
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +00001267 LOperand* context() { return inputs_[0]; }
1268 LOperand* object() { return inputs_[1]; }
1269 LOperand* key() { return inputs_[2]; }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001270};
1271
1272
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +00001273class LLoadGlobal: public LTemplateInstruction<1, 0, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001274 public:
1275 DECLARE_CONCRETE_INSTRUCTION(LoadGlobal, "load-global")
1276 DECLARE_HYDROGEN_ACCESSOR(LoadGlobal)
1277};
1278
1279
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +00001280class LStoreGlobal: public LTemplateInstruction<0, 1, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001281 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001282 explicit LStoreGlobal(LOperand* value) {
1283 inputs_[0] = value;
1284 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001285
1286 DECLARE_CONCRETE_INSTRUCTION(StoreGlobal, "store-global")
1287 DECLARE_HYDROGEN_ACCESSOR(StoreGlobal)
1288};
1289
1290
ricow@chromium.org83aa5492011-02-07 12:42:56 +00001291class LLoadContextSlot: public LTemplateInstruction<1, 1, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001292 public:
ricow@chromium.org83aa5492011-02-07 12:42:56 +00001293 explicit LLoadContextSlot(LOperand* context) {
1294 inputs_[0] = context;
1295 }
1296
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +00001297 DECLARE_CONCRETE_INSTRUCTION(LoadContextSlot, "load-context-slot")
1298 DECLARE_HYDROGEN_ACCESSOR(LoadContextSlot)
1299
ricow@chromium.org83aa5492011-02-07 12:42:56 +00001300 LOperand* context() { return InputAt(0); }
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001301 int slot_index() { return hydrogen()->slot_index(); }
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +00001302
1303 virtual void PrintDataTo(StringStream* stream);
1304};
1305
1306
ricow@chromium.org83aa5492011-02-07 12:42:56 +00001307class LStoreContextSlot: public LTemplateInstruction<0, 2, 1> {
1308 public:
1309 LStoreContextSlot(LOperand* context, LOperand* value, LOperand* temp) {
1310 inputs_[0] = context;
1311 inputs_[1] = value;
1312 temps_[0] = temp;
1313 }
1314
1315 DECLARE_CONCRETE_INSTRUCTION(StoreContextSlot, "store-context-slot")
1316 DECLARE_HYDROGEN_ACCESSOR(StoreContextSlot)
1317
1318 LOperand* context() { return InputAt(0); }
1319 LOperand* value() { return InputAt(1); }
1320 int slot_index() { return hydrogen()->slot_index(); }
1321 int needs_write_barrier() { return hydrogen()->NeedsWriteBarrier(); }
1322
1323 virtual void PrintDataTo(StringStream* stream);
1324};
1325
1326
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +00001327class LPushArgument: public LTemplateInstruction<0, 1, 0> {
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +00001328 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001329 explicit LPushArgument(LOperand* value) {
1330 inputs_[0] = value;
1331 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001332
1333 DECLARE_CONCRETE_INSTRUCTION(PushArgument, "push-argument")
1334};
1335
1336
ricow@chromium.org83aa5492011-02-07 12:42:56 +00001337class LContext: public LTemplateInstruction<1, 0, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001338 public:
ricow@chromium.org83aa5492011-02-07 12:42:56 +00001339 DECLARE_CONCRETE_INSTRUCTION(Context, "context")
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001340};
1341
1342
ricow@chromium.org83aa5492011-02-07 12:42:56 +00001343class LOuterContext: public LTemplateInstruction<1, 1, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001344 public:
ricow@chromium.org83aa5492011-02-07 12:42:56 +00001345 explicit LOuterContext(LOperand* context) {
1346 inputs_[0] = context;
1347 }
1348
1349 DECLARE_CONCRETE_INSTRUCTION(OuterContext, "outer-context")
1350
1351 LOperand* context() { return InputAt(0); }
1352};
1353
1354
1355class LGlobalObject: public LTemplateInstruction<1, 1, 0> {
1356 public:
1357 explicit LGlobalObject(LOperand* context) {
1358 inputs_[0] = context;
1359 }
1360
1361 DECLARE_CONCRETE_INSTRUCTION(GlobalObject, "global-object")
1362
1363 LOperand* context() { return InputAt(0); }
1364};
1365
1366
1367class LGlobalReceiver: public LTemplateInstruction<1, 1, 0> {
1368 public:
1369 explicit LGlobalReceiver(LOperand* global_object) {
1370 inputs_[0] = global_object;
1371 }
1372
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001373 DECLARE_CONCRETE_INSTRUCTION(GlobalReceiver, "global-receiver")
ricow@chromium.org83aa5492011-02-07 12:42:56 +00001374
1375 LOperand* global() { return InputAt(0); }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001376};
1377
1378
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +00001379class LCallConstantFunction: public LTemplateInstruction<1, 0, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001380 public:
1381 DECLARE_CONCRETE_INSTRUCTION(CallConstantFunction, "call-constant-function")
1382 DECLARE_HYDROGEN_ACCESSOR(CallConstantFunction)
1383
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +00001384 virtual void PrintDataTo(StringStream* stream);
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001385
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +00001386 Handle<JSFunction> function() { return hydrogen()->function(); }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001387 int arity() const { return hydrogen()->argument_count() - 1; }
1388};
1389
1390
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +00001391class LCallKeyed: public LTemplateInstruction<1, 2, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001392 public:
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +00001393 LCallKeyed(LOperand* context, LOperand* key) {
1394 inputs_[0] = context;
1395 inputs_[1] = key;
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001396 }
1397
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001398 DECLARE_CONCRETE_INSTRUCTION(CallKeyed, "call-keyed")
1399 DECLARE_HYDROGEN_ACCESSOR(CallKeyed)
1400
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +00001401 LOperand* context() { return inputs_[0]; }
1402 LOperand* key() { return inputs_[1]; }
1403
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +00001404 virtual void PrintDataTo(StringStream* stream);
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001405
1406 int arity() const { return hydrogen()->argument_count() - 1; }
1407};
1408
1409
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +00001410class LCallNamed: public LTemplateInstruction<1, 1, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001411 public:
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +00001412 explicit LCallNamed(LOperand* context) {
1413 inputs_[0] = context;
1414 }
1415
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001416 DECLARE_CONCRETE_INSTRUCTION(CallNamed, "call-named")
1417 DECLARE_HYDROGEN_ACCESSOR(CallNamed)
1418
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +00001419 virtual void PrintDataTo(StringStream* stream);
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001420
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +00001421 LOperand* context() { return inputs_[0]; }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001422 Handle<String> name() const { return hydrogen()->name(); }
1423 int arity() const { return hydrogen()->argument_count() - 1; }
1424};
1425
1426
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +00001427class LCallFunction: public LTemplateInstruction<1, 1, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001428 public:
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +00001429 explicit LCallFunction(LOperand* context) {
1430 inputs_[0] = context;
1431 }
1432
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001433 DECLARE_CONCRETE_INSTRUCTION(CallFunction, "call-function")
1434 DECLARE_HYDROGEN_ACCESSOR(CallFunction)
1435
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +00001436 LOperand* context() { return inputs_[0]; }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001437 int arity() const { return hydrogen()->argument_count() - 2; }
1438};
1439
1440
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +00001441class LCallGlobal: public LTemplateInstruction<1, 1, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001442 public:
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +00001443 explicit LCallGlobal(LOperand* context) {
1444 inputs_[0] = context;
1445 }
1446
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001447 DECLARE_CONCRETE_INSTRUCTION(CallGlobal, "call-global")
1448 DECLARE_HYDROGEN_ACCESSOR(CallGlobal)
1449
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +00001450 virtual void PrintDataTo(StringStream* stream);
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001451
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +00001452 LOperand* context() { return inputs_[0]; }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001453 Handle<String> name() const {return hydrogen()->name(); }
1454 int arity() const { return hydrogen()->argument_count() - 1; }
1455};
1456
1457
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +00001458class LCallKnownGlobal: public LTemplateInstruction<1, 0, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001459 public:
1460 DECLARE_CONCRETE_INSTRUCTION(CallKnownGlobal, "call-known-global")
1461 DECLARE_HYDROGEN_ACCESSOR(CallKnownGlobal)
1462
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +00001463 virtual void PrintDataTo(StringStream* stream);
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001464
1465 Handle<JSFunction> target() const { return hydrogen()->target(); }
1466 int arity() const { return hydrogen()->argument_count() - 1; }
1467};
1468
1469
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +00001470class LCallNew: public LTemplateInstruction<1, 2, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001471 public:
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +00001472 LCallNew(LOperand* context, LOperand* constructor) {
1473 inputs_[0] = context;
1474 inputs_[1] = constructor;
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001475 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001476
1477 DECLARE_CONCRETE_INSTRUCTION(CallNew, "call-new")
1478 DECLARE_HYDROGEN_ACCESSOR(CallNew)
1479
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +00001480 virtual void PrintDataTo(StringStream* stream);
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001481
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +00001482 LOperand* context() { return inputs_[0]; }
1483 LOperand* constructor() { return inputs_[1]; }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001484 int arity() const { return hydrogen()->argument_count() - 1; }
1485};
1486
1487
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +00001488class LCallRuntime: public LTemplateInstruction<1, 0, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001489 public:
1490 DECLARE_CONCRETE_INSTRUCTION(CallRuntime, "call-runtime")
1491 DECLARE_HYDROGEN_ACCESSOR(CallRuntime)
1492
1493 Runtime::Function* function() const { return hydrogen()->function(); }
1494 int arity() const { return hydrogen()->argument_count(); }
1495};
1496
1497
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +00001498class LInteger32ToDouble: public LTemplateInstruction<1, 1, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001499 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001500 explicit LInteger32ToDouble(LOperand* value) {
1501 inputs_[0] = value;
1502 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001503
1504 DECLARE_CONCRETE_INSTRUCTION(Integer32ToDouble, "int32-to-double")
1505};
1506
1507
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +00001508class LNumberTagI: public LTemplateInstruction<1, 1, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001509 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001510 explicit LNumberTagI(LOperand* value) {
1511 inputs_[0] = value;
1512 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001513
1514 DECLARE_CONCRETE_INSTRUCTION(NumberTagI, "number-tag-i")
1515};
1516
1517
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001518class LNumberTagD: public LTemplateInstruction<1, 1, 1> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001519 public:
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +00001520 LNumberTagD(LOperand* value, LOperand* temp) {
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001521 inputs_[0] = value;
1522 temps_[0] = temp;
1523 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001524
1525 DECLARE_CONCRETE_INSTRUCTION(NumberTagD, "number-tag-d")
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001526};
1527
1528
1529// Sometimes truncating conversion from a tagged value to an int32.
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001530class LDoubleToI: public LTemplateInstruction<1, 1, 1> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001531 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001532 LDoubleToI(LOperand* value, LOperand* temp) {
1533 inputs_[0] = value;
1534 temps_[0] = temp;
1535 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001536
1537 DECLARE_CONCRETE_INSTRUCTION(DoubleToI, "double-to-i")
1538 DECLARE_HYDROGEN_ACCESSOR(Change)
1539
1540 bool truncating() { return hydrogen()->CanTruncateToInt32(); }
1541};
1542
1543
1544// Truncating conversion from a tagged value to an int32.
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001545class LTaggedToI: public LTemplateInstruction<1, 1, 1> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001546 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001547 LTaggedToI(LOperand* value, LOperand* temp) {
1548 inputs_[0] = value;
1549 temps_[0] = temp;
1550 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001551
1552 DECLARE_CONCRETE_INSTRUCTION(TaggedToI, "tagged-to-i")
1553 DECLARE_HYDROGEN_ACCESSOR(Change)
1554
1555 bool truncating() { return hydrogen()->CanTruncateToInt32(); }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001556};
1557
1558
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +00001559class LSmiTag: public LTemplateInstruction<1, 1, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001560 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001561 explicit LSmiTag(LOperand* value) {
1562 inputs_[0] = value;
1563 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001564
1565 DECLARE_CONCRETE_INSTRUCTION(SmiTag, "smi-tag")
1566};
1567
1568
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +00001569class LNumberUntagD: public LTemplateInstruction<1, 1, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001570 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001571 explicit LNumberUntagD(LOperand* value) {
1572 inputs_[0] = value;
1573 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001574
1575 DECLARE_CONCRETE_INSTRUCTION(NumberUntagD, "double-untag")
1576};
1577
1578
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +00001579class LSmiUntag: public LTemplateInstruction<1, 1, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001580 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001581 LSmiUntag(LOperand* value, bool needs_check)
1582 : needs_check_(needs_check) {
1583 inputs_[0] = value;
1584 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001585
1586 DECLARE_CONCRETE_INSTRUCTION(SmiUntag, "smi-untag")
1587
1588 bool needs_check() const { return needs_check_; }
1589
1590 private:
1591 bool needs_check_;
1592};
1593
1594
fschneider@chromium.org3a5fd782011-02-24 10:10:44 +00001595class LStoreNamedField: public LTemplateInstruction<0, 2, 1> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001596 public:
fschneider@chromium.org3a5fd782011-02-24 10:10:44 +00001597 LStoreNamedField(LOperand* obj, LOperand* val, LOperand* temp) {
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001598 inputs_[0] = obj;
1599 inputs_[1] = val;
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001600 temps_[0] = temp;
1601 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001602
1603 DECLARE_CONCRETE_INSTRUCTION(StoreNamedField, "store-named-field")
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +00001604 DECLARE_HYDROGEN_ACCESSOR(StoreNamedField)
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001605
fschneider@chromium.org3a5fd782011-02-24 10:10:44 +00001606 virtual void PrintDataTo(StringStream* stream);
1607
1608 LOperand* object() { return inputs_[0]; }
1609 LOperand* value() { return inputs_[1]; }
1610
1611 Handle<Object> name() const { return hydrogen()->name(); }
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +00001612 bool is_in_object() { return hydrogen()->is_in_object(); }
1613 int offset() { return hydrogen()->offset(); }
1614 bool needs_write_barrier() { return hydrogen()->NeedsWriteBarrier(); }
1615 Handle<Map> transition() const { return hydrogen()->transition(); }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001616};
1617
1618
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +00001619class LStoreNamedGeneric: public LTemplateInstruction<0, 3, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001620 public:
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +00001621 LStoreNamedGeneric(LOperand* context, LOperand* object, LOperand* value) {
1622 inputs_[0] = context;
1623 inputs_[1] = object;
1624 inputs_[2] = value;
1625 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001626
1627 DECLARE_CONCRETE_INSTRUCTION(StoreNamedGeneric, "store-named-generic")
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +00001628 DECLARE_HYDROGEN_ACCESSOR(StoreNamedGeneric)
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +00001629
fschneider@chromium.org3a5fd782011-02-24 10:10:44 +00001630 virtual void PrintDataTo(StringStream* stream);
1631
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +00001632 LOperand* context() { return inputs_[0]; }
1633 LOperand* object() { return inputs_[1]; }
1634 LOperand* value() { return inputs_[2]; }
1635 Handle<Object> name() const { return hydrogen()->name(); }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001636};
1637
1638
fschneider@chromium.org3a5fd782011-02-24 10:10:44 +00001639class LStoreKeyedFastElement: public LTemplateInstruction<0, 3, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001640 public:
fschneider@chromium.org3a5fd782011-02-24 10:10:44 +00001641 LStoreKeyedFastElement(LOperand* obj, LOperand* key, LOperand* val) {
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001642 inputs_[0] = obj;
1643 inputs_[1] = key;
1644 inputs_[2] = val;
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +00001645 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001646
fschneider@chromium.org3a5fd782011-02-24 10:10:44 +00001647 DECLARE_CONCRETE_INSTRUCTION(StoreKeyedFastElement,
1648 "store-keyed-fast-element")
1649 DECLARE_HYDROGEN_ACCESSOR(StoreKeyedFastElement)
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001650
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +00001651 virtual void PrintDataTo(StringStream* stream);
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001652
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001653 LOperand* object() { return inputs_[0]; }
1654 LOperand* key() { return inputs_[1]; }
1655 LOperand* value() { return inputs_[2]; }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001656};
1657
1658
fschneider@chromium.org3a5fd782011-02-24 10:10:44 +00001659class LStorePixelArrayElement: public LTemplateInstruction<0, 3, 1> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001660 public:
fschneider@chromium.org3a5fd782011-02-24 10:10:44 +00001661 LStorePixelArrayElement(LOperand* external_pointer,
1662 LOperand* key,
1663 LOperand* val,
1664 LOperand* clamped) {
1665 inputs_[0] = external_pointer;
1666 inputs_[1] = key;
1667 inputs_[2] = val;
1668 temps_[0] = clamped;
1669 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001670
fschneider@chromium.org3a5fd782011-02-24 10:10:44 +00001671 DECLARE_CONCRETE_INSTRUCTION(StorePixelArrayElement,
1672 "store-pixel-array-element")
1673 DECLARE_HYDROGEN_ACCESSOR(StorePixelArrayElement)
1674
1675 LOperand* external_pointer() { return inputs_[0]; }
1676 LOperand* key() { return inputs_[1]; }
1677 LOperand* value() { return inputs_[2]; }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001678};
1679
1680
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +00001681class LStoreKeyedGeneric: public LTemplateInstruction<0, 4, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001682 public:
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +00001683 LStoreKeyedGeneric(LOperand* context,
1684 LOperand* object,
1685 LOperand* key,
1686 LOperand* value) {
1687 inputs_[0] = context;
1688 inputs_[1] = object;
1689 inputs_[2] = key;
1690 inputs_[3] = value;
1691 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001692
1693 DECLARE_CONCRETE_INSTRUCTION(StoreKeyedGeneric, "store-keyed-generic")
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +00001694
fschneider@chromium.org3a5fd782011-02-24 10:10:44 +00001695 virtual void PrintDataTo(StringStream* stream);
1696
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +00001697 LOperand* context() { return inputs_[0]; }
1698 LOperand* object() { return inputs_[1]; }
1699 LOperand* key() { return inputs_[2]; }
1700 LOperand* value() { return inputs_[3]; }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001701};
1702
1703
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +00001704class LStringCharCodeAt: public LTemplateInstruction<1, 2, 0> {
1705 public:
1706 LStringCharCodeAt(LOperand* string, LOperand* index) {
1707 inputs_[0] = string;
1708 inputs_[1] = index;
1709 }
1710
1711 DECLARE_CONCRETE_INSTRUCTION(StringCharCodeAt, "string-char-code-at")
1712 DECLARE_HYDROGEN_ACCESSOR(StringCharCodeAt)
1713
1714 LOperand* string() { return inputs_[0]; }
1715 LOperand* index() { return inputs_[1]; }
1716};
1717
1718
whesse@chromium.orgb08986c2011-03-14 16:13:42 +00001719class LStringCharFromCode: public LTemplateInstruction<1, 1, 0> {
1720 public:
1721 explicit LStringCharFromCode(LOperand* char_code) {
1722 inputs_[0] = char_code;
1723 }
1724
1725 DECLARE_CONCRETE_INSTRUCTION(StringCharFromCode, "string-char-from-code")
1726 DECLARE_HYDROGEN_ACCESSOR(StringCharFromCode)
1727
1728 LOperand* char_code() { return inputs_[0]; }
1729};
1730
1731
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +00001732class LStringLength: public LTemplateInstruction<1, 1, 0> {
1733 public:
1734 explicit LStringLength(LOperand* string) {
1735 inputs_[0] = string;
1736 }
1737
1738 DECLARE_CONCRETE_INSTRUCTION(StringLength, "string-length")
1739 DECLARE_HYDROGEN_ACCESSOR(StringLength)
1740
1741 LOperand* string() { return inputs_[0]; }
1742};
1743
1744
1745class LCheckFunction: public LTemplateInstruction<0, 1, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001746 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001747 explicit LCheckFunction(LOperand* value) {
1748 inputs_[0] = value;
1749 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001750
1751 DECLARE_CONCRETE_INSTRUCTION(CheckFunction, "check-function")
1752 DECLARE_HYDROGEN_ACCESSOR(CheckFunction)
1753};
1754
1755
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001756class LCheckInstanceType: public LTemplateInstruction<0, 1, 1> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001757 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001758 LCheckInstanceType(LOperand* value, LOperand* temp) {
1759 inputs_[0] = value;
1760 temps_[0] = temp;
1761 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001762
1763 DECLARE_CONCRETE_INSTRUCTION(CheckInstanceType, "check-instance-type")
1764 DECLARE_HYDROGEN_ACCESSOR(CheckInstanceType)
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001765};
1766
1767
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +00001768class LCheckMap: public LTemplateInstruction<0, 1, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001769 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001770 explicit LCheckMap(LOperand* value) {
1771 inputs_[0] = value;
1772 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001773
1774 DECLARE_CONCRETE_INSTRUCTION(CheckMap, "check-map")
1775 DECLARE_HYDROGEN_ACCESSOR(CheckMap)
1776};
1777
1778
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001779class LCheckPrototypeMaps: public LTemplateInstruction<0, 0, 1> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001780 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001781 explicit LCheckPrototypeMaps(LOperand* temp) {
1782 temps_[0] = temp;
1783 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001784
1785 DECLARE_CONCRETE_INSTRUCTION(CheckPrototypeMaps, "check-prototype-maps")
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +00001786 DECLARE_HYDROGEN_ACCESSOR(CheckPrototypeMaps)
1787
1788 Handle<JSObject> prototype() const { return hydrogen()->prototype(); }
1789 Handle<JSObject> holder() const { return hydrogen()->holder(); }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001790};
1791
1792
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +00001793class LCheckSmi: public LTemplateInstruction<0, 1, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001794 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001795 LCheckSmi(LOperand* value, Condition condition)
1796 : condition_(condition) {
1797 inputs_[0] = value;
1798 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001799
1800 Condition condition() const { return condition_; }
1801
1802 virtual void CompileToNative(LCodeGen* generator);
1803 virtual const char* Mnemonic() const {
1804 return (condition_ == zero) ? "check-non-smi" : "check-smi";
1805 }
1806
1807 private:
1808 Condition condition_;
1809};
1810
1811
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001812class LArrayLiteral: public LTemplateInstruction<1, 0, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001813 public:
1814 DECLARE_CONCRETE_INSTRUCTION(ArrayLiteral, "array-literal")
1815 DECLARE_HYDROGEN_ACCESSOR(ArrayLiteral)
1816};
1817
1818
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +00001819class LObjectLiteral: public LTemplateInstruction<1, 1, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001820 public:
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +00001821 explicit LObjectLiteral(LOperand* context) {
1822 inputs_[0] = context;
1823 }
1824
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001825 DECLARE_CONCRETE_INSTRUCTION(ObjectLiteral, "object-literal")
1826 DECLARE_HYDROGEN_ACCESSOR(ObjectLiteral)
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +00001827
1828 LOperand* context() { return inputs_[0]; }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001829};
1830
1831
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001832class LRegExpLiteral: public LTemplateInstruction<1, 0, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001833 public:
1834 DECLARE_CONCRETE_INSTRUCTION(RegExpLiteral, "regexp-literal")
1835 DECLARE_HYDROGEN_ACCESSOR(RegExpLiteral)
1836};
1837
1838
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +00001839class LFunctionLiteral: public LTemplateInstruction<1, 0, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001840 public:
1841 DECLARE_CONCRETE_INSTRUCTION(FunctionLiteral, "function-literal")
1842 DECLARE_HYDROGEN_ACCESSOR(FunctionLiteral)
1843
1844 Handle<SharedFunctionInfo> shared_info() { return hydrogen()->shared_info(); }
1845};
1846
1847
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +00001848class LTypeof: public LTemplateInstruction<1, 1, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001849 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001850 explicit LTypeof(LOperand* value) {
1851 inputs_[0] = value;
1852 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001853
1854 DECLARE_CONCRETE_INSTRUCTION(Typeof, "typeof")
1855};
1856
1857
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +00001858class LTypeofIs: public LTemplateInstruction<1, 1, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001859 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001860 explicit LTypeofIs(LOperand* value) {
1861 inputs_[0] = value;
1862 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001863
1864 DECLARE_CONCRETE_INSTRUCTION(TypeofIs, "typeof-is")
1865 DECLARE_HYDROGEN_ACCESSOR(TypeofIs)
1866
1867 Handle<String> type_literal() { return hydrogen()->type_literal(); }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001868
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +00001869 virtual void PrintDataTo(StringStream* stream);
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001870};
1871
1872
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +00001873class LTypeofIsAndBranch: public LControlInstruction<1, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001874 public:
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001875 explicit LTypeofIsAndBranch(LOperand* value) {
1876 inputs_[0] = value;
1877 }
1878
1879 DECLARE_CONCRETE_INSTRUCTION(TypeofIsAndBranch, "typeof-is-and-branch")
1880 DECLARE_HYDROGEN_ACCESSOR(TypeofIs)
1881
1882 Handle<String> type_literal() { return hydrogen()->type_literal(); }
1883
1884 virtual void PrintDataTo(StringStream* stream);
1885};
1886
1887
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +00001888class LDeleteProperty: public LTemplateInstruction<1, 2, 0> {
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001889 public:
1890 LDeleteProperty(LOperand* obj, LOperand* key) {
1891 inputs_[0] = obj;
1892 inputs_[1] = key;
1893 }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001894
1895 DECLARE_CONCRETE_INSTRUCTION(DeleteProperty, "delete-property")
1896
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001897 LOperand* object() { return inputs_[0]; }
1898 LOperand* key() { return inputs_[1]; }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001899};
1900
1901
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +00001902class LOsrEntry: public LTemplateInstruction<0, 0, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001903 public:
1904 LOsrEntry();
1905
1906 DECLARE_CONCRETE_INSTRUCTION(OsrEntry, "osr-entry")
1907
1908 LOperand** SpilledRegisterArray() { return register_spills_; }
1909 LOperand** SpilledDoubleRegisterArray() { return double_register_spills_; }
1910
1911 void MarkSpilledRegister(int allocation_index, LOperand* spill_operand);
1912 void MarkSpilledDoubleRegister(int allocation_index,
1913 LOperand* spill_operand);
1914
1915 private:
1916 // Arrays of spill slot operands for registers with an assigned spill
1917 // slot, i.e., that must also be restored to the spill slot on OSR entry.
1918 // NULL if the register has no assigned spill slot. Indexed by allocation
1919 // index.
1920 LOperand* register_spills_[Register::kNumAllocatableRegisters];
1921 LOperand* double_register_spills_[DoubleRegister::kNumAllocatableRegisters];
1922};
1923
1924
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +00001925class LStackCheck: public LTemplateInstruction<0, 0, 0> {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001926 public:
1927 DECLARE_CONCRETE_INSTRUCTION(StackCheck, "stack-check")
1928};
1929
1930
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001931class LChunkBuilder;
1932class LChunk: public ZoneObject {
1933 public:
karlklose@chromium.org8f806e82011-03-07 14:06:08 +00001934 explicit LChunk(CompilationInfo* info, HGraph* graph)
kmillikin@chromium.orgd2c22f02011-01-10 08:15:37 +00001935 : spill_slot_count_(0),
karlklose@chromium.org8f806e82011-03-07 14:06:08 +00001936 info_(info),
kmillikin@chromium.orgd2c22f02011-01-10 08:15:37 +00001937 graph_(graph),
1938 instructions_(32),
1939 pointer_maps_(8),
1940 inlined_closures_(1) { }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001941
ricow@chromium.org83aa5492011-02-07 12:42:56 +00001942 void AddInstruction(LInstruction* instruction, HBasicBlock* block);
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001943 LConstantOperand* DefineConstantOperand(HConstant* constant);
1944 Handle<Object> LookupLiteral(LConstantOperand* operand) const;
1945 Representation LookupLiteralRepresentation(LConstantOperand* operand) const;
1946
1947 int GetNextSpillIndex(bool is_double);
1948 LOperand* GetNextSpillSlot(bool is_double);
1949
1950 int ParameterAt(int index);
1951 int GetParameterStackSlot(int index) const;
1952 int spill_slot_count() const { return spill_slot_count_; }
karlklose@chromium.org8f806e82011-03-07 14:06:08 +00001953 CompilationInfo* info() const { return info_; }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001954 HGraph* graph() const { return graph_; }
1955 const ZoneList<LInstruction*>* instructions() const { return &instructions_; }
1956 void AddGapMove(int index, LOperand* from, LOperand* to);
1957 LGap* GetGapAt(int index) const;
1958 bool IsGapAt(int index) const;
1959 int NearestGapPos(int index) const;
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001960 void MarkEmptyBlocks();
1961 const ZoneList<LPointerMap*>* pointer_maps() const { return &pointer_maps_; }
1962 LLabel* GetLabel(int block_id) const {
1963 HBasicBlock* block = graph_->blocks()->at(block_id);
1964 int first_instruction = block->first_instruction_index();
1965 return LLabel::cast(instructions_[first_instruction]);
1966 }
1967 int LookupDestination(int block_id) const {
1968 LLabel* cur = GetLabel(block_id);
1969 while (cur->replacement() != NULL) {
1970 cur = cur->replacement();
1971 }
1972 return cur->block_id();
1973 }
1974 Label* GetAssemblyLabel(int block_id) const {
1975 LLabel* label = GetLabel(block_id);
1976 ASSERT(!label->HasReplacement());
1977 return label->label();
1978 }
1979
1980 const ZoneList<Handle<JSFunction> >* inlined_closures() const {
1981 return &inlined_closures_;
1982 }
1983
1984 void AddInlinedClosure(Handle<JSFunction> closure) {
1985 inlined_closures_.Add(closure);
1986 }
1987
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001988 private:
1989 int spill_slot_count_;
karlklose@chromium.org8f806e82011-03-07 14:06:08 +00001990 CompilationInfo* info_;
kasperl@chromium.orga5551262010-12-07 12:49:48 +00001991 HGraph* const graph_;
1992 ZoneList<LInstruction*> instructions_;
1993 ZoneList<LPointerMap*> pointer_maps_;
1994 ZoneList<Handle<JSFunction> > inlined_closures_;
1995};
1996
1997
1998class LChunkBuilder BASE_EMBEDDED {
1999 public:
karlklose@chromium.org8f806e82011-03-07 14:06:08 +00002000 LChunkBuilder(CompilationInfo* info, HGraph* graph, LAllocator* allocator)
kasperl@chromium.orga5551262010-12-07 12:49:48 +00002001 : chunk_(NULL),
karlklose@chromium.org8f806e82011-03-07 14:06:08 +00002002 info_(info),
kasperl@chromium.orga5551262010-12-07 12:49:48 +00002003 graph_(graph),
2004 status_(UNUSED),
2005 current_instruction_(NULL),
2006 current_block_(NULL),
2007 next_block_(NULL),
2008 argument_count_(0),
2009 allocator_(allocator),
2010 position_(RelocInfo::kNoPosition),
kmillikin@chromium.org31b12772011-02-02 16:08:26 +00002011 instruction_pending_deoptimization_environment_(NULL),
kasperl@chromium.orga5551262010-12-07 12:49:48 +00002012 pending_deoptimization_ast_id_(AstNode::kNoNumber) { }
2013
2014 // Build the sequence for the graph.
2015 LChunk* Build();
2016
2017 // Declare methods that deal with the individual node types.
2018#define DECLARE_DO(type) LInstruction* Do##type(H##type* node);
2019 HYDROGEN_CONCRETE_INSTRUCTION_LIST(DECLARE_DO)
2020#undef DECLARE_DO
2021
2022 private:
2023 enum Status {
2024 UNUSED,
2025 BUILDING,
2026 DONE,
2027 ABORTED
2028 };
2029
2030 LChunk* chunk() const { return chunk_; }
karlklose@chromium.org8f806e82011-03-07 14:06:08 +00002031 CompilationInfo* info() const { return info_; }
kasperl@chromium.orga5551262010-12-07 12:49:48 +00002032 HGraph* graph() const { return graph_; }
2033
2034 bool is_unused() const { return status_ == UNUSED; }
2035 bool is_building() const { return status_ == BUILDING; }
2036 bool is_done() const { return status_ == DONE; }
2037 bool is_aborted() const { return status_ == ABORTED; }
2038
2039 void Abort(const char* format, ...);
2040
2041 // Methods for getting operands for Use / Define / Temp.
2042 LRegister* ToOperand(Register reg);
2043 LUnallocated* ToUnallocated(Register reg);
2044 LUnallocated* ToUnallocated(XMMRegister reg);
2045
2046 // Methods for setting up define-use relationships.
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00002047 MUST_USE_RESULT LOperand* Use(HValue* value, LUnallocated* operand);
2048 MUST_USE_RESULT LOperand* UseFixed(HValue* value, Register fixed_register);
2049 MUST_USE_RESULT LOperand* UseFixedDouble(HValue* value,
2050 XMMRegister fixed_register);
kasperl@chromium.orga5551262010-12-07 12:49:48 +00002051
2052 // A value that is guaranteed to be allocated to a register.
2053 // Operand created by UseRegister is guaranteed to be live until the end of
2054 // instruction. This means that register allocator will not reuse it's
2055 // register for any other operand inside instruction.
2056 // Operand created by UseRegisterAtStart is guaranteed to be live only at
2057 // instruction start. Register allocator is free to assign the same register
2058 // to some other operand used inside instruction (i.e. temporary or
2059 // output).
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00002060 MUST_USE_RESULT LOperand* UseRegister(HValue* value);
2061 MUST_USE_RESULT LOperand* UseRegisterAtStart(HValue* value);
kasperl@chromium.orga5551262010-12-07 12:49:48 +00002062
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00002063 // An input operand in a register that may be trashed.
2064 MUST_USE_RESULT LOperand* UseTempRegister(HValue* value);
2065
2066 // An input operand in a register or stack slot.
2067 MUST_USE_RESULT LOperand* Use(HValue* value);
2068 MUST_USE_RESULT LOperand* UseAtStart(HValue* value);
2069
2070 // An input operand in a register, stack slot or a constant operand.
2071 MUST_USE_RESULT LOperand* UseOrConstant(HValue* value);
2072 MUST_USE_RESULT LOperand* UseOrConstantAtStart(HValue* value);
2073
2074 // An input operand in a register or a constant operand.
2075 MUST_USE_RESULT LOperand* UseRegisterOrConstant(HValue* value);
2076 MUST_USE_RESULT LOperand* UseRegisterOrConstantAtStart(HValue* value);
2077
2078 // An input operand in register, stack slot or a constant operand.
2079 // Will not be moved to a register even if one is freely available.
2080 MUST_USE_RESULT LOperand* UseAny(HValue* value);
2081
2082 // Temporary operand that must be in a register.
2083 MUST_USE_RESULT LUnallocated* TempRegister();
2084 MUST_USE_RESULT LOperand* FixedTemp(Register reg);
2085 MUST_USE_RESULT LOperand* FixedTemp(XMMRegister reg);
kasperl@chromium.orga5551262010-12-07 12:49:48 +00002086
2087 // Methods for setting up define-use relationships.
2088 // Return the same instruction that they are passed.
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +00002089 template<int I, int T>
2090 LInstruction* Define(LTemplateInstruction<1, I, T>* instr,
2091 LUnallocated* result);
2092 template<int I, int T>
2093 LInstruction* Define(LTemplateInstruction<1, I, T>* instr);
2094 template<int I, int T>
2095 LInstruction* DefineAsRegister(LTemplateInstruction<1, I, T>* instr);
2096 template<int I, int T>
2097 LInstruction* DefineAsSpilled(LTemplateInstruction<1, I, T>* instr,
2098 int index);
2099 template<int I, int T>
2100 LInstruction* DefineSameAsFirst(LTemplateInstruction<1, I, T>* instr);
2101 template<int I, int T>
2102 LInstruction* DefineFixed(LTemplateInstruction<1, I, T>* instr,
2103 Register reg);
2104 template<int I, int T>
2105 LInstruction* DefineFixedDouble(LTemplateInstruction<1, I, T>* instr,
2106 XMMRegister reg);
kasperl@chromium.orga5551262010-12-07 12:49:48 +00002107 LInstruction* AssignEnvironment(LInstruction* instr);
2108 LInstruction* AssignPointerMap(LInstruction* instr);
2109
2110 enum CanDeoptimize { CAN_DEOPTIMIZE_EAGERLY, CANNOT_DEOPTIMIZE_EAGERLY };
2111
2112 // By default we assume that instruction sequences generated for calls
2113 // cannot deoptimize eagerly and we do not attach environment to this
2114 // instruction.
2115 LInstruction* MarkAsCall(
2116 LInstruction* instr,
2117 HInstruction* hinstr,
2118 CanDeoptimize can_deoptimize = CANNOT_DEOPTIMIZE_EAGERLY);
kmillikin@chromium.orgd2c22f02011-01-10 08:15:37 +00002119 LInstruction* MarkAsSaveDoubles(LInstruction* instr);
kasperl@chromium.orga5551262010-12-07 12:49:48 +00002120
fschneider@chromium.org1df6b472011-01-26 08:23:03 +00002121 LInstruction* SetInstructionPendingDeoptimizationEnvironment(
2122 LInstruction* instr, int ast_id);
2123 void ClearInstructionPendingDeoptimizationEnvironment();
2124
kasperl@chromium.orga5551262010-12-07 12:49:48 +00002125 LEnvironment* CreateEnvironment(HEnvironment* hydrogen_env);
2126
kasperl@chromium.orga5551262010-12-07 12:49:48 +00002127 void VisitInstruction(HInstruction* current);
2128
2129 void DoBasicBlock(HBasicBlock* block, HBasicBlock* next_block);
2130 LInstruction* DoBit(Token::Value op, HBitwiseBinaryOperation* instr);
2131 LInstruction* DoShift(Token::Value op, HBitwiseBinaryOperation* instr);
2132 LInstruction* DoArithmeticD(Token::Value op,
2133 HArithmeticBinaryOperation* instr);
2134 LInstruction* DoArithmeticT(Token::Value op,
2135 HArithmeticBinaryOperation* instr);
2136
2137 LChunk* chunk_;
karlklose@chromium.org8f806e82011-03-07 14:06:08 +00002138 CompilationInfo* info_;
kasperl@chromium.orga5551262010-12-07 12:49:48 +00002139 HGraph* const graph_;
2140 Status status_;
2141 HInstruction* current_instruction_;
2142 HBasicBlock* current_block_;
2143 HBasicBlock* next_block_;
2144 int argument_count_;
2145 LAllocator* allocator_;
2146 int position_;
kmillikin@chromium.org31b12772011-02-02 16:08:26 +00002147 LInstruction* instruction_pending_deoptimization_environment_;
kasperl@chromium.orga5551262010-12-07 12:49:48 +00002148 int pending_deoptimization_ast_id_;
2149
2150 DISALLOW_COPY_AND_ASSIGN(LChunkBuilder);
2151};
2152
2153#undef DECLARE_HYDROGEN_ACCESSOR
2154#undef DECLARE_INSTRUCTION
2155#undef DECLARE_CONCRETE_INSTRUCTION
2156
2157} } // namespace v8::internal
2158
2159#endif // V8_IA32_LITHIUM_IA32_H_