Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1)

Side by Side Diff: src/ia32/lithium-ia32.h

Issue 7348008: Merge up to 8597 to experimental/gc from the bleeding edge. (Closed) Base URL: http://v8.googlecode.com/svn/branches/experimental/gc/
Patch Set: '' Created 9 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/ia32/lithium-gap-resolver-ia32.cc ('k') | src/ia32/lithium-ia32.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2011 the V8 project authors. All rights reserved. 1 // Copyright 2011 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 14 matching lines...) Expand all
25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 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. 26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 27
28 #ifndef V8_IA32_LITHIUM_IA32_H_ 28 #ifndef V8_IA32_LITHIUM_IA32_H_
29 #define V8_IA32_LITHIUM_IA32_H_ 29 #define V8_IA32_LITHIUM_IA32_H_
30 30
31 #include "hydrogen.h" 31 #include "hydrogen.h"
32 #include "lithium-allocator.h" 32 #include "lithium-allocator.h"
33 #include "lithium.h" 33 #include "lithium.h"
34 #include "safepoint-table.h" 34 #include "safepoint-table.h"
35 #include "utils.h"
35 36
36 namespace v8 { 37 namespace v8 {
37 namespace internal { 38 namespace internal {
38 39
39 // Forward declarations. 40 // Forward declarations.
40 class LCodeGen; 41 class LCodeGen;
41 42
42 #define LITHIUM_CONCRETE_INSTRUCTION_LIST(V) \ 43 #define LITHIUM_CONCRETE_INSTRUCTION_LIST(V) \
43 V(AccessArgumentsAt) \ 44 V(AccessArgumentsAt) \
44 V(AddI) \ 45 V(AddI) \
(...skipping 18 matching lines...) Expand all
63 V(CallStub) \ 64 V(CallStub) \
64 V(CheckFunction) \ 65 V(CheckFunction) \
65 V(CheckInstanceType) \ 66 V(CheckInstanceType) \
66 V(CheckMap) \ 67 V(CheckMap) \
67 V(CheckNonSmi) \ 68 V(CheckNonSmi) \
68 V(CheckPrototypeMaps) \ 69 V(CheckPrototypeMaps) \
69 V(CheckSmi) \ 70 V(CheckSmi) \
70 V(ClampDToUint8) \ 71 V(ClampDToUint8) \
71 V(ClampIToUint8) \ 72 V(ClampIToUint8) \
72 V(ClampTToUint8) \ 73 V(ClampTToUint8) \
73 V(ClassOfTest) \
74 V(ClassOfTestAndBranch) \ 74 V(ClassOfTestAndBranch) \
75 V(CmpID) \
76 V(CmpIDAndBranch) \ 75 V(CmpIDAndBranch) \
77 V(CmpJSObjectEq) \ 76 V(CmpObjectEqAndBranch) \
78 V(CmpJSObjectEqAndBranch) \
79 V(CmpSymbolEq) \
80 V(CmpSymbolEqAndBranch) \
81 V(CmpMapAndBranch) \ 77 V(CmpMapAndBranch) \
82 V(CmpT) \ 78 V(CmpT) \
83 V(CmpTAndBranch) \ 79 V(CmpConstantEqAndBranch) \
84 V(ConstantD) \ 80 V(ConstantD) \
85 V(ConstantI) \ 81 V(ConstantI) \
86 V(ConstantT) \ 82 V(ConstantT) \
87 V(Context) \ 83 V(Context) \
88 V(DeleteProperty) \ 84 V(DeleteProperty) \
89 V(Deoptimize) \ 85 V(Deoptimize) \
90 V(DivI) \ 86 V(DivI) \
91 V(DoubleToI) \ 87 V(DoubleToI) \
88 V(ElementsKind) \
92 V(ExternalArrayLength) \ 89 V(ExternalArrayLength) \
93 V(FixedArrayLength) \ 90 V(FixedArrayLength) \
94 V(FunctionLiteral) \ 91 V(FunctionLiteral) \
95 V(GetCachedArrayIndex) \ 92 V(GetCachedArrayIndex) \
96 V(GlobalObject) \ 93 V(GlobalObject) \
97 V(GlobalReceiver) \ 94 V(GlobalReceiver) \
98 V(Goto) \ 95 V(Goto) \
99 V(HasCachedArrayIndex) \
100 V(HasCachedArrayIndexAndBranch) \ 96 V(HasCachedArrayIndexAndBranch) \
101 V(HasInstanceType) \
102 V(HasInstanceTypeAndBranch) \ 97 V(HasInstanceTypeAndBranch) \
103 V(In) \ 98 V(In) \
104 V(InstanceOf) \ 99 V(InstanceOf) \
105 V(InstanceOfAndBranch) \
106 V(InstanceOfKnownGlobal) \ 100 V(InstanceOfKnownGlobal) \
107 V(InstructionGap) \ 101 V(InstructionGap) \
108 V(Integer32ToDouble) \ 102 V(Integer32ToDouble) \
109 V(InvokeFunction) \ 103 V(InvokeFunction) \
110 V(IsConstructCall) \
111 V(IsConstructCallAndBranch) \ 104 V(IsConstructCallAndBranch) \
112 V(IsNull) \
113 V(IsNullAndBranch) \ 105 V(IsNullAndBranch) \
114 V(IsObject) \
115 V(IsObjectAndBranch) \ 106 V(IsObjectAndBranch) \
116 V(IsSmi) \
117 V(IsSmiAndBranch) \ 107 V(IsSmiAndBranch) \
118 V(IsUndetectable) \
119 V(IsUndetectableAndBranch) \ 108 V(IsUndetectableAndBranch) \
120 V(JSArrayLength) \ 109 V(JSArrayLength) \
121 V(Label) \ 110 V(Label) \
122 V(LazyBailout) \ 111 V(LazyBailout) \
123 V(LoadContextSlot) \ 112 V(LoadContextSlot) \
124 V(LoadElements) \ 113 V(LoadElements) \
125 V(LoadExternalArrayPointer) \ 114 V(LoadExternalArrayPointer) \
126 V(LoadFunctionPrototype) \ 115 V(LoadFunctionPrototype) \
127 V(LoadGlobalCell) \ 116 V(LoadGlobalCell) \
128 V(LoadGlobalGeneric) \ 117 V(LoadGlobalGeneric) \
(...skipping 27 matching lines...) Expand all
156 V(StoreKeyedGeneric) \ 145 V(StoreKeyedGeneric) \
157 V(StoreKeyedSpecializedArrayElement) \ 146 V(StoreKeyedSpecializedArrayElement) \
158 V(StoreNamedField) \ 147 V(StoreNamedField) \
159 V(StoreNamedGeneric) \ 148 V(StoreNamedGeneric) \
160 V(StringAdd) \ 149 V(StringAdd) \
161 V(StringCharCodeAt) \ 150 V(StringCharCodeAt) \
162 V(StringCharFromCode) \ 151 V(StringCharFromCode) \
163 V(StringLength) \ 152 V(StringLength) \
164 V(SubI) \ 153 V(SubI) \
165 V(TaggedToI) \ 154 V(TaggedToI) \
155 V(ThisFunction) \
166 V(Throw) \ 156 V(Throw) \
167 V(ToFastProperties) \ 157 V(ToFastProperties) \
168 V(Typeof) \ 158 V(Typeof) \
169 V(TypeofIs) \
170 V(TypeofIsAndBranch) \ 159 V(TypeofIsAndBranch) \
171 V(UnaryMathOperation) \ 160 V(UnaryMathOperation) \
172 V(UnknownOSRValue) \ 161 V(UnknownOSRValue) \
173 V(ValueOf) 162 V(ValueOf)
174 163
175 164
176 #define DECLARE_CONCRETE_INSTRUCTION(type, mnemonic) \ 165 #define DECLARE_CONCRETE_INSTRUCTION(type, mnemonic) \
177 virtual Opcode opcode() const { return LInstruction::k##type; } \ 166 virtual Opcode opcode() const { return LInstruction::k##type; } \
178 virtual void CompileToNative(LCodeGen* generator); \ 167 virtual void CompileToNative(LCodeGen* generator); \
179 virtual const char* Mnemonic() const { return mnemonic; } \ 168 virtual const char* Mnemonic() const { return mnemonic; } \
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
218 #define DECLARE_PREDICATE(type) \ 207 #define DECLARE_PREDICATE(type) \
219 bool Is##type() const { return opcode() == k##type; } 208 bool Is##type() const { return opcode() == k##type; }
220 LITHIUM_CONCRETE_INSTRUCTION_LIST(DECLARE_PREDICATE) 209 LITHIUM_CONCRETE_INSTRUCTION_LIST(DECLARE_PREDICATE)
221 #undef DECLARE_PREDICATE 210 #undef DECLARE_PREDICATE
222 211
223 // Declare virtual predicates for instructions that don't have 212 // Declare virtual predicates for instructions that don't have
224 // an opcode. 213 // an opcode.
225 virtual bool IsGap() const { return false; } 214 virtual bool IsGap() const { return false; }
226 215
227 virtual bool IsControl() const { return false; } 216 virtual bool IsControl() const { return false; }
228 virtual void SetBranchTargets(int true_block_id, int false_block_id) { }
229 217
230 void set_environment(LEnvironment* env) { environment_ = env; } 218 void set_environment(LEnvironment* env) { environment_ = env; }
231 LEnvironment* environment() const { return environment_; } 219 LEnvironment* environment() const { return environment_; }
232 bool HasEnvironment() const { return environment_ != NULL; } 220 bool HasEnvironment() const { return environment_ != NULL; }
233 221
234 void set_pointer_map(LPointerMap* p) { pointer_map_.set(p); } 222 void set_pointer_map(LPointerMap* p) { pointer_map_.set(p); }
235 LPointerMap* pointer_map() const { return pointer_map_.get(); } 223 LPointerMap* pointer_map() const { return pointer_map_.get(); }
236 bool HasPointerMap() const { return pointer_map_.is_set(); } 224 bool HasPointerMap() const { return pointer_map_.is_set(); }
237 225
238 226
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
274 private: 262 private:
275 LEnvironment* environment_; 263 LEnvironment* environment_;
276 SetOncePointer<LPointerMap> pointer_map_; 264 SetOncePointer<LPointerMap> pointer_map_;
277 HValue* hydrogen_value_; 265 HValue* hydrogen_value_;
278 SetOncePointer<LEnvironment> deoptimization_environment_; 266 SetOncePointer<LEnvironment> deoptimization_environment_;
279 bool is_call_; 267 bool is_call_;
280 bool is_save_doubles_; 268 bool is_save_doubles_;
281 }; 269 };
282 270
283 271
284 template<typename ElementType, int NumElements>
285 class OperandContainer {
286 public:
287 OperandContainer() {
288 for (int i = 0; i < NumElements; i++) elems_[i] = NULL;
289 }
290 int length() { return NumElements; }
291 ElementType& operator[](int i) {
292 ASSERT(i < length());
293 return elems_[i];
294 }
295 void PrintOperandsTo(StringStream* stream);
296
297 private:
298 ElementType elems_[NumElements];
299 };
300
301
302 template<typename ElementType>
303 class OperandContainer<ElementType, 0> {
304 public:
305 int length() { return 0; }
306 void PrintOperandsTo(StringStream* stream) { }
307 ElementType& operator[](int i) {
308 UNREACHABLE();
309 static ElementType t = 0;
310 return t;
311 }
312 };
313
314
315 // R = number of result operands (0 or 1). 272 // R = number of result operands (0 or 1).
316 // I = number of input operands. 273 // I = number of input operands.
317 // T = number of temporary operands. 274 // T = number of temporary operands.
318 template<int R, int I, int T> 275 template<int R, int I, int T>
319 class LTemplateInstruction: public LInstruction { 276 class LTemplateInstruction: public LInstruction {
320 public: 277 public:
321 // Allow 0 or 1 output operands. 278 // Allow 0 or 1 output operands.
322 STATIC_ASSERT(R == 0 || R == 1); 279 STATIC_ASSERT(R == 0 || R == 1);
323 virtual bool HasResult() const { return R != 0; } 280 virtual bool HasResult() const { return R != 0; }
324 void set_result(LOperand* operand) { results_[0] = operand; } 281 void set_result(LOperand* operand) { results_[0] = operand; }
325 LOperand* result() { return results_[0]; } 282 LOperand* result() { return results_[0]; }
326 283
327 int InputCount() { return I; } 284 int InputCount() { return I; }
328 LOperand* InputAt(int i) { return inputs_[i]; } 285 LOperand* InputAt(int i) { return inputs_[i]; }
329 286
330 int TempCount() { return T; } 287 int TempCount() { return T; }
331 LOperand* TempAt(int i) { return temps_[i]; } 288 LOperand* TempAt(int i) { return temps_[i]; }
332 289
333 virtual void PrintDataTo(StringStream* stream); 290 virtual void PrintDataTo(StringStream* stream);
334 virtual void PrintOutputOperandTo(StringStream* stream); 291 virtual void PrintOutputOperandTo(StringStream* stream);
335 292
336 protected: 293 protected:
337 OperandContainer<LOperand*, R> results_; 294 EmbeddedContainer<LOperand*, R> results_;
338 OperandContainer<LOperand*, I> inputs_; 295 EmbeddedContainer<LOperand*, I> inputs_;
339 OperandContainer<LOperand*, T> temps_; 296 EmbeddedContainer<LOperand*, T> temps_;
340 }; 297 };
341 298
342 299
343 class LGap: public LTemplateInstruction<0, 0, 0> { 300 class LGap: public LTemplateInstruction<0, 0, 0> {
344 public: 301 public:
345 explicit LGap(HBasicBlock* block) : block_(block) { 302 explicit LGap(HBasicBlock* block) : block_(block) {
346 parallel_moves_[BEFORE] = NULL; 303 parallel_moves_[BEFORE] = NULL;
347 parallel_moves_[START] = NULL; 304 parallel_moves_[START] = NULL;
348 parallel_moves_[END] = NULL; 305 parallel_moves_[END] = NULL;
349 parallel_moves_[AFTER] = NULL; 306 parallel_moves_[AFTER] = NULL;
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
388 class LInstructionGap: public LGap { 345 class LInstructionGap: public LGap {
389 public: 346 public:
390 explicit LInstructionGap(HBasicBlock* block) : LGap(block) { } 347 explicit LInstructionGap(HBasicBlock* block) : LGap(block) { }
391 348
392 DECLARE_CONCRETE_INSTRUCTION(InstructionGap, "gap") 349 DECLARE_CONCRETE_INSTRUCTION(InstructionGap, "gap")
393 }; 350 };
394 351
395 352
396 class LGoto: public LTemplateInstruction<0, 0, 0> { 353 class LGoto: public LTemplateInstruction<0, 0, 0> {
397 public: 354 public:
398 LGoto(int block_id, bool include_stack_check = false) 355 explicit LGoto(int block_id) : block_id_(block_id) { }
399 : block_id_(block_id), include_stack_check_(include_stack_check) { }
400 356
401 DECLARE_CONCRETE_INSTRUCTION(Goto, "goto") 357 DECLARE_CONCRETE_INSTRUCTION(Goto, "goto")
402 virtual void PrintDataTo(StringStream* stream); 358 virtual void PrintDataTo(StringStream* stream);
403 virtual bool IsControl() const { return true; } 359 virtual bool IsControl() const { return true; }
404 360
405 int block_id() const { return block_id_; } 361 int block_id() const { return block_id_; }
406 bool include_stack_check() const { return include_stack_check_; }
407 362
408 private: 363 private:
409 int block_id_; 364 int block_id_;
410 bool include_stack_check_;
411 }; 365 };
412 366
413 367
414 class LLazyBailout: public LTemplateInstruction<0, 0, 0> { 368 class LLazyBailout: public LTemplateInstruction<0, 0, 0> {
415 public: 369 public:
416 LLazyBailout() : gap_instructions_size_(0) { } 370 LLazyBailout() : gap_instructions_size_(0) { }
417 371
418 DECLARE_CONCRETE_INSTRUCTION(LazyBailout, "lazy-bailout") 372 DECLARE_CONCRETE_INSTRUCTION(LazyBailout, "lazy-bailout")
419 373
420 void set_gap_instructions_size(int gap_instructions_size) { 374 void set_gap_instructions_size(int gap_instructions_size) {
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
482 public: 436 public:
483 DECLARE_CONCRETE_INSTRUCTION(UnknownOSRValue, "unknown-osr-value") 437 DECLARE_CONCRETE_INSTRUCTION(UnknownOSRValue, "unknown-osr-value")
484 }; 438 };
485 439
486 440
487 template<int I, int T> 441 template<int I, int T>
488 class LControlInstruction: public LTemplateInstruction<0, I, T> { 442 class LControlInstruction: public LTemplateInstruction<0, I, T> {
489 public: 443 public:
490 virtual bool IsControl() const { return true; } 444 virtual bool IsControl() const { return true; }
491 445
492 int true_block_id() const { return true_block_id_; } 446 int SuccessorCount() { return hydrogen()->SuccessorCount(); }
493 int false_block_id() const { return false_block_id_; } 447 HBasicBlock* SuccessorAt(int i) { return hydrogen()->SuccessorAt(i); }
494 void SetBranchTargets(int true_block_id, int false_block_id) { 448 int true_block_id() { return hydrogen()->SuccessorAt(0)->block_id(); }
495 true_block_id_ = true_block_id; 449 int false_block_id() { return hydrogen()->SuccessorAt(1)->block_id(); }
496 false_block_id_ = false_block_id;
497 }
498 450
499 private: 451 private:
500 int true_block_id_; 452 HControlInstruction* hydrogen() {
501 int false_block_id_; 453 return HControlInstruction::cast(this->hydrogen_value());
454 }
502 }; 455 };
503 456
504 457
505 class LApplyArguments: public LTemplateInstruction<1, 4, 1> { 458 class LApplyArguments: public LTemplateInstruction<1, 4, 1> {
506 public: 459 public:
507 LApplyArguments(LOperand* function, 460 LApplyArguments(LOperand* function,
508 LOperand* receiver, 461 LOperand* receiver,
509 LOperand* length, 462 LOperand* length,
510 LOperand* elements, 463 LOperand* elements,
511 LOperand* temp) { 464 LOperand* temp) {
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
593 inputs_[0] = left; 546 inputs_[0] = left;
594 inputs_[1] = right; 547 inputs_[1] = right;
595 temps_[0] = temp; 548 temps_[0] = temp;
596 } 549 }
597 550
598 DECLARE_CONCRETE_INSTRUCTION(MulI, "mul-i") 551 DECLARE_CONCRETE_INSTRUCTION(MulI, "mul-i")
599 DECLARE_HYDROGEN_ACCESSOR(Mul) 552 DECLARE_HYDROGEN_ACCESSOR(Mul)
600 }; 553 };
601 554
602 555
603 class LCmpID: public LTemplateInstruction<1, 2, 0> {
604 public:
605 LCmpID(LOperand* left, LOperand* right) {
606 inputs_[0] = left;
607 inputs_[1] = right;
608 }
609
610 DECLARE_CONCRETE_INSTRUCTION(CmpID, "cmp-id")
611 DECLARE_HYDROGEN_ACCESSOR(Compare)
612
613 Token::Value op() const { return hydrogen()->token(); }
614 bool is_double() const {
615 return hydrogen()->GetInputRepresentation().IsDouble();
616 }
617 };
618
619
620 class LCmpIDAndBranch: public LControlInstruction<2, 0> { 556 class LCmpIDAndBranch: public LControlInstruction<2, 0> {
621 public: 557 public:
622 LCmpIDAndBranch(LOperand* left, LOperand* right) { 558 LCmpIDAndBranch(LOperand* left, LOperand* right) {
623 inputs_[0] = left; 559 inputs_[0] = left;
624 inputs_[1] = right; 560 inputs_[1] = right;
625 } 561 }
626 562
627 DECLARE_CONCRETE_INSTRUCTION(CmpIDAndBranch, "cmp-id-and-branch") 563 DECLARE_CONCRETE_INSTRUCTION(CmpIDAndBranch, "cmp-id-and-branch")
628 DECLARE_HYDROGEN_ACCESSOR(Compare) 564 DECLARE_HYDROGEN_ACCESSOR(CompareIDAndBranch)
629 565
630 Token::Value op() const { return hydrogen()->token(); } 566 Token::Value op() const { return hydrogen()->token(); }
631 bool is_double() const { 567 bool is_double() const {
632 return hydrogen()->GetInputRepresentation().IsDouble(); 568 return hydrogen()->GetInputRepresentation().IsDouble();
633 } 569 }
634 570
635 virtual void PrintDataTo(StringStream* stream); 571 virtual void PrintDataTo(StringStream* stream);
636 }; 572 };
637 573
638 574
639 class LUnaryMathOperation: public LTemplateInstruction<1, 1, 0> { 575 class LUnaryMathOperation: public LTemplateInstruction<1, 2, 0> {
640 public: 576 public:
641 explicit LUnaryMathOperation(LOperand* value) { 577 LUnaryMathOperation(LOperand* context, LOperand* value) {
578 inputs_[1] = context;
642 inputs_[0] = value; 579 inputs_[0] = value;
643 } 580 }
644 581
582 LOperand* context() { return inputs_[1]; }
583 LOperand* value() { return inputs_[0]; }
584
645 DECLARE_CONCRETE_INSTRUCTION(UnaryMathOperation, "unary-math-operation") 585 DECLARE_CONCRETE_INSTRUCTION(UnaryMathOperation, "unary-math-operation")
646 DECLARE_HYDROGEN_ACCESSOR(UnaryMathOperation) 586 DECLARE_HYDROGEN_ACCESSOR(UnaryMathOperation)
647 587
648 virtual void PrintDataTo(StringStream* stream); 588 virtual void PrintDataTo(StringStream* stream);
649 BuiltinFunctionId op() const { return hydrogen()->op(); } 589 BuiltinFunctionId op() const { return hydrogen()->op(); }
650 }; 590 };
651 591
652 592
653 class LCmpJSObjectEq: public LTemplateInstruction<1, 2, 0> { 593 class LCmpObjectEqAndBranch: public LControlInstruction<2, 0> {
654 public: 594 public:
655 LCmpJSObjectEq(LOperand* left, LOperand* right) { 595 LCmpObjectEqAndBranch(LOperand* left, LOperand* right) {
656 inputs_[0] = left; 596 inputs_[0] = left;
657 inputs_[1] = right; 597 inputs_[1] = right;
658 } 598 }
659 599
660 DECLARE_CONCRETE_INSTRUCTION(CmpJSObjectEq, "cmp-jsobject-eq") 600 DECLARE_CONCRETE_INSTRUCTION(CmpObjectEqAndBranch,
601 "cmp-object-eq-and-branch")
661 }; 602 };
662 603
663 604
664 class LCmpJSObjectEqAndBranch: public LControlInstruction<2, 0> { 605 class LCmpConstantEqAndBranch: public LControlInstruction<1, 0> {
665 public: 606 public:
666 LCmpJSObjectEqAndBranch(LOperand* left, LOperand* right) { 607 explicit LCmpConstantEqAndBranch(LOperand* left) {
667 inputs_[0] = left; 608 inputs_[0] = left;
668 inputs_[1] = right;
669 } 609 }
670 610
671 DECLARE_CONCRETE_INSTRUCTION(CmpJSObjectEqAndBranch, 611 DECLARE_CONCRETE_INSTRUCTION(CmpConstantEqAndBranch,
672 "cmp-jsobject-eq-and-branch") 612 "cmp-constant-eq-and-branch")
673 }; 613 DECLARE_HYDROGEN_ACCESSOR(CompareConstantEqAndBranch)
674
675
676 class LCmpSymbolEq: public LTemplateInstruction<1, 2, 0> {
677 public:
678 LCmpSymbolEq(LOperand* left, LOperand* right) {
679 inputs_[0] = left;
680 inputs_[1] = right;
681 }
682
683 DECLARE_CONCRETE_INSTRUCTION(CmpSymbolEq, "cmp-symbol-eq")
684 };
685
686
687 class LCmpSymbolEqAndBranch: public LControlInstruction<2, 0> {
688 public:
689 LCmpSymbolEqAndBranch(LOperand* left, LOperand* right) {
690 inputs_[0] = left;
691 inputs_[1] = right;
692 }
693
694 DECLARE_CONCRETE_INSTRUCTION(CmpSymbolEqAndBranch, "cmp-symbol-eq-and-branch")
695 };
696
697
698 class LIsNull: public LTemplateInstruction<1, 1, 0> {
699 public:
700 explicit LIsNull(LOperand* value) {
701 inputs_[0] = value;
702 }
703
704 DECLARE_CONCRETE_INSTRUCTION(IsNull, "is-null")
705 DECLARE_HYDROGEN_ACCESSOR(IsNull)
706
707 bool is_strict() const { return hydrogen()->is_strict(); }
708 }; 614 };
709 615
710 616
711 class LIsNullAndBranch: public LControlInstruction<1, 1> { 617 class LIsNullAndBranch: public LControlInstruction<1, 1> {
712 public: 618 public:
713 LIsNullAndBranch(LOperand* value, LOperand* temp) { 619 LIsNullAndBranch(LOperand* value, LOperand* temp) {
714 inputs_[0] = value; 620 inputs_[0] = value;
715 temps_[0] = temp; 621 temps_[0] = temp;
716 } 622 }
717 623
718 DECLARE_CONCRETE_INSTRUCTION(IsNullAndBranch, "is-null-and-branch") 624 DECLARE_CONCRETE_INSTRUCTION(IsNullAndBranch, "is-null-and-branch")
719 DECLARE_HYDROGEN_ACCESSOR(IsNull) 625 DECLARE_HYDROGEN_ACCESSOR(IsNullAndBranch)
720 626
721 bool is_strict() const { return hydrogen()->is_strict(); } 627 bool is_strict() const { return hydrogen()->is_strict(); }
722 628
723 virtual void PrintDataTo(StringStream* stream); 629 virtual void PrintDataTo(StringStream* stream);
724 }; 630 };
725 631
726 632
727 class LIsObject: public LTemplateInstruction<1, 1, 1> { 633 class LIsObjectAndBranch: public LControlInstruction<1, 1> {
728 public: 634 public:
729 LIsObject(LOperand* value, LOperand* temp) { 635 LIsObjectAndBranch(LOperand* value, LOperand* temp) {
730 inputs_[0] = value; 636 inputs_[0] = value;
731 temps_[0] = temp; 637 temps_[0] = temp;
732 } 638 }
733 639
734 DECLARE_CONCRETE_INSTRUCTION(IsObject, "is-object")
735 };
736
737
738 class LIsObjectAndBranch: public LControlInstruction<1, 2> {
739 public:
740 LIsObjectAndBranch(LOperand* value, LOperand* temp, LOperand* temp2) {
741 inputs_[0] = value;
742 temps_[0] = temp;
743 temps_[1] = temp2;
744 }
745
746 DECLARE_CONCRETE_INSTRUCTION(IsObjectAndBranch, "is-object-and-branch") 640 DECLARE_CONCRETE_INSTRUCTION(IsObjectAndBranch, "is-object-and-branch")
747 641
748 virtual void PrintDataTo(StringStream* stream); 642 virtual void PrintDataTo(StringStream* stream);
749 }; 643 };
750 644
751 645
752 class LIsSmi: public LTemplateInstruction<1, 1, 0> {
753 public:
754 explicit LIsSmi(LOperand* value) {
755 inputs_[0] = value;
756 }
757
758 DECLARE_CONCRETE_INSTRUCTION(IsSmi, "is-smi")
759 DECLARE_HYDROGEN_ACCESSOR(IsSmi)
760 };
761
762
763 class LIsSmiAndBranch: public LControlInstruction<1, 0> { 646 class LIsSmiAndBranch: public LControlInstruction<1, 0> {
764 public: 647 public:
765 explicit LIsSmiAndBranch(LOperand* value) { 648 explicit LIsSmiAndBranch(LOperand* value) {
766 inputs_[0] = value; 649 inputs_[0] = value;
767 } 650 }
768 651
769 DECLARE_CONCRETE_INSTRUCTION(IsSmiAndBranch, "is-smi-and-branch") 652 DECLARE_CONCRETE_INSTRUCTION(IsSmiAndBranch, "is-smi-and-branch")
653 DECLARE_HYDROGEN_ACCESSOR(IsSmiAndBranch)
770 654
771 virtual void PrintDataTo(StringStream* stream); 655 virtual void PrintDataTo(StringStream* stream);
772 }; 656 };
773 657
774 658
775 class LIsUndetectable: public LTemplateInstruction<1, 1, 0> {
776 public:
777 explicit LIsUndetectable(LOperand* value) {
778 inputs_[0] = value;
779 }
780
781 DECLARE_CONCRETE_INSTRUCTION(IsUndetectable, "is-undetectable")
782 DECLARE_HYDROGEN_ACCESSOR(IsUndetectable)
783 };
784
785
786 class LIsUndetectableAndBranch: public LControlInstruction<1, 1> { 659 class LIsUndetectableAndBranch: public LControlInstruction<1, 1> {
787 public: 660 public:
788 explicit LIsUndetectableAndBranch(LOperand* value, LOperand* temp) { 661 LIsUndetectableAndBranch(LOperand* value, LOperand* temp) {
789 inputs_[0] = value; 662 inputs_[0] = value;
790 temps_[0] = temp; 663 temps_[0] = temp;
791 } 664 }
792 665
793 DECLARE_CONCRETE_INSTRUCTION(IsUndetectableAndBranch, 666 DECLARE_CONCRETE_INSTRUCTION(IsUndetectableAndBranch,
794 "is-undetectable-and-branch") 667 "is-undetectable-and-branch")
795 668
796 virtual void PrintDataTo(StringStream* stream); 669 virtual void PrintDataTo(StringStream* stream);
797 }; 670 };
798 671
799 672
800 class LHasInstanceType: public LTemplateInstruction<1, 1, 0> {
801 public:
802 explicit LHasInstanceType(LOperand* value) {
803 inputs_[0] = value;
804 }
805
806 DECLARE_CONCRETE_INSTRUCTION(HasInstanceType, "has-instance-type")
807 DECLARE_HYDROGEN_ACCESSOR(HasInstanceType)
808 };
809
810
811 class LHasInstanceTypeAndBranch: public LControlInstruction<1, 1> { 673 class LHasInstanceTypeAndBranch: public LControlInstruction<1, 1> {
812 public: 674 public:
813 LHasInstanceTypeAndBranch(LOperand* value, LOperand* temp) { 675 LHasInstanceTypeAndBranch(LOperand* value, LOperand* temp) {
814 inputs_[0] = value; 676 inputs_[0] = value;
815 temps_[0] = temp; 677 temps_[0] = temp;
816 } 678 }
817 679
818 DECLARE_CONCRETE_INSTRUCTION(HasInstanceTypeAndBranch, 680 DECLARE_CONCRETE_INSTRUCTION(HasInstanceTypeAndBranch,
819 "has-instance-type-and-branch") 681 "has-instance-type-and-branch")
820 DECLARE_HYDROGEN_ACCESSOR(HasInstanceType) 682 DECLARE_HYDROGEN_ACCESSOR(HasInstanceTypeAndBranch)
821 683
822 virtual void PrintDataTo(StringStream* stream); 684 virtual void PrintDataTo(StringStream* stream);
823 }; 685 };
824 686
825 687
826 class LGetCachedArrayIndex: public LTemplateInstruction<1, 1, 0> { 688 class LGetCachedArrayIndex: public LTemplateInstruction<1, 1, 0> {
827 public: 689 public:
828 explicit LGetCachedArrayIndex(LOperand* value) { 690 explicit LGetCachedArrayIndex(LOperand* value) {
829 inputs_[0] = value; 691 inputs_[0] = value;
830 } 692 }
831 693
832 DECLARE_CONCRETE_INSTRUCTION(GetCachedArrayIndex, "get-cached-array-index") 694 DECLARE_CONCRETE_INSTRUCTION(GetCachedArrayIndex, "get-cached-array-index")
833 DECLARE_HYDROGEN_ACCESSOR(GetCachedArrayIndex) 695 DECLARE_HYDROGEN_ACCESSOR(GetCachedArrayIndex)
834 }; 696 };
835 697
836 698
837 class LHasCachedArrayIndex: public LTemplateInstruction<1, 1, 0> {
838 public:
839 explicit LHasCachedArrayIndex(LOperand* value) {
840 inputs_[0] = value;
841 }
842
843 DECLARE_CONCRETE_INSTRUCTION(HasCachedArrayIndex, "has-cached-array-index")
844 DECLARE_HYDROGEN_ACCESSOR(HasCachedArrayIndex)
845 };
846
847
848 class LHasCachedArrayIndexAndBranch: public LControlInstruction<1, 0> { 699 class LHasCachedArrayIndexAndBranch: public LControlInstruction<1, 0> {
849 public: 700 public:
850 explicit LHasCachedArrayIndexAndBranch(LOperand* value) { 701 explicit LHasCachedArrayIndexAndBranch(LOperand* value) {
851 inputs_[0] = value; 702 inputs_[0] = value;
852 } 703 }
853 704
854 DECLARE_CONCRETE_INSTRUCTION(HasCachedArrayIndexAndBranch, 705 DECLARE_CONCRETE_INSTRUCTION(HasCachedArrayIndexAndBranch,
855 "has-cached-array-index-and-branch") 706 "has-cached-array-index-and-branch")
856 virtual void PrintDataTo(StringStream* stream); 707 virtual void PrintDataTo(StringStream* stream);
857 }; 708 };
858 709
859 710
860 class LIsConstructCall: public LTemplateInstruction<1, 0, 0> {
861 public:
862 DECLARE_CONCRETE_INSTRUCTION(IsConstructCall, "is-construct-call")
863 DECLARE_HYDROGEN_ACCESSOR(IsConstructCall)
864 };
865
866
867 class LIsConstructCallAndBranch: public LControlInstruction<0, 1> { 711 class LIsConstructCallAndBranch: public LControlInstruction<0, 1> {
868 public: 712 public:
869 explicit LIsConstructCallAndBranch(LOperand* temp) { 713 explicit LIsConstructCallAndBranch(LOperand* temp) {
870 temps_[0] = temp; 714 temps_[0] = temp;
871 } 715 }
872 716
873 DECLARE_CONCRETE_INSTRUCTION(IsConstructCallAndBranch, 717 DECLARE_CONCRETE_INSTRUCTION(IsConstructCallAndBranch,
874 "is-construct-call-and-branch") 718 "is-construct-call-and-branch")
875 }; 719 };
876 720
877 721
878 class LClassOfTest: public LTemplateInstruction<1, 1, 1> {
879 public:
880 LClassOfTest(LOperand* value, LOperand* temp) {
881 inputs_[0] = value;
882 temps_[0] = temp;
883 }
884
885 DECLARE_CONCRETE_INSTRUCTION(ClassOfTest, "class-of-test")
886 DECLARE_HYDROGEN_ACCESSOR(ClassOfTest)
887
888 virtual void PrintDataTo(StringStream* stream);
889 };
890
891
892 class LClassOfTestAndBranch: public LControlInstruction<1, 2> { 722 class LClassOfTestAndBranch: public LControlInstruction<1, 2> {
893 public: 723 public:
894 LClassOfTestAndBranch(LOperand* value, LOperand* temp, LOperand* temp2) { 724 LClassOfTestAndBranch(LOperand* value, LOperand* temp, LOperand* temp2) {
895 inputs_[0] = value; 725 inputs_[0] = value;
896 temps_[0] = temp; 726 temps_[0] = temp;
897 temps_[1] = temp2; 727 temps_[1] = temp2;
898 } 728 }
899 729
900 DECLARE_CONCRETE_INSTRUCTION(ClassOfTestAndBranch, 730 DECLARE_CONCRETE_INSTRUCTION(ClassOfTestAndBranch,
901 "class-of-test-and-branch") 731 "class-of-test-and-branch")
902 DECLARE_HYDROGEN_ACCESSOR(ClassOfTest) 732 DECLARE_HYDROGEN_ACCESSOR(ClassOfTestAndBranch)
903 733
904 virtual void PrintDataTo(StringStream* stream); 734 virtual void PrintDataTo(StringStream* stream);
905 }; 735 };
906 736
907 737
908 class LCmpT: public LTemplateInstruction<1, 2, 0> { 738 class LCmpT: public LTemplateInstruction<1, 3, 0> {
909 public: 739 public:
910 LCmpT(LOperand* left, LOperand* right) { 740 LCmpT(LOperand* context, LOperand* left, LOperand* right) {
911 inputs_[0] = left; 741 inputs_[0] = context;
912 inputs_[1] = right; 742 inputs_[1] = left;
743 inputs_[2] = right;
913 } 744 }
914 745
915 DECLARE_CONCRETE_INSTRUCTION(CmpT, "cmp-t") 746 DECLARE_CONCRETE_INSTRUCTION(CmpT, "cmp-t")
916 DECLARE_HYDROGEN_ACCESSOR(Compare) 747 DECLARE_HYDROGEN_ACCESSOR(CompareGeneric)
917
918 Token::Value op() const { return hydrogen()->token(); }
919 };
920
921
922 class LCmpTAndBranch: public LControlInstruction<2, 0> {
923 public:
924 LCmpTAndBranch(LOperand* left, LOperand* right) {
925 inputs_[0] = left;
926 inputs_[1] = right;
927 }
928
929 DECLARE_CONCRETE_INSTRUCTION(CmpTAndBranch, "cmp-t-and-branch")
930 DECLARE_HYDROGEN_ACCESSOR(Compare)
931 748
932 Token::Value op() const { return hydrogen()->token(); } 749 Token::Value op() const { return hydrogen()->token(); }
933 }; 750 };
934 751
935 752
936 class LInstanceOf: public LTemplateInstruction<1, 3, 0> { 753 class LInstanceOf: public LTemplateInstruction<1, 3, 0> {
937 public: 754 public:
938 LInstanceOf(LOperand* context, LOperand* left, LOperand* right) { 755 LInstanceOf(LOperand* context, LOperand* left, LOperand* right) {
939 inputs_[0] = context; 756 inputs_[0] = context;
940 inputs_[1] = left; 757 inputs_[1] = left;
941 inputs_[2] = right; 758 inputs_[2] = right;
942 } 759 }
943 760
944 DECLARE_CONCRETE_INSTRUCTION(InstanceOf, "instance-of") 761 DECLARE_CONCRETE_INSTRUCTION(InstanceOf, "instance-of")
945 762
946 LOperand* context() { return inputs_[0]; } 763 LOperand* context() { return inputs_[0]; }
947 }; 764 };
948 765
949 766
950 class LInstanceOfAndBranch: public LControlInstruction<3, 0> { 767 class LInstanceOfKnownGlobal: public LTemplateInstruction<1, 2, 1> {
951 public: 768 public:
952 LInstanceOfAndBranch(LOperand* context, LOperand* left, LOperand* right) { 769 LInstanceOfKnownGlobal(LOperand* context, LOperand* value, LOperand* temp) {
953 inputs_[0] = context; 770 inputs_[0] = context;
954 inputs_[1] = left; 771 inputs_[1] = value;
955 inputs_[2] = right;
956 }
957
958 DECLARE_CONCRETE_INSTRUCTION(InstanceOfAndBranch, "instance-of-and-branch")
959
960 LOperand* context() { return inputs_[0]; }
961 };
962
963
964 class LInstanceOfKnownGlobal: public LTemplateInstruction<1, 1, 1> {
965 public:
966 LInstanceOfKnownGlobal(LOperand* value, LOperand* temp) {
967 inputs_[0] = value;
968 temps_[0] = temp; 772 temps_[0] = temp;
969 } 773 }
970 774
971 DECLARE_CONCRETE_INSTRUCTION(InstanceOfKnownGlobal, 775 DECLARE_CONCRETE_INSTRUCTION(InstanceOfKnownGlobal,
972 "instance-of-known-global") 776 "instance-of-known-global")
973 DECLARE_HYDROGEN_ACCESSOR(InstanceOfKnownGlobal) 777 DECLARE_HYDROGEN_ACCESSOR(InstanceOfKnownGlobal)
974 778
975 Handle<JSFunction> function() const { return hydrogen()->function(); } 779 Handle<JSFunction> function() const { return hydrogen()->function(); }
976 }; 780 };
977 781
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
1070 }; 874 };
1071 875
1072 876
1073 class LBranch: public LControlInstruction<1, 0> { 877 class LBranch: public LControlInstruction<1, 0> {
1074 public: 878 public:
1075 explicit LBranch(LOperand* value) { 879 explicit LBranch(LOperand* value) {
1076 inputs_[0] = value; 880 inputs_[0] = value;
1077 } 881 }
1078 882
1079 DECLARE_CONCRETE_INSTRUCTION(Branch, "branch") 883 DECLARE_CONCRETE_INSTRUCTION(Branch, "branch")
1080 DECLARE_HYDROGEN_ACCESSOR(Value) 884 DECLARE_HYDROGEN_ACCESSOR(Branch)
1081 885
1082 virtual void PrintDataTo(StringStream* stream); 886 virtual void PrintDataTo(StringStream* stream);
1083 }; 887 };
1084 888
1085 889
1086 class LCmpMapAndBranch: public LTemplateInstruction<0, 1, 0> { 890 class LCmpMapAndBranch: public LTemplateInstruction<0, 1, 0> {
1087 public: 891 public:
1088 explicit LCmpMapAndBranch(LOperand* value) { 892 explicit LCmpMapAndBranch(LOperand* value) {
1089 inputs_[0] = value; 893 inputs_[0] = value;
1090 } 894 }
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
1130 public: 934 public:
1131 explicit LFixedArrayLength(LOperand* value) { 935 explicit LFixedArrayLength(LOperand* value) {
1132 inputs_[0] = value; 936 inputs_[0] = value;
1133 } 937 }
1134 938
1135 DECLARE_CONCRETE_INSTRUCTION(FixedArrayLength, "fixed-array-length") 939 DECLARE_CONCRETE_INSTRUCTION(FixedArrayLength, "fixed-array-length")
1136 DECLARE_HYDROGEN_ACCESSOR(FixedArrayLength) 940 DECLARE_HYDROGEN_ACCESSOR(FixedArrayLength)
1137 }; 941 };
1138 942
1139 943
944 class LElementsKind: public LTemplateInstruction<1, 1, 0> {
945 public:
946 explicit LElementsKind(LOperand* value) {
947 inputs_[0] = value;
948 }
949
950 DECLARE_CONCRETE_INSTRUCTION(ElementsKind, "elements-kind")
951 DECLARE_HYDROGEN_ACCESSOR(ElementsKind)
952 };
953
954
1140 class LValueOf: public LTemplateInstruction<1, 1, 1> { 955 class LValueOf: public LTemplateInstruction<1, 1, 1> {
1141 public: 956 public:
1142 LValueOf(LOperand* value, LOperand* temp) { 957 LValueOf(LOperand* value, LOperand* temp) {
1143 inputs_[0] = value; 958 inputs_[0] = value;
1144 temps_[0] = temp; 959 temps_[0] = temp;
1145 } 960 }
1146 961
1147 DECLARE_CONCRETE_INSTRUCTION(ValueOf, "value-of") 962 DECLARE_CONCRETE_INSTRUCTION(ValueOf, "value-of")
1148 DECLARE_HYDROGEN_ACCESSOR(ValueOf) 963 DECLARE_HYDROGEN_ACCESSOR(ValueOf)
1149 }; 964 };
1150 965
1151 966
1152 class LThrow: public LTemplateInstruction<0, 1, 0> { 967 class LThrow: public LTemplateInstruction<0, 2, 0> {
1153 public: 968 public:
1154 explicit LThrow(LOperand* value) { 969 LThrow(LOperand* context, LOperand* value) {
1155 inputs_[0] = value; 970 inputs_[0] = context;
971 inputs_[1] = value;
1156 } 972 }
1157 973
974 LOperand* context() { return inputs_[0]; }
975 LOperand* value() { return inputs_[1]; }
976
1158 DECLARE_CONCRETE_INSTRUCTION(Throw, "throw") 977 DECLARE_CONCRETE_INSTRUCTION(Throw, "throw")
1159 }; 978 };
1160 979
1161 980
1162 class LBitNotI: public LTemplateInstruction<1, 1, 0> { 981 class LBitNotI: public LTemplateInstruction<1, 1, 0> {
1163 public: 982 public:
1164 explicit LBitNotI(LOperand* value) { 983 explicit LBitNotI(LOperand* value) {
1165 inputs_[0] = value; 984 inputs_[0] = value;
1166 } 985 }
1167 986
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
1205 1024
1206 virtual Opcode opcode() const { return LInstruction::kArithmeticD; } 1025 virtual Opcode opcode() const { return LInstruction::kArithmeticD; }
1207 virtual void CompileToNative(LCodeGen* generator); 1026 virtual void CompileToNative(LCodeGen* generator);
1208 virtual const char* Mnemonic() const; 1027 virtual const char* Mnemonic() const;
1209 1028
1210 private: 1029 private:
1211 Token::Value op_; 1030 Token::Value op_;
1212 }; 1031 };
1213 1032
1214 1033
1215 class LArithmeticT: public LTemplateInstruction<1, 2, 0> { 1034 class LArithmeticT: public LTemplateInstruction<1, 3, 0> {
1216 public: 1035 public:
1217 LArithmeticT(Token::Value op, LOperand* left, LOperand* right) 1036 LArithmeticT(Token::Value op,
1037 LOperand* context,
1038 LOperand* left,
1039 LOperand* right)
1218 : op_(op) { 1040 : op_(op) {
1219 inputs_[0] = left; 1041 inputs_[0] = context;
1220 inputs_[1] = right; 1042 inputs_[1] = left;
1043 inputs_[2] = right;
1221 } 1044 }
1222 1045
1223 virtual Opcode opcode() const { return LInstruction::kArithmeticT; } 1046 virtual Opcode opcode() const { return LInstruction::kArithmeticT; }
1224 virtual void CompileToNative(LCodeGen* generator); 1047 virtual void CompileToNative(LCodeGen* generator);
1225 virtual const char* Mnemonic() const; 1048 virtual const char* Mnemonic() const;
1226 1049
1227 Token::Value op() const { return op_; } 1050 Token::Value op() const { return op_; }
1051 LOperand* context() { return inputs_[0]; }
1052 LOperand* left() { return inputs_[1]; }
1053 LOperand* right() { return inputs_[2]; }
1228 1054
1229 private: 1055 private:
1230 Token::Value op_; 1056 Token::Value op_;
1231 }; 1057 };
1232 1058
1233 1059
1234 class LReturn: public LTemplateInstruction<0, 1, 0> { 1060 class LReturn: public LTemplateInstruction<0, 1, 0> {
1235 public: 1061 public:
1236 explicit LReturn(LOperand* value) { 1062 explicit LReturn(LOperand* value) {
1237 inputs_[0] = value; 1063 inputs_[0] = value;
1238 } 1064 }
1239 1065
1240 DECLARE_CONCRETE_INSTRUCTION(Return, "return") 1066 DECLARE_CONCRETE_INSTRUCTION(Return, "return")
1241 }; 1067 };
1242 1068
1243 1069
1244 class LLoadNamedField: public LTemplateInstruction<1, 1, 0> { 1070 class LLoadNamedField: public LTemplateInstruction<1, 1, 0> {
1245 public: 1071 public:
1246 explicit LLoadNamedField(LOperand* object) { 1072 explicit LLoadNamedField(LOperand* object) {
1247 inputs_[0] = object; 1073 inputs_[0] = object;
1248 } 1074 }
1249 1075
1250 DECLARE_CONCRETE_INSTRUCTION(LoadNamedField, "load-named-field") 1076 DECLARE_CONCRETE_INSTRUCTION(LoadNamedField, "load-named-field")
1251 DECLARE_HYDROGEN_ACCESSOR(LoadNamedField) 1077 DECLARE_HYDROGEN_ACCESSOR(LoadNamedField)
1252 1078
1253 LOperand* object() { return inputs_[0]; } 1079 LOperand* object() { return inputs_[0]; }
1254 }; 1080 };
1255 1081
1256 1082
1257 class LLoadNamedFieldPolymorphic: public LTemplateInstruction<1, 1, 0> { 1083 class LLoadNamedFieldPolymorphic: public LTemplateInstruction<1, 2, 0> {
1258 public: 1084 public:
1259 explicit LLoadNamedFieldPolymorphic(LOperand* object) { 1085 LLoadNamedFieldPolymorphic(LOperand* context, LOperand* object) {
1260 inputs_[0] = object; 1086 inputs_[0] = context;
1087 inputs_[1] = object;
1261 } 1088 }
1262 1089
1263 DECLARE_CONCRETE_INSTRUCTION(LoadNamedField, "load-named-field-polymorphic") 1090 DECLARE_CONCRETE_INSTRUCTION(LoadNamedField, "load-named-field-polymorphic")
1264 DECLARE_HYDROGEN_ACCESSOR(LoadNamedFieldPolymorphic) 1091 DECLARE_HYDROGEN_ACCESSOR(LoadNamedFieldPolymorphic)
1265 1092
1266 LOperand* object() { return inputs_[0]; } 1093 LOperand* context() { return inputs_[0]; }
1094 LOperand* object() { return inputs_[1]; }
1267 }; 1095 };
1268 1096
1269 1097
1270 class LLoadNamedGeneric: public LTemplateInstruction<1, 2, 0> { 1098 class LLoadNamedGeneric: public LTemplateInstruction<1, 2, 0> {
1271 public: 1099 public:
1272 LLoadNamedGeneric(LOperand* context, LOperand* object) { 1100 LLoadNamedGeneric(LOperand* context, LOperand* object) {
1273 inputs_[0] = context; 1101 inputs_[0] = context;
1274 inputs_[1] = object; 1102 inputs_[1] = object;
1275 } 1103 }
1276 1104
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
1340 inputs_[0] = external_pointer; 1168 inputs_[0] = external_pointer;
1341 inputs_[1] = key; 1169 inputs_[1] = key;
1342 } 1170 }
1343 1171
1344 DECLARE_CONCRETE_INSTRUCTION(LoadKeyedSpecializedArrayElement, 1172 DECLARE_CONCRETE_INSTRUCTION(LoadKeyedSpecializedArrayElement,
1345 "load-keyed-specialized-array-element") 1173 "load-keyed-specialized-array-element")
1346 DECLARE_HYDROGEN_ACCESSOR(LoadKeyedSpecializedArrayElement) 1174 DECLARE_HYDROGEN_ACCESSOR(LoadKeyedSpecializedArrayElement)
1347 1175
1348 LOperand* external_pointer() { return inputs_[0]; } 1176 LOperand* external_pointer() { return inputs_[0]; }
1349 LOperand* key() { return inputs_[1]; } 1177 LOperand* key() { return inputs_[1]; }
1350 ExternalArrayType array_type() const { 1178 JSObject::ElementsKind elements_kind() const {
1351 return hydrogen()->array_type(); 1179 return hydrogen()->elements_kind();
1352 } 1180 }
1353 }; 1181 };
1354 1182
1355 1183
1356 class LLoadKeyedGeneric: public LTemplateInstruction<1, 3, 0> { 1184 class LLoadKeyedGeneric: public LTemplateInstruction<1, 3, 0> {
1357 public: 1185 public:
1358 LLoadKeyedGeneric(LOperand* context, LOperand* obj, LOperand* key) { 1186 LLoadKeyedGeneric(LOperand* context, LOperand* obj, LOperand* key) {
1359 inputs_[0] = context; 1187 inputs_[0] = context;
1360 inputs_[1] = obj; 1188 inputs_[1] = obj;
1361 inputs_[2] = key; 1189 inputs_[2] = key;
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
1401 temps_[1] = temp2; 1229 temps_[1] = temp2;
1402 } 1230 }
1403 1231
1404 DECLARE_CONCRETE_INSTRUCTION(StoreGlobalCell, "store-global-cell") 1232 DECLARE_CONCRETE_INSTRUCTION(StoreGlobalCell, "store-global-cell")
1405 DECLARE_HYDROGEN_ACCESSOR(StoreGlobalCell) 1233 DECLARE_HYDROGEN_ACCESSOR(StoreGlobalCell)
1406 }; 1234 };
1407 1235
1408 1236
1409 class LStoreGlobalGeneric: public LTemplateInstruction<0, 3, 0> { 1237 class LStoreGlobalGeneric: public LTemplateInstruction<0, 3, 0> {
1410 public: 1238 public:
1411 explicit LStoreGlobalGeneric(LOperand* context, 1239 LStoreGlobalGeneric(LOperand* context,
1412 LOperand* global_object, 1240 LOperand* global_object,
1413 LOperand* value) { 1241 LOperand* value) {
1414 inputs_[0] = context; 1242 inputs_[0] = context;
1415 inputs_[1] = global_object; 1243 inputs_[1] = global_object;
1416 inputs_[2] = value; 1244 inputs_[2] = value;
1417 } 1245 }
1418 1246
1419 DECLARE_CONCRETE_INSTRUCTION(StoreGlobalGeneric, "store-global-generic") 1247 DECLARE_CONCRETE_INSTRUCTION(StoreGlobalGeneric, "store-global-generic")
1420 DECLARE_HYDROGEN_ACCESSOR(StoreGlobalGeneric) 1248 DECLARE_HYDROGEN_ACCESSOR(StoreGlobalGeneric)
1421 1249
1422 LOperand* context() { return InputAt(0); } 1250 LOperand* context() { return InputAt(0); }
1423 LOperand* global_object() { return InputAt(1); } 1251 LOperand* global_object() { return InputAt(1); }
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
1466 class LPushArgument: public LTemplateInstruction<0, 1, 0> { 1294 class LPushArgument: public LTemplateInstruction<0, 1, 0> {
1467 public: 1295 public:
1468 explicit LPushArgument(LOperand* value) { 1296 explicit LPushArgument(LOperand* value) {
1469 inputs_[0] = value; 1297 inputs_[0] = value;
1470 } 1298 }
1471 1299
1472 DECLARE_CONCRETE_INSTRUCTION(PushArgument, "push-argument") 1300 DECLARE_CONCRETE_INSTRUCTION(PushArgument, "push-argument")
1473 }; 1301 };
1474 1302
1475 1303
1304 class LThisFunction: public LTemplateInstruction<1, 0, 0> {
1305 DECLARE_CONCRETE_INSTRUCTION(ThisFunction, "this-function")
1306 };
1307
1308
1476 class LContext: public LTemplateInstruction<1, 0, 0> { 1309 class LContext: public LTemplateInstruction<1, 0, 0> {
1477 public: 1310 public:
1478 DECLARE_CONCRETE_INSTRUCTION(Context, "context") 1311 DECLARE_CONCRETE_INSTRUCTION(Context, "context")
1479 }; 1312 };
1480 1313
1481 1314
1482 class LOuterContext: public LTemplateInstruction<1, 1, 0> { 1315 class LOuterContext: public LTemplateInstruction<1, 1, 0> {
1483 public: 1316 public:
1484 explicit LOuterContext(LOperand* context) { 1317 explicit LOuterContext(LOperand* context) {
1485 inputs_[0] = context; 1318 inputs_[0] = context;
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
1636 DECLARE_HYDROGEN_ACCESSOR(CallNew) 1469 DECLARE_HYDROGEN_ACCESSOR(CallNew)
1637 1470
1638 virtual void PrintDataTo(StringStream* stream); 1471 virtual void PrintDataTo(StringStream* stream);
1639 1472
1640 LOperand* context() { return inputs_[0]; } 1473 LOperand* context() { return inputs_[0]; }
1641 LOperand* constructor() { return inputs_[1]; } 1474 LOperand* constructor() { return inputs_[1]; }
1642 int arity() const { return hydrogen()->argument_count() - 1; } 1475 int arity() const { return hydrogen()->argument_count() - 1; }
1643 }; 1476 };
1644 1477
1645 1478
1646 class LCallRuntime: public LTemplateInstruction<1, 0, 0> { 1479 class LCallRuntime: public LTemplateInstruction<1, 1, 0> {
1647 public: 1480 public:
1481 explicit LCallRuntime(LOperand* context) {
1482 inputs_[0] = context;
1483 }
1648 DECLARE_CONCRETE_INSTRUCTION(CallRuntime, "call-runtime") 1484 DECLARE_CONCRETE_INSTRUCTION(CallRuntime, "call-runtime")
1649 DECLARE_HYDROGEN_ACCESSOR(CallRuntime) 1485 DECLARE_HYDROGEN_ACCESSOR(CallRuntime)
1650 1486
1487 LOperand* context() { return inputs_[0]; }
1651 const Runtime::Function* function() const { return hydrogen()->function(); } 1488 const Runtime::Function* function() const { return hydrogen()->function(); }
1652 int arity() const { return hydrogen()->argument_count(); } 1489 int arity() const { return hydrogen()->argument_count(); }
1653 }; 1490 };
1654 1491
1655 1492
1656 class LInteger32ToDouble: public LTemplateInstruction<1, 1, 0> { 1493 class LInteger32ToDouble: public LTemplateInstruction<1, 1, 0> {
1657 public: 1494 public:
1658 explicit LInteger32ToDouble(LOperand* value) { 1495 explicit LInteger32ToDouble(LOperand* value) {
1659 inputs_[0] = value; 1496 inputs_[0] = value;
1660 } 1497 }
(...skipping 25 matching lines...) Expand all
1686 1523
1687 // Sometimes truncating conversion from a tagged value to an int32. 1524 // Sometimes truncating conversion from a tagged value to an int32.
1688 class LDoubleToI: public LTemplateInstruction<1, 1, 1> { 1525 class LDoubleToI: public LTemplateInstruction<1, 1, 1> {
1689 public: 1526 public:
1690 LDoubleToI(LOperand* value, LOperand* temp) { 1527 LDoubleToI(LOperand* value, LOperand* temp) {
1691 inputs_[0] = value; 1528 inputs_[0] = value;
1692 temps_[0] = temp; 1529 temps_[0] = temp;
1693 } 1530 }
1694 1531
1695 DECLARE_CONCRETE_INSTRUCTION(DoubleToI, "double-to-i") 1532 DECLARE_CONCRETE_INSTRUCTION(DoubleToI, "double-to-i")
1696 DECLARE_HYDROGEN_ACCESSOR(Change) 1533 DECLARE_HYDROGEN_ACCESSOR(UnaryOperation)
1697 1534
1698 bool truncating() { return hydrogen()->CanTruncateToInt32(); } 1535 bool truncating() { return hydrogen()->CanTruncateToInt32(); }
1699 }; 1536 };
1700 1537
1701 1538
1702 // Truncating conversion from a tagged value to an int32. 1539 // Truncating conversion from a tagged value to an int32.
1703 class LTaggedToI: public LTemplateInstruction<1, 1, 1> { 1540 class LTaggedToI: public LTemplateInstruction<1, 1, 1> {
1704 public: 1541 public:
1705 LTaggedToI(LOperand* value, LOperand* temp) { 1542 LTaggedToI(LOperand* value, LOperand* temp) {
1706 inputs_[0] = value; 1543 inputs_[0] = value;
1707 temps_[0] = temp; 1544 temps_[0] = temp;
1708 } 1545 }
1709 1546
1710 DECLARE_CONCRETE_INSTRUCTION(TaggedToI, "tagged-to-i") 1547 DECLARE_CONCRETE_INSTRUCTION(TaggedToI, "tagged-to-i")
1711 DECLARE_HYDROGEN_ACCESSOR(Change) 1548 DECLARE_HYDROGEN_ACCESSOR(UnaryOperation)
1712 1549
1713 bool truncating() { return hydrogen()->CanTruncateToInt32(); } 1550 bool truncating() { return hydrogen()->CanTruncateToInt32(); }
1714 }; 1551 };
1715 1552
1716 1553
1717 class LSmiTag: public LTemplateInstruction<1, 1, 0> { 1554 class LSmiTag: public LTemplateInstruction<1, 1, 0> {
1718 public: 1555 public:
1719 explicit LSmiTag(LOperand* value) { 1556 explicit LSmiTag(LOperand* value) {
1720 inputs_[0] = value; 1557 inputs_[0] = value;
1721 } 1558 }
1722 1559
1723 DECLARE_CONCRETE_INSTRUCTION(SmiTag, "smi-tag") 1560 DECLARE_CONCRETE_INSTRUCTION(SmiTag, "smi-tag")
1724 }; 1561 };
1725 1562
1726 1563
1727 class LNumberUntagD: public LTemplateInstruction<1, 1, 0> { 1564 class LNumberUntagD: public LTemplateInstruction<1, 1, 0> {
1728 public: 1565 public:
1729 explicit LNumberUntagD(LOperand* value) { 1566 explicit LNumberUntagD(LOperand* value) {
1730 inputs_[0] = value; 1567 inputs_[0] = value;
1731 } 1568 }
1732 1569
1733 DECLARE_CONCRETE_INSTRUCTION(NumberUntagD, "double-untag") 1570 DECLARE_CONCRETE_INSTRUCTION(NumberUntagD, "double-untag")
1571 DECLARE_HYDROGEN_ACCESSOR(Change);
1734 }; 1572 };
1735 1573
1736 1574
1737 class LSmiUntag: public LTemplateInstruction<1, 1, 0> { 1575 class LSmiUntag: public LTemplateInstruction<1, 1, 0> {
1738 public: 1576 public:
1739 LSmiUntag(LOperand* value, bool needs_check) 1577 LSmiUntag(LOperand* value, bool needs_check)
1740 : needs_check_(needs_check) { 1578 : needs_check_(needs_check) {
1741 inputs_[0] = value; 1579 inputs_[0] = value;
1742 } 1580 }
1743 1581
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
1825 inputs_[2] = val; 1663 inputs_[2] = val;
1826 } 1664 }
1827 1665
1828 DECLARE_CONCRETE_INSTRUCTION(StoreKeyedSpecializedArrayElement, 1666 DECLARE_CONCRETE_INSTRUCTION(StoreKeyedSpecializedArrayElement,
1829 "store-keyed-specialized-array-element") 1667 "store-keyed-specialized-array-element")
1830 DECLARE_HYDROGEN_ACCESSOR(StoreKeyedSpecializedArrayElement) 1668 DECLARE_HYDROGEN_ACCESSOR(StoreKeyedSpecializedArrayElement)
1831 1669
1832 LOperand* external_pointer() { return inputs_[0]; } 1670 LOperand* external_pointer() { return inputs_[0]; }
1833 LOperand* key() { return inputs_[1]; } 1671 LOperand* key() { return inputs_[1]; }
1834 LOperand* value() { return inputs_[2]; } 1672 LOperand* value() { return inputs_[2]; }
1835 ExternalArrayType array_type() const { 1673 JSObject::ElementsKind elements_kind() const {
1836 return hydrogen()->array_type(); 1674 return hydrogen()->elements_kind();
1837 } 1675 }
1838 }; 1676 };
1839 1677
1840 1678
1841 class LStoreKeyedGeneric: public LTemplateInstruction<0, 4, 0> { 1679 class LStoreKeyedGeneric: public LTemplateInstruction<0, 4, 0> {
1842 public: 1680 public:
1843 LStoreKeyedGeneric(LOperand* context, 1681 LStoreKeyedGeneric(LOperand* context,
1844 LOperand* object, 1682 LOperand* object,
1845 LOperand* key, 1683 LOperand* key,
1846 LOperand* value) { 1684 LOperand* value) {
1847 inputs_[0] = context; 1685 inputs_[0] = context;
1848 inputs_[1] = object; 1686 inputs_[1] = object;
1849 inputs_[2] = key; 1687 inputs_[2] = key;
1850 inputs_[3] = value; 1688 inputs_[3] = value;
1851 } 1689 }
1852 1690
1853 DECLARE_CONCRETE_INSTRUCTION(StoreKeyedGeneric, "store-keyed-generic") 1691 DECLARE_CONCRETE_INSTRUCTION(StoreKeyedGeneric, "store-keyed-generic")
1854 DECLARE_HYDROGEN_ACCESSOR(StoreKeyedGeneric) 1692 DECLARE_HYDROGEN_ACCESSOR(StoreKeyedGeneric)
1855 1693
1856 virtual void PrintDataTo(StringStream* stream); 1694 virtual void PrintDataTo(StringStream* stream);
1857 1695
1858 LOperand* context() { return inputs_[0]; } 1696 LOperand* context() { return inputs_[0]; }
1859 LOperand* object() { return inputs_[1]; } 1697 LOperand* object() { return inputs_[1]; }
1860 LOperand* key() { return inputs_[2]; } 1698 LOperand* key() { return inputs_[2]; }
1861 LOperand* value() { return inputs_[3]; } 1699 LOperand* value() { return inputs_[3]; }
1862 bool strict_mode() { return hydrogen()->strict_mode(); } 1700 bool strict_mode() { return hydrogen()->strict_mode(); }
1863 }; 1701 };
1864 1702
1865 1703
1866 class LStringAdd: public LTemplateInstruction<1, 2, 0> { 1704 class LStringAdd: public LTemplateInstruction<1, 3, 0> {
1867 public: 1705 public:
1868 LStringAdd(LOperand* left, LOperand* right) { 1706 LStringAdd(LOperand* context, LOperand* left, LOperand* right) {
1869 inputs_[0] = left; 1707 inputs_[0] = context;
1870 inputs_[1] = right; 1708 inputs_[1] = left;
1709 inputs_[2] = right;
1871 } 1710 }
1872 1711
1873 DECLARE_CONCRETE_INSTRUCTION(StringAdd, "string-add") 1712 DECLARE_CONCRETE_INSTRUCTION(StringAdd, "string-add")
1874 DECLARE_HYDROGEN_ACCESSOR(StringAdd) 1713 DECLARE_HYDROGEN_ACCESSOR(StringAdd)
1875 1714
1876 LOperand* left() { return inputs_[0]; } 1715 LOperand* context() { return inputs_[0]; }
1877 LOperand* right() { return inputs_[1]; } 1716 LOperand* left() { return inputs_[1]; }
1717 LOperand* right() { return inputs_[2]; }
1878 }; 1718 };
1879 1719
1880 1720
1881 class LStringCharCodeAt: public LTemplateInstruction<1, 2, 0> { 1721 class LStringCharCodeAt: public LTemplateInstruction<1, 3, 0> {
1882 public: 1722 public:
1883 LStringCharCodeAt(LOperand* string, LOperand* index) { 1723 LStringCharCodeAt(LOperand* context, LOperand* string, LOperand* index) {
1884 inputs_[0] = string; 1724 inputs_[0] = context;
1885 inputs_[1] = index; 1725 inputs_[1] = string;
1726 inputs_[2] = index;
1886 } 1727 }
1887 1728
1888 DECLARE_CONCRETE_INSTRUCTION(StringCharCodeAt, "string-char-code-at") 1729 DECLARE_CONCRETE_INSTRUCTION(StringCharCodeAt, "string-char-code-at")
1889 DECLARE_HYDROGEN_ACCESSOR(StringCharCodeAt) 1730 DECLARE_HYDROGEN_ACCESSOR(StringCharCodeAt)
1890 1731
1891 LOperand* string() { return inputs_[0]; } 1732 LOperand* context() { return inputs_[0]; }
1892 LOperand* index() { return inputs_[1]; } 1733 LOperand* string() { return inputs_[1]; }
1734 LOperand* index() { return inputs_[2]; }
1893 }; 1735 };
1894 1736
1895 1737
1896 class LStringCharFromCode: public LTemplateInstruction<1, 1, 0> { 1738 class LStringCharFromCode: public LTemplateInstruction<1, 2, 0> {
1897 public: 1739 public:
1898 explicit LStringCharFromCode(LOperand* char_code) { 1740 LStringCharFromCode(LOperand* context, LOperand* char_code) {
1899 inputs_[0] = char_code; 1741 inputs_[0] = context;
1742 inputs_[1] = char_code;
1900 } 1743 }
1901 1744
1902 DECLARE_CONCRETE_INSTRUCTION(StringCharFromCode, "string-char-from-code") 1745 DECLARE_CONCRETE_INSTRUCTION(StringCharFromCode, "string-char-from-code")
1903 DECLARE_HYDROGEN_ACCESSOR(StringCharFromCode) 1746 DECLARE_HYDROGEN_ACCESSOR(StringCharFromCode)
1904 1747
1905 LOperand* char_code() { return inputs_[0]; } 1748 LOperand* context() { return inputs_[0]; }
1749 LOperand* char_code() { return inputs_[1]; }
1906 }; 1750 };
1907 1751
1908 1752
1909 class LStringLength: public LTemplateInstruction<1, 1, 0> { 1753 class LStringLength: public LTemplateInstruction<1, 1, 0> {
1910 public: 1754 public:
1911 explicit LStringLength(LOperand* string) { 1755 explicit LStringLength(LOperand* string) {
1912 inputs_[0] = string; 1756 inputs_[0] = string;
1913 } 1757 }
1914 1758
1915 DECLARE_CONCRETE_INSTRUCTION(StringLength, "string-length") 1759 DECLARE_CONCRETE_INSTRUCTION(StringLength, "string-length")
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
2017 class LCheckNonSmi: public LTemplateInstruction<0, 1, 0> { 1861 class LCheckNonSmi: public LTemplateInstruction<0, 1, 0> {
2018 public: 1862 public:
2019 explicit LCheckNonSmi(LOperand* value) { 1863 explicit LCheckNonSmi(LOperand* value) {
2020 inputs_[0] = value; 1864 inputs_[0] = value;
2021 } 1865 }
2022 1866
2023 DECLARE_CONCRETE_INSTRUCTION(CheckNonSmi, "check-non-smi") 1867 DECLARE_CONCRETE_INSTRUCTION(CheckNonSmi, "check-non-smi")
2024 }; 1868 };
2025 1869
2026 1870
2027 class LArrayLiteral: public LTemplateInstruction<1, 0, 0> { 1871 class LArrayLiteral: public LTemplateInstruction<1, 1, 0> {
2028 public: 1872 public:
1873 explicit LArrayLiteral(LOperand* context) {
1874 inputs_[0] = context;
1875 }
1876
1877 LOperand* context() { return inputs_[0]; }
1878
2029 DECLARE_CONCRETE_INSTRUCTION(ArrayLiteral, "array-literal") 1879 DECLARE_CONCRETE_INSTRUCTION(ArrayLiteral, "array-literal")
2030 DECLARE_HYDROGEN_ACCESSOR(ArrayLiteral) 1880 DECLARE_HYDROGEN_ACCESSOR(ArrayLiteral)
2031 }; 1881 };
2032 1882
2033 1883
2034 class LObjectLiteral: public LTemplateInstruction<1, 1, 0> { 1884 class LObjectLiteral: public LTemplateInstruction<1, 1, 0> {
2035 public: 1885 public:
2036 explicit LObjectLiteral(LOperand* context) { 1886 explicit LObjectLiteral(LOperand* context) {
2037 inputs_[0] = context; 1887 inputs_[0] = context;
2038 } 1888 }
2039 1889
1890 LOperand* context() { return inputs_[0]; }
1891
2040 DECLARE_CONCRETE_INSTRUCTION(ObjectLiteral, "object-literal") 1892 DECLARE_CONCRETE_INSTRUCTION(ObjectLiteral, "object-literal")
2041 DECLARE_HYDROGEN_ACCESSOR(ObjectLiteral) 1893 DECLARE_HYDROGEN_ACCESSOR(ObjectLiteral)
2042
2043 LOperand* context() { return inputs_[0]; }
2044 }; 1894 };
2045 1895
2046 1896
2047 class LRegExpLiteral: public LTemplateInstruction<1, 0, 0> { 1897 class LRegExpLiteral: public LTemplateInstruction<1, 1, 0> {
2048 public: 1898 public:
1899 explicit LRegExpLiteral(LOperand* context) {
1900 inputs_[0] = context;
1901 }
1902
1903 LOperand* context() { return inputs_[0]; }
1904
2049 DECLARE_CONCRETE_INSTRUCTION(RegExpLiteral, "regexp-literal") 1905 DECLARE_CONCRETE_INSTRUCTION(RegExpLiteral, "regexp-literal")
2050 DECLARE_HYDROGEN_ACCESSOR(RegExpLiteral) 1906 DECLARE_HYDROGEN_ACCESSOR(RegExpLiteral)
2051 }; 1907 };
2052 1908
2053 1909
2054 class LFunctionLiteral: public LTemplateInstruction<1, 0, 0> { 1910 class LFunctionLiteral: public LTemplateInstruction<1, 1, 0> {
2055 public: 1911 public:
1912 explicit LFunctionLiteral(LOperand* context) {
1913 inputs_[0] = context;
1914 }
1915
1916 LOperand* context() { return inputs_[0]; }
1917
2056 DECLARE_CONCRETE_INSTRUCTION(FunctionLiteral, "function-literal") 1918 DECLARE_CONCRETE_INSTRUCTION(FunctionLiteral, "function-literal")
2057 DECLARE_HYDROGEN_ACCESSOR(FunctionLiteral) 1919 DECLARE_HYDROGEN_ACCESSOR(FunctionLiteral)
2058 1920
2059 Handle<SharedFunctionInfo> shared_info() { return hydrogen()->shared_info(); } 1921 Handle<SharedFunctionInfo> shared_info() { return hydrogen()->shared_info(); }
2060 }; 1922 };
2061 1923
2062 1924
2063 class LToFastProperties: public LTemplateInstruction<1, 1, 0> { 1925 class LToFastProperties: public LTemplateInstruction<1, 1, 0> {
2064 public: 1926 public:
2065 explicit LToFastProperties(LOperand* value) { 1927 explicit LToFastProperties(LOperand* value) {
2066 inputs_[0] = value; 1928 inputs_[0] = value;
2067 } 1929 }
2068 1930
2069 DECLARE_CONCRETE_INSTRUCTION(ToFastProperties, "to-fast-properties") 1931 DECLARE_CONCRETE_INSTRUCTION(ToFastProperties, "to-fast-properties")
2070 DECLARE_HYDROGEN_ACCESSOR(ToFastProperties) 1932 DECLARE_HYDROGEN_ACCESSOR(ToFastProperties)
2071 }; 1933 };
2072 1934
2073 1935
2074 class LTypeof: public LTemplateInstruction<1, 1, 0> { 1936 class LTypeof: public LTemplateInstruction<1, 2, 0> {
2075 public: 1937 public:
2076 explicit LTypeof(LOperand* value) { 1938 LTypeof(LOperand* context, LOperand* value) {
2077 inputs_[0] = value; 1939 inputs_[0] = context;
1940 inputs_[1] = value;
2078 } 1941 }
2079 1942
2080 DECLARE_CONCRETE_INSTRUCTION(Typeof, "typeof") 1943 DECLARE_CONCRETE_INSTRUCTION(Typeof, "typeof")
2081 }; 1944 };
2082 1945
2083 1946
2084 class LTypeofIs: public LTemplateInstruction<1, 1, 0> {
2085 public:
2086 explicit LTypeofIs(LOperand* value) {
2087 inputs_[0] = value;
2088 }
2089
2090 DECLARE_CONCRETE_INSTRUCTION(TypeofIs, "typeof-is")
2091 DECLARE_HYDROGEN_ACCESSOR(TypeofIs)
2092
2093 Handle<String> type_literal() { return hydrogen()->type_literal(); }
2094
2095 virtual void PrintDataTo(StringStream* stream);
2096 };
2097
2098
2099 class LTypeofIsAndBranch: public LControlInstruction<1, 0> { 1947 class LTypeofIsAndBranch: public LControlInstruction<1, 0> {
2100 public: 1948 public:
2101 explicit LTypeofIsAndBranch(LOperand* value) { 1949 explicit LTypeofIsAndBranch(LOperand* value) {
2102 inputs_[0] = value; 1950 inputs_[0] = value;
2103 } 1951 }
2104 1952
2105 DECLARE_CONCRETE_INSTRUCTION(TypeofIsAndBranch, "typeof-is-and-branch") 1953 DECLARE_CONCRETE_INSTRUCTION(TypeofIsAndBranch, "typeof-is-and-branch")
2106 DECLARE_HYDROGEN_ACCESSOR(TypeofIs) 1954 DECLARE_HYDROGEN_ACCESSOR(TypeofIsAndBranch)
2107 1955
2108 Handle<String> type_literal() { return hydrogen()->type_literal(); } 1956 Handle<String> type_literal() { return hydrogen()->type_literal(); }
2109 1957
2110 virtual void PrintDataTo(StringStream* stream); 1958 virtual void PrintDataTo(StringStream* stream);
2111 }; 1959 };
2112 1960
2113 1961
2114 class LDeleteProperty: public LTemplateInstruction<1, 2, 0> { 1962 class LDeleteProperty: public LTemplateInstruction<1, 3, 0> {
2115 public: 1963 public:
2116 LDeleteProperty(LOperand* obj, LOperand* key) { 1964 LDeleteProperty(LOperand* context, LOperand* obj, LOperand* key) {
2117 inputs_[0] = obj; 1965 inputs_[0] = context;
2118 inputs_[1] = key; 1966 inputs_[1] = obj;
1967 inputs_[2] = key;
2119 } 1968 }
2120 1969
2121 DECLARE_CONCRETE_INSTRUCTION(DeleteProperty, "delete-property") 1970 DECLARE_CONCRETE_INSTRUCTION(DeleteProperty, "delete-property")
2122 1971
2123 LOperand* object() { return inputs_[0]; } 1972 LOperand* context() { return inputs_[0]; }
2124 LOperand* key() { return inputs_[1]; } 1973 LOperand* object() { return inputs_[1]; }
1974 LOperand* key() { return inputs_[2]; }
2125 }; 1975 };
2126 1976
2127 1977
2128 class LOsrEntry: public LTemplateInstruction<0, 0, 0> { 1978 class LOsrEntry: public LTemplateInstruction<0, 0, 0> {
2129 public: 1979 public:
2130 LOsrEntry(); 1980 LOsrEntry();
2131 1981
2132 DECLARE_CONCRETE_INSTRUCTION(OsrEntry, "osr-entry") 1982 DECLARE_CONCRETE_INSTRUCTION(OsrEntry, "osr-entry")
2133 1983
2134 LOperand** SpilledRegisterArray() { return register_spills_; } 1984 LOperand** SpilledRegisterArray() { return register_spills_; }
2135 LOperand** SpilledDoubleRegisterArray() { return double_register_spills_; } 1985 LOperand** SpilledDoubleRegisterArray() { return double_register_spills_; }
2136 1986
2137 void MarkSpilledRegister(int allocation_index, LOperand* spill_operand); 1987 void MarkSpilledRegister(int allocation_index, LOperand* spill_operand);
2138 void MarkSpilledDoubleRegister(int allocation_index, 1988 void MarkSpilledDoubleRegister(int allocation_index,
2139 LOperand* spill_operand); 1989 LOperand* spill_operand);
2140 1990
2141 private: 1991 private:
2142 // Arrays of spill slot operands for registers with an assigned spill 1992 // Arrays of spill slot operands for registers with an assigned spill
2143 // slot, i.e., that must also be restored to the spill slot on OSR entry. 1993 // slot, i.e., that must also be restored to the spill slot on OSR entry.
2144 // NULL if the register has no assigned spill slot. Indexed by allocation 1994 // NULL if the register has no assigned spill slot. Indexed by allocation
2145 // index. 1995 // index.
2146 LOperand* register_spills_[Register::kNumAllocatableRegisters]; 1996 LOperand* register_spills_[Register::kNumAllocatableRegisters];
2147 LOperand* double_register_spills_[DoubleRegister::kNumAllocatableRegisters]; 1997 LOperand* double_register_spills_[DoubleRegister::kNumAllocatableRegisters];
2148 }; 1998 };
2149 1999
2150 2000
2151 class LStackCheck: public LTemplateInstruction<0, 0, 0> { 2001 class LStackCheck: public LTemplateInstruction<0, 1, 0> {
2152 public: 2002 public:
2003 explicit LStackCheck(LOperand* context) {
2004 inputs_[0] = context;
2005 }
2006
2007 LOperand* context() { return inputs_[0]; }
2008
2153 DECLARE_CONCRETE_INSTRUCTION(StackCheck, "stack-check") 2009 DECLARE_CONCRETE_INSTRUCTION(StackCheck, "stack-check")
2010 DECLARE_HYDROGEN_ACCESSOR(StackCheck)
2011
2012 Label* done_label() { return &done_label_; }
2013
2014 private:
2015 Label done_label_;
2154 }; 2016 };
2155 2017
2156 2018
2157 class LIn: public LTemplateInstruction<1, 2, 0> { 2019 class LIn: public LTemplateInstruction<1, 3, 0> {
2158 public: 2020 public:
2159 LIn(LOperand* key, LOperand* object) { 2021 LIn(LOperand* context, LOperand* key, LOperand* object) {
2160 inputs_[0] = key; 2022 inputs_[0] = context;
2161 inputs_[1] = object; 2023 inputs_[1] = key;
2024 inputs_[2] = object;
2162 } 2025 }
2163 2026
2164 LOperand* key() { return inputs_[0]; } 2027 LOperand* context() { return inputs_[0]; }
2165 LOperand* object() { return inputs_[1]; } 2028 LOperand* key() { return inputs_[1]; }
2029 LOperand* object() { return inputs_[2]; }
2166 2030
2167 DECLARE_CONCRETE_INSTRUCTION(In, "in") 2031 DECLARE_CONCRETE_INSTRUCTION(In, "in")
2168 }; 2032 };
2169 2033
2170 2034
2171 class LChunkBuilder; 2035 class LChunkBuilder;
2172 class LChunk: public ZoneObject { 2036 class LChunk: public ZoneObject {
2173 public: 2037 public:
2174 explicit LChunk(CompilationInfo* info, HGraph* graph) 2038 LChunk(CompilationInfo* info, HGraph* graph)
2175 : spill_slot_count_(0), 2039 : spill_slot_count_(0),
2176 info_(info), 2040 info_(info),
2177 graph_(graph), 2041 graph_(graph),
2178 instructions_(32), 2042 instructions_(32),
2179 pointer_maps_(8), 2043 pointer_maps_(8),
2180 inlined_closures_(1) { } 2044 inlined_closures_(1) { }
2181 2045
2182 void AddInstruction(LInstruction* instruction, HBasicBlock* block); 2046 void AddInstruction(LInstruction* instruction, HBasicBlock* block);
2183 LConstantOperand* DefineConstantOperand(HConstant* constant); 2047 LConstantOperand* DefineConstantOperand(HConstant* constant);
2184 Handle<Object> LookupLiteral(LConstantOperand* operand) const; 2048 Handle<Object> LookupLiteral(LConstantOperand* operand) const;
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after
2389 2253
2390 DISALLOW_COPY_AND_ASSIGN(LChunkBuilder); 2254 DISALLOW_COPY_AND_ASSIGN(LChunkBuilder);
2391 }; 2255 };
2392 2256
2393 #undef DECLARE_HYDROGEN_ACCESSOR 2257 #undef DECLARE_HYDROGEN_ACCESSOR
2394 #undef DECLARE_CONCRETE_INSTRUCTION 2258 #undef DECLARE_CONCRETE_INSTRUCTION
2395 2259
2396 } } // namespace v8::internal 2260 } } // namespace v8::internal
2397 2261
2398 #endif // V8_IA32_LITHIUM_IA32_H_ 2262 #endif // V8_IA32_LITHIUM_IA32_H_
OLDNEW
« no previous file with comments | « src/ia32/lithium-gap-resolver-ia32.cc ('k') | src/ia32/lithium-ia32.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698