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

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

Issue 6237002: Remove the remaining LOperand-members from concrete LIR instructions.... (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: Created 9 years, 11 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
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 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
142 // LTaggedToI 142 // LTaggedToI
143 // LThrow 143 // LThrow
144 // LTypeof 144 // LTypeof
145 // LTypeofIs 145 // LTypeofIs
146 // LTypeofIsAndBranch 146 // LTypeofIsAndBranch
147 // LUnaryMathOperation 147 // LUnaryMathOperation
148 // LValueOf 148 // LValueOf
149 // LUnknownOSRValue 149 // LUnknownOSRValue
150 150
151 #define LITHIUM_ALL_INSTRUCTION_LIST(V) \ 151 #define LITHIUM_ALL_INSTRUCTION_LIST(V) \
152 V(BinaryControlInstruction) \
152 V(BinaryOperation) \ 153 V(BinaryOperation) \
153 V(Constant) \ 154 V(Constant) \
154 V(Call) \ 155 V(Call) \
155 V(MaterializedLiteral) \ 156 V(MaterializedLiteral) \
156 V(StoreKeyed) \ 157 V(StoreKeyed) \
157 V(StoreNamed) \ 158 V(StoreNamed) \
159 V(UnaryControlInstruction) \
158 V(UnaryOperation) \ 160 V(UnaryOperation) \
159 LITHIUM_CONCRETE_INSTRUCTION_LIST(V) 161 LITHIUM_CONCRETE_INSTRUCTION_LIST(V)
160 162
161 163
162 #define LITHIUM_CONCRETE_INSTRUCTION_LIST(V) \ 164 #define LITHIUM_CONCRETE_INSTRUCTION_LIST(V) \
163 V(AccessArgumentsAt) \ 165 V(AccessArgumentsAt) \
164 V(AddI) \ 166 V(AddI) \
165 V(ApplyArguments) \ 167 V(ApplyArguments) \
166 V(ArgumentsElements) \ 168 V(ArgumentsElements) \
167 V(ArgumentsLength) \ 169 V(ArgumentsLength) \
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
293 virtual void CompileToNative(LCodeGen* generator) = 0; 295 virtual void CompileToNative(LCodeGen* generator) = 0;
294 virtual const char* Mnemonic() const = 0; 296 virtual const char* Mnemonic() const = 0;
295 virtual void PrintTo(StringStream* stream); 297 virtual void PrintTo(StringStream* stream);
296 virtual void PrintDataTo(StringStream* stream) = 0; 298 virtual void PrintDataTo(StringStream* stream) = 0;
297 virtual void PrintOutputOperandTo(StringStream* stream) = 0; 299 virtual void PrintOutputOperandTo(StringStream* stream) = 0;
298 300
299 // Declare virtual type testers. 301 // Declare virtual type testers.
300 #define DECLARE_DO(type) virtual bool Is##type() const { return false; } 302 #define DECLARE_DO(type) virtual bool Is##type() const { return false; }
301 LITHIUM_ALL_INSTRUCTION_LIST(DECLARE_DO) 303 LITHIUM_ALL_INSTRUCTION_LIST(DECLARE_DO)
302 #undef DECLARE_DO 304 #undef DECLARE_DO
305
303 virtual bool IsControl() const { return false; } 306 virtual bool IsControl() const { return false; }
307 virtual void SetBranchTargets(int true_block_id, int false_block_id) { }
Kevin Millikin (Chromium) 2011/01/13 08:45:59 Does this need to be on LInstruction? I would exp
fschneider 2011/01/13 13:03:25 The problem is that I can't cast to a LControlInst
304 308
305 void set_environment(LEnvironment* env) { environment_.set(env); } 309 void set_environment(LEnvironment* env) { environment_.set(env); }
306 LEnvironment* environment() const { return environment_.get(); } 310 LEnvironment* environment() const { return environment_.get(); }
307 bool HasEnvironment() const { return environment_.is_set(); } 311 bool HasEnvironment() const { return environment_.is_set(); }
308 312
309 void set_pointer_map(LPointerMap* p) { pointer_map_.set(p); } 313 void set_pointer_map(LPointerMap* p) { pointer_map_.set(p); }
310 LPointerMap* pointer_map() const { return pointer_map_.get(); } 314 LPointerMap* pointer_map() const { return pointer_map_.get(); }
311 bool HasPointerMap() const { return pointer_map_.is_set(); } 315 bool HasPointerMap() const { return pointer_map_.is_set(); }
312 316
313 virtual bool HasResult() const = 0; 317 virtual bool HasResult() const = 0;
(...skipping 19 matching lines...) Expand all
333 }; 337 };
334 338
335 339
336 template<typename T, int N> 340 template<typename T, int N>
337 class OperandContainer { 341 class OperandContainer {
338 public: 342 public:
339 OperandContainer() { 343 OperandContainer() {
340 for (int i = 0; i < N; i++) elems_[i] = NULL; 344 for (int i = 0; i < N; i++) elems_[i] = NULL;
341 } 345 }
342 int length() const { return N; } 346 int length() const { return N; }
343 T at(int i) const { return elems_[i]; } 347 T at(int i) const { return elems_[i]; }
Kevin Millikin (Chromium) 2011/01/13 08:45:59 This seems like a place that you could legitimatel
fschneider 2011/01/13 13:03:25 Done.
344 void set_at(int i, T value) { elems_[i] = value; } 348 void set_at(int i, T value) { elems_[i] = value; }
349 void PrintOperandsTo(StringStream* stream);
345 private: 350 private:
346 T elems_[N]; 351 T elems_[N];
347 }; 352 };
348 353
349 354
350 template<typename T> 355 template<typename T>
351 class OperandContainer<T, 0> { 356 class OperandContainer<T, 0> {
352 public: 357 public:
353 int length() const { return 0; } 358 int length() const { return 0; }
354 T at(int i) const { 359 void PrintOperandsTo(StringStream* stream) { }
355 UNREACHABLE();
356 return NULL;
357 }
358 void set_at(int i, T value) {
359 UNREACHABLE();
360 }
361 }; 360 };
362 361
363 362
364 template<int R, int I, int T> 363 template<int R, int I, int T>
365 class LTemplateInstruction: public LInstruction { 364 class LTemplateInstruction: public LInstruction {
366 public: 365 public:
367 // Allow 0 or 1 output operands. 366 // Allow 0 or 1 output operands.
368 STATIC_ASSERT(R == 0 || R == 1); 367 STATIC_ASSERT(R == 0 || R == 1);
369 virtual bool HasResult() const { return R != 0; } 368 virtual bool HasResult() const { return R != 0; }
370 void set_result(LOperand* operand) { outputs_.set_at(0, operand); } 369 void set_result(LOperand* operand) { outputs_.set_at(0, operand); }
371 LOperand* result() const { return outputs_.at(0); } 370 LOperand* result() const { return outputs_.at(0); }
372 371
373 int InputCount() const { return inputs_.length(); } 372 int InputCount() const { return inputs_.length(); }
Kevin Millikin (Chromium) 2011/01/13 08:45:59 "return I" seems more direct.
fschneider 2011/01/13 13:03:25 Done.
374 LOperand* InputAt(int i) const { return inputs_.at(i); } 373 LOperand* InputAt(int i) const { return inputs_.at(i); }
375 void SetInputAt(int i, LOperand* operand) { inputs_.set_at(i, operand); } 374 void SetInputAt(int i, LOperand* operand) { inputs_.set_at(i, operand); }
376 375
377 int TempCount() const { return temps_.length(); } 376 int TempCount() const { return temps_.length(); }
Kevin Millikin (Chromium) 2011/01/13 08:45:59 "return T"?
fschneider 2011/01/13 13:03:25 Done.
378 LOperand* TempAt(int i) const { return temps_.at(i); } 377 LOperand* TempAt(int i) const { return temps_.at(i); }
378 void SetTempAt(int i, LOperand* operand) { temps_.set_at(i, operand); }
379 379
380 virtual void PrintDataTo(StringStream* stream); 380 virtual void PrintDataTo(StringStream* stream);
381 virtual void PrintOutputOperandTo(StringStream* stream); 381 virtual void PrintOutputOperandTo(StringStream* stream);
382 382
383 private: 383 private:
Kevin Millikin (Chromium) 2011/01/13 08:45:59 It also seems legitimate to make these protected s
fschneider 2011/01/13 13:03:25 Done.
384 OperandContainer<LOperand*, R> outputs_; 384 OperandContainer<LOperand*, R> outputs_;
Kevin Millikin (Chromium) 2011/01/13 08:45:59 Perhaps outputs_ should be results_ (or R should b
fschneider 2011/01/13 13:03:25 Done.
385 OperandContainer<LOperand*, I> inputs_; 385 OperandContainer<LOperand*, I> inputs_;
386 OperandContainer<LOperand*, T> temps_; 386 OperandContainer<LOperand*, T> temps_;
387 }; 387 };
388 388
389 389
390 class LGap: public LTemplateInstruction<0, 0, 0> { 390 class LGap: public LTemplateInstruction<0, 0, 0> {
391 public: 391 public:
392 explicit LGap(HBasicBlock* block) 392 explicit LGap(HBasicBlock* block)
393 : block_(block) { 393 : block_(block) {
394 parallel_moves_[BEFORE] = NULL; 394 parallel_moves_[BEFORE] = NULL;
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
506 } 506 }
507 }; 507 };
508 508
509 509
510 class LUnknownOSRValue: public LTemplateInstruction<1, 0, 0> { 510 class LUnknownOSRValue: public LTemplateInstruction<1, 0, 0> {
511 public: 511 public:
512 DECLARE_CONCRETE_INSTRUCTION(UnknownOSRValue, "unknown-osr-value") 512 DECLARE_CONCRETE_INSTRUCTION(UnknownOSRValue, "unknown-osr-value")
513 }; 513 };
514 514
515 515
516 template<int R> 516 template<int R, int T = 0>
517 class LUnaryOperation: public LTemplateInstruction<R, 1, 0> { 517 class LUnaryOperation: public LTemplateInstruction<R, 1, T> {
518 public: 518 public:
519 explicit LUnaryOperation<R>(LOperand* input) { 519 explicit LUnaryOperation(LOperand* input) {
520 this->SetInputAt(0, input); 520 this->SetInputAt(0, input);
521 } 521 }
522 522
523 LOperand* input() const { return this->InputAt(0); } 523 LOperand* input() const { return this->InputAt(0); }
524 524
525 DECLARE_INSTRUCTION(UnaryOperation) 525 DECLARE_INSTRUCTION(UnaryOperation)
526 }; 526 };
527 527
528 528
529 template<int R> 529 template<int R, int T = 0>
Kevin Millikin (Chromium) 2011/01/13 08:45:59 We should strongly consider getting rid of classes
fschneider 2011/01/13 13:03:25 Done.
530 class LBinaryOperation: public LTemplateInstruction<R, 2, 0> { 530 class LBinaryOperation: public LTemplateInstruction<R, 2, T> {
531 public: 531 public:
532 LBinaryOperation(LOperand* left, LOperand* right) { 532 LBinaryOperation(LOperand* left, LOperand* right) {
533 this->SetInputAt(0, left); 533 this->SetInputAt(0, left);
Vitaly Repeshko 2011/01/13 11:44:07 We could have a convenience function SetInputs(inp
fschneider 2011/01/13 13:03:25 For this change I'd like to leave it more verbose
Vitaly Repeshko 2011/01/13 13:06:51 To implement this you define the function N times
534 this->SetInputAt(1, right); 534 this->SetInputAt(1, right);
535 } 535 }
536 536
537 DECLARE_INSTRUCTION(BinaryOperation) 537 DECLARE_INSTRUCTION(BinaryOperation)
538 538
539 LOperand* left() const { return this->InputAt(0); } 539 LOperand* left() const { return this->InputAt(0); }
540 LOperand* right() const { return this->InputAt(1); } 540 LOperand* right() const { return this->InputAt(1); }
541 }; 541 };
542 542
543 543
544 template<int T = 0>
545 class LUnaryControlInstruction: public LUnaryOperation<0, T> {
546 public:
547 explicit LUnaryControlInstruction(LOperand* input)
548 : LUnaryOperation<0, T>(input),
549 true_block_id_(-1),
550 false_block_id_(-1) { }
551
552 DECLARE_INSTRUCTION(UnaryControlInstruction)
553 virtual bool IsControl() const { return true; }
554
555 int true_block_id() const { return true_block_id_; }
556 int false_block_id() const { return false_block_id_; }
557 void SetBranchTargets(int true_block_id, int false_block_id) {
558 true_block_id_ = true_block_id;
559 false_block_id_ = false_block_id;
560 }
561
562 private:
563 int true_block_id_;
564 int false_block_id_;
565 };
566
567
568 template<int T = 0>
569 class LBinaryControlInstruction: public LBinaryOperation<0, T> {
570 public:
571 LBinaryControlInstruction(LOperand* left, LOperand* right)
572 : LBinaryOperation<0, T>(left, right),
573 true_block_id_(-1),
574 false_block_id_(-1) { }
575
576 DECLARE_INSTRUCTION(BinaryControlInstruction)
577 virtual bool IsControl() const { return true; }
578
579 int true_block_id() const { return true_block_id_; }
580 int false_block_id() const { return false_block_id_; }
581 void SetBranchTargets(int true_block_id, int false_block_id) {
582 true_block_id_ = true_block_id;
583 false_block_id_ = false_block_id;
584 }
585
586 private:
587 int true_block_id_;
588 int false_block_id_;
589 };
590
591
544 class LApplyArguments: public LTemplateInstruction<1, 4, 0> { 592 class LApplyArguments: public LTemplateInstruction<1, 4, 0> {
545 public: 593 public:
546 LApplyArguments(LOperand* function, 594 LApplyArguments(LOperand* function,
547 LOperand* receiver, 595 LOperand* receiver,
548 LOperand* length, 596 LOperand* length,
549 LOperand* elements) { 597 LOperand* elements) {
550 this->SetInputAt(0, function); 598 this->SetInputAt(0, function);
551 this->SetInputAt(1, receiver); 599 this->SetInputAt(1, receiver);
552 this->SetInputAt(2, length); 600 this->SetInputAt(2, length);
553 this->SetInputAt(3, elements); 601 this->SetInputAt(3, elements);
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
590 638
591 639
592 class LArgumentsElements: public LTemplateInstruction<1, 0, 0> { 640 class LArgumentsElements: public LTemplateInstruction<1, 0, 0> {
593 public: 641 public:
594 LArgumentsElements() { } 642 LArgumentsElements() { }
595 643
596 DECLARE_CONCRETE_INSTRUCTION(ArgumentsElements, "arguments-elements") 644 DECLARE_CONCRETE_INSTRUCTION(ArgumentsElements, "arguments-elements")
597 }; 645 };
598 646
599 647
600 class LModI: public LBinaryOperation<1> { 648 class LModI: public LBinaryOperation<1, 1> {
601 public: 649 public:
602 LModI(LOperand* left, LOperand* right) : LBinaryOperation<1>(left, right) { } 650 LModI(LOperand* left, LOperand* right, LOperand* temp)
651 : LBinaryOperation<1, 1>(left, right) {
652 SetTempAt(0, temp);
653 }
603 654
604 DECLARE_CONCRETE_INSTRUCTION(ModI, "mod-i") 655 DECLARE_CONCRETE_INSTRUCTION(ModI, "mod-i")
605 DECLARE_HYDROGEN_ACCESSOR(Mod) 656 DECLARE_HYDROGEN_ACCESSOR(Mod)
606 }; 657 };
607 658
608 659
609 class LDivI: public LBinaryOperation<1> { 660 class LDivI: public LBinaryOperation<1, 1> {
610 public: 661 public:
611 LDivI(LOperand* left, LOperand* right) 662 LDivI(LOperand* left, LOperand* right, LOperand* temp)
612 : LBinaryOperation<1>(left, right) { } 663 : LBinaryOperation<1, 1>(left, right) {
664 SetTempAt(0, temp);
665 }
613 666
614 DECLARE_CONCRETE_INSTRUCTION(DivI, "div-i") 667 DECLARE_CONCRETE_INSTRUCTION(DivI, "div-i")
615 DECLARE_HYDROGEN_ACCESSOR(Div) 668 DECLARE_HYDROGEN_ACCESSOR(Div)
616 }; 669 };
617 670
618 671
619 class LMulI: public LBinaryOperation<1> { 672 class LMulI: public LBinaryOperation<1, 1> {
620 public: 673 public:
621 LMulI(LOperand* left, LOperand* right, LOperand* temp) 674 LMulI(LOperand* left, LOperand* right, LOperand* temp)
622 : LBinaryOperation<1>(left, right), temp_(temp) { } 675 : LBinaryOperation<1, 1>(left, right) {
676 SetTempAt(0, temp);
677 }
623 678
624 DECLARE_CONCRETE_INSTRUCTION(MulI, "mul-i") 679 DECLARE_CONCRETE_INSTRUCTION(MulI, "mul-i")
625 DECLARE_HYDROGEN_ACCESSOR(Mul) 680 DECLARE_HYDROGEN_ACCESSOR(Mul)
626
627 LOperand* temp() const { return temp_; }
628
629 private:
630 LOperand* temp_;
631 }; 681 };
632 682
633 683
634 class LCmpID: public LBinaryOperation<1> { 684 class LCmpID: public LBinaryOperation<1> {
635 public: 685 public:
636 LCmpID(LOperand* left, LOperand* right) 686 LCmpID(LOperand* left, LOperand* right)
637 : LBinaryOperation<1>(left, right) { } 687 : LBinaryOperation<1>(left, right) { }
638 688
689 DECLARE_CONCRETE_INSTRUCTION(CmpID, "cmp-id")
690 DECLARE_HYDROGEN_ACCESSOR(Compare)
691
692 Token::Value op() const { return hydrogen()->token(); }
693 bool is_double() const {
694 return hydrogen()->GetInputRepresentation().IsDouble();
695 }
696 };
697
698
699 class LCmpIDAndBranch: public LBinaryControlInstruction<> {
700 public:
701 LCmpIDAndBranch(LOperand* left, LOperand* right)
702 : LBinaryControlInstruction<>(left, right) { }
703
704 DECLARE_CONCRETE_INSTRUCTION(CmpIDAndBranch, "cmp-id-and-branch")
705 DECLARE_HYDROGEN_ACCESSOR(Compare)
706
639 Token::Value op() const { return hydrogen()->token(); } 707 Token::Value op() const { return hydrogen()->token(); }
640 bool is_double() const { 708 bool is_double() const {
641 return hydrogen()->GetInputRepresentation().IsDouble(); 709 return hydrogen()->GetInputRepresentation().IsDouble();
642 } 710 }
643 711
644 DECLARE_CONCRETE_INSTRUCTION(CmpID, "cmp-id") 712 virtual void PrintDataTo(StringStream* stream);
645 DECLARE_HYDROGEN_ACCESSOR(Compare)
646 }; 713 };
647 714
648 715
649 class LCmpIDAndBranch: public LCmpID {
650 public:
651 LCmpIDAndBranch(LOperand* left,
652 LOperand* right,
653 int true_block_id,
654 int false_block_id)
655 : LCmpID(left, right),
656 true_block_id_(true_block_id),
657 false_block_id_(false_block_id) { }
658
659 DECLARE_CONCRETE_INSTRUCTION(CmpIDAndBranch, "cmp-id-and-branch")
660 virtual void PrintDataTo(StringStream* stream);
661 virtual bool IsControl() const { return true; }
662
663 int true_block_id() const { return true_block_id_; }
664 int false_block_id() const { return false_block_id_; }
665
666 private:
667 int true_block_id_;
668 int false_block_id_;
669 };
670
671
672 class LUnaryMathOperation: public LUnaryOperation<1> { 716 class LUnaryMathOperation: public LUnaryOperation<1> {
673 public: 717 public:
674 explicit LUnaryMathOperation(LOperand* value) 718 explicit LUnaryMathOperation(LOperand* value)
675 : LUnaryOperation<1>(value) { } 719 : LUnaryOperation<1>(value) { }
676 720
677 DECLARE_CONCRETE_INSTRUCTION(UnaryMathOperation, "unary-math-operation") 721 DECLARE_CONCRETE_INSTRUCTION(UnaryMathOperation, "unary-math-operation")
678 DECLARE_HYDROGEN_ACCESSOR(UnaryMathOperation) 722 DECLARE_HYDROGEN_ACCESSOR(UnaryMathOperation)
679 723
680 virtual void PrintDataTo(StringStream* stream); 724 virtual void PrintDataTo(StringStream* stream);
681 BuiltinFunctionId op() const { return hydrogen()->op(); } 725 BuiltinFunctionId op() const { return hydrogen()->op(); }
682 }; 726 };
683 727
684 728
685 class LCmpJSObjectEq: public LBinaryOperation<1> { 729 class LCmpJSObjectEq: public LBinaryOperation<1> {
686 public: 730 public:
687 LCmpJSObjectEq(LOperand* left, LOperand* right) 731 LCmpJSObjectEq(LOperand* left, LOperand* right)
688 : LBinaryOperation<1>(left, right) {} 732 : LBinaryOperation<1>(left, right) {}
689 733
690 DECLARE_CONCRETE_INSTRUCTION(CmpJSObjectEq, "cmp-jsobject-eq") 734 DECLARE_CONCRETE_INSTRUCTION(CmpJSObjectEq, "cmp-jsobject-eq")
691 }; 735 };
692 736
693 737
694 class LCmpJSObjectEqAndBranch: public LCmpJSObjectEq { 738 class LCmpJSObjectEqAndBranch: public LBinaryControlInstruction<> {
695 public: 739 public:
696 LCmpJSObjectEqAndBranch(LOperand* left, 740 LCmpJSObjectEqAndBranch(LOperand* left, LOperand* right)
697 LOperand* right, 741 : LBinaryControlInstruction<>(left, right) { }
698 int true_block_id,
699 int false_block_id)
700 : LCmpJSObjectEq(left, right),
701 true_block_id_(true_block_id),
702 false_block_id_(false_block_id) { }
703 742
704 DECLARE_CONCRETE_INSTRUCTION(CmpJSObjectEqAndBranch, 743 DECLARE_CONCRETE_INSTRUCTION(CmpJSObjectEqAndBranch,
705 "cmp-jsobject-eq-and-branch") 744 "cmp-jsobject-eq-and-branch")
706
707 int true_block_id() const { return true_block_id_; }
708 int false_block_id() const { return false_block_id_; }
709
710 private:
711 int true_block_id_;
712 int false_block_id_;
713 }; 745 };
714 746
715 747
716 class LIsNull: public LUnaryOperation<1> { 748 class LIsNull: public LUnaryOperation<1> {
717 public: 749 public:
718 explicit LIsNull(LOperand* value) : LUnaryOperation<1>(value) { } 750 explicit LIsNull(LOperand* value) : LUnaryOperation<1>(value) { }
719 751
720 DECLARE_CONCRETE_INSTRUCTION(IsNull, "is-null") 752 DECLARE_CONCRETE_INSTRUCTION(IsNull, "is-null")
721 DECLARE_HYDROGEN_ACCESSOR(IsNull) 753 DECLARE_HYDROGEN_ACCESSOR(IsNull)
722 754
723 bool is_strict() const { return hydrogen()->is_strict(); } 755 bool is_strict() const { return hydrogen()->is_strict(); }
724 }; 756 };
725 757
726 758
727 class LIsNullAndBranch: public LIsNull { 759 class LIsNullAndBranch: public LUnaryControlInstruction<1> {
728 public: 760 public:
729 LIsNullAndBranch(LOperand* value, 761 LIsNullAndBranch(LOperand* value, LOperand* temp)
730 LOperand* temp, 762 : LUnaryControlInstruction<1>(value) {
731 int true_block_id, 763 SetTempAt(0, temp);
732 int false_block_id) 764 }
733 : LIsNull(value),
734 temp_(temp),
735 true_block_id_(true_block_id),
736 false_block_id_(false_block_id) { }
737 765
738 DECLARE_CONCRETE_INSTRUCTION(IsNullAndBranch, "is-null-and-branch") 766 DECLARE_CONCRETE_INSTRUCTION(IsNullAndBranch, "is-null-and-branch")
767 DECLARE_HYDROGEN_ACCESSOR(IsNull)
768
769 bool is_strict() const { return hydrogen()->is_strict(); }
770
739 virtual void PrintDataTo(StringStream* stream); 771 virtual void PrintDataTo(StringStream* stream);
740 virtual bool IsControl() const { return true; }
741
742 int true_block_id() const { return true_block_id_; }
743 int false_block_id() const { return false_block_id_; }
744
745 LOperand* temp() const { return temp_; }
746
747 private:
748 LOperand* temp_;
749 int true_block_id_;
750 int false_block_id_;
751 }; 772 };
752 773
753 774
754 class LIsObject: public LUnaryOperation<1> { 775 class LIsObject: public LUnaryOperation<1, 1> {
755 public: 776 public:
756 LIsObject(LOperand* value, LOperand* temp) 777 LIsObject(LOperand* value, LOperand* temp)
757 : LUnaryOperation<1>(value), temp_(temp) {} 778 : LUnaryOperation<1, 1>(value) {
779 SetTempAt(0, temp);
780 }
758 781
759 DECLARE_CONCRETE_INSTRUCTION(IsObject, "is-object") 782 DECLARE_CONCRETE_INSTRUCTION(IsObject, "is-object")
760
761 LOperand* temp() const { return temp_; }
762
763 private:
764 LOperand* temp_;
765 }; 783 };
766 784
767 785
768 class LIsObjectAndBranch: public LIsObject { 786 class LIsObjectAndBranch: public LUnaryControlInstruction<2> {
769 public: 787 public:
770 LIsObjectAndBranch(LOperand* value, 788 LIsObjectAndBranch(LOperand* value, LOperand* temp, LOperand* temp2)
771 LOperand* temp, 789 : LUnaryControlInstruction<2>(value) {
772 LOperand* temp2, 790 SetTempAt(0, temp);
773 int true_block_id, 791 SetTempAt(1, temp2);
774 int false_block_id) 792 }
775 : LIsObject(value, temp),
776 temp2_(temp2),
777 true_block_id_(true_block_id),
778 false_block_id_(false_block_id) { }
779 793
780 DECLARE_CONCRETE_INSTRUCTION(IsObjectAndBranch, "is-object-and-branch") 794 DECLARE_CONCRETE_INSTRUCTION(IsObjectAndBranch, "is-object-and-branch")
795
781 virtual void PrintDataTo(StringStream* stream); 796 virtual void PrintDataTo(StringStream* stream);
782 virtual bool IsControl() const { return true; }
783
784 int true_block_id() const { return true_block_id_; }
785 int false_block_id() const { return false_block_id_; }
786
787 LOperand* temp2() const { return temp2_; }
788
789 private:
790 LOperand* temp2_;
791 int true_block_id_;
792 int false_block_id_;
793 }; 797 };
794 798
795 799
796 class LIsSmi: public LUnaryOperation<1> { 800 class LIsSmi: public LUnaryOperation<1> {
797 public: 801 public:
798 explicit LIsSmi(LOperand* value) : LUnaryOperation<1>(value) {} 802 explicit LIsSmi(LOperand* value) : LUnaryOperation<1>(value) {}
799 803
800 DECLARE_CONCRETE_INSTRUCTION(IsSmi, "is-smi") 804 DECLARE_CONCRETE_INSTRUCTION(IsSmi, "is-smi")
801 DECLARE_HYDROGEN_ACCESSOR(IsSmi) 805 DECLARE_HYDROGEN_ACCESSOR(IsSmi)
802 }; 806 };
803 807
804 808
805 class LIsSmiAndBranch: public LIsSmi { 809 class LIsSmiAndBranch: public LUnaryControlInstruction<> {
806 public: 810 public:
807 LIsSmiAndBranch(LOperand* value, 811 explicit LIsSmiAndBranch(LOperand* value)
808 int true_block_id, 812 : LUnaryControlInstruction<>(value) { }
809 int false_block_id)
810 : LIsSmi(value),
811 true_block_id_(true_block_id),
812 false_block_id_(false_block_id) { }
813 813
814 DECLARE_CONCRETE_INSTRUCTION(IsSmiAndBranch, "is-smi-and-branch") 814 DECLARE_CONCRETE_INSTRUCTION(IsSmiAndBranch, "is-smi-and-branch")
815
815 virtual void PrintDataTo(StringStream* stream); 816 virtual void PrintDataTo(StringStream* stream);
816 virtual bool IsControl() const { return true; }
817
818 int true_block_id() const { return true_block_id_; }
819 int false_block_id() const { return false_block_id_; }
820
821 private:
822 int true_block_id_;
823 int false_block_id_;
824 }; 817 };
825 818
826 819
827 class LHasInstanceType: public LUnaryOperation<1> { 820 class LHasInstanceType: public LUnaryOperation<1> {
828 public: 821 public:
829 explicit LHasInstanceType(LOperand* value) 822 explicit LHasInstanceType(LOperand* value)
830 : LUnaryOperation<1>(value) { } 823 : LUnaryOperation<1>(value) { }
831 824
832 DECLARE_CONCRETE_INSTRUCTION(HasInstanceType, "has-instance-type") 825 DECLARE_CONCRETE_INSTRUCTION(HasInstanceType, "has-instance-type")
833 DECLARE_HYDROGEN_ACCESSOR(HasInstanceType) 826 DECLARE_HYDROGEN_ACCESSOR(HasInstanceType)
834
835 InstanceType TestType(); // The type to test against when generating code.
836 Condition BranchCondition(); // The branch condition for 'true'.
837 }; 827 };
838 828
839 829
840 class LHasInstanceTypeAndBranch: public LHasInstanceType { 830 class LHasInstanceTypeAndBranch: public LUnaryControlInstruction<1> {
841 public: 831 public:
842 LHasInstanceTypeAndBranch(LOperand* value, 832 LHasInstanceTypeAndBranch(LOperand* value, LOperand* temp)
843 LOperand* temporary, 833 : LUnaryControlInstruction<1>(value) {
844 int true_block_id, 834 SetTempAt(0, temp);
845 int false_block_id) 835 }
846 : LHasInstanceType(value),
847 temp_(temporary),
848 true_block_id_(true_block_id),
849 false_block_id_(false_block_id) { }
850 836
851 DECLARE_CONCRETE_INSTRUCTION(HasInstanceTypeAndBranch, 837 DECLARE_CONCRETE_INSTRUCTION(HasInstanceTypeAndBranch,
852 "has-instance-type-and-branch") 838 "has-instance-type-and-branch")
839 DECLARE_HYDROGEN_ACCESSOR(HasInstanceType)
840
853 virtual void PrintDataTo(StringStream* stream); 841 virtual void PrintDataTo(StringStream* stream);
854 virtual bool IsControl() const { return true; }
855
856 int true_block_id() const { return true_block_id_; }
857 int false_block_id() const { return false_block_id_; }
858
859 LOperand* temp() { return temp_; }
860
861 private:
862 LOperand* temp_;
863 int true_block_id_;
864 int false_block_id_;
865 }; 842 };
866 843
867 844
868 class LHasCachedArrayIndex: public LUnaryOperation<1> { 845 class LHasCachedArrayIndex: public LUnaryOperation<1> {
869 public: 846 public:
870 explicit LHasCachedArrayIndex(LOperand* value) : LUnaryOperation<1>(value) {} 847 explicit LHasCachedArrayIndex(LOperand* value) : LUnaryOperation<1>(value) {}
871 848
872 DECLARE_CONCRETE_INSTRUCTION(HasCachedArrayIndex, "has-cached-array-index") 849 DECLARE_CONCRETE_INSTRUCTION(HasCachedArrayIndex, "has-cached-array-index")
873 DECLARE_HYDROGEN_ACCESSOR(HasCachedArrayIndex) 850 DECLARE_HYDROGEN_ACCESSOR(HasCachedArrayIndex)
874 }; 851 };
875 852
876 853
877 class LHasCachedArrayIndexAndBranch: public LHasCachedArrayIndex { 854 class LHasCachedArrayIndexAndBranch: public LUnaryControlInstruction<> {
878 public: 855 public:
879 LHasCachedArrayIndexAndBranch(LOperand* value, 856 explicit LHasCachedArrayIndexAndBranch(LOperand* value)
880 int true_block_id, 857 : LUnaryControlInstruction<>(value) { }
881 int false_block_id)
882 : LHasCachedArrayIndex(value),
883 true_block_id_(true_block_id),
884 false_block_id_(false_block_id) { }
885 858
886 DECLARE_CONCRETE_INSTRUCTION(HasCachedArrayIndexAndBranch, 859 DECLARE_CONCRETE_INSTRUCTION(HasCachedArrayIndexAndBranch,
887 "has-cached-array-index-and-branch") 860 "has-cached-array-index-and-branch")
888 virtual void PrintDataTo(StringStream* stream); 861 virtual void PrintDataTo(StringStream* stream);
889 virtual bool IsControl() const { return true; }
890
891 int true_block_id() const { return true_block_id_; }
892 int false_block_id() const { return false_block_id_; }
893
894 private:
895 int true_block_id_;
896 int false_block_id_;
897 }; 862 };
898 863
899 864
900 class LClassOfTest: public LUnaryOperation<1> { 865 class LClassOfTest: public LUnaryOperation<1, 1> {
901 public: 866 public:
902 LClassOfTest(LOperand* value, LOperand* temp) 867 LClassOfTest(LOperand* value, LOperand* temp) : LUnaryOperation<1, 1>(value) {
903 : LUnaryOperation<1>(value), temporary_(temp) {} 868 SetTempAt(0, temp);
869 }
904 870
905 DECLARE_CONCRETE_INSTRUCTION(ClassOfTest, "class-of-test") 871 DECLARE_CONCRETE_INSTRUCTION(ClassOfTest, "class-of-test")
906 DECLARE_HYDROGEN_ACCESSOR(ClassOfTest) 872 DECLARE_HYDROGEN_ACCESSOR(ClassOfTest)
907 873
908 virtual void PrintDataTo(StringStream* stream); 874 virtual void PrintDataTo(StringStream* stream);
909
910 LOperand* temporary() { return temporary_; }
911
912 private:
913 LOperand* temporary_;
914 }; 875 };
915 876
916 877
917 class LClassOfTestAndBranch: public LClassOfTest { 878 class LClassOfTestAndBranch: public LUnaryControlInstruction<2> {
918 public: 879 public:
919 LClassOfTestAndBranch(LOperand* value, 880 LClassOfTestAndBranch(LOperand* value, LOperand* temp, LOperand* temp2)
920 LOperand* temporary, 881 : LUnaryControlInstruction<2>(value) {
921 LOperand* temporary2, 882 SetTempAt(0, temp);
922 int true_block_id, 883 SetTempAt(1, temp2);
923 int false_block_id) 884 }
924 : LClassOfTest(value, temporary),
925 temporary2_(temporary2),
926 true_block_id_(true_block_id),
927 false_block_id_(false_block_id) { }
928 885
929 DECLARE_CONCRETE_INSTRUCTION(ClassOfTestAndBranch, 886 DECLARE_CONCRETE_INSTRUCTION(ClassOfTestAndBranch,
930 "class-of-test-and-branch") 887 "class-of-test-and-branch")
888 DECLARE_HYDROGEN_ACCESSOR(ClassOfTest)
889
931 virtual void PrintDataTo(StringStream* stream); 890 virtual void PrintDataTo(StringStream* stream);
932 virtual bool IsControl() const { return true; }
933
934 int true_block_id() const { return true_block_id_; }
935 int false_block_id() const { return false_block_id_; }
936 LOperand* temporary2() { return temporary2_; }
937
938 private:
939 LOperand* temporary2_;
940 int true_block_id_;
941 int false_block_id_;
942 }; 891 };
943 892
944 893
945 class LCmpT: public LBinaryOperation<1> { 894 class LCmpT: public LBinaryOperation<1> {
946 public: 895 public:
947 LCmpT(LOperand* left, LOperand* right) : LBinaryOperation<1>(left, right) {} 896 LCmpT(LOperand* left, LOperand* right) : LBinaryOperation<1>(left, right) {}
948 897
949 DECLARE_CONCRETE_INSTRUCTION(CmpT, "cmp-t") 898 DECLARE_CONCRETE_INSTRUCTION(CmpT, "cmp-t")
950 DECLARE_HYDROGEN_ACCESSOR(Compare) 899 DECLARE_HYDROGEN_ACCESSOR(Compare)
951 900
952 Token::Value op() const { return hydrogen()->token(); } 901 Token::Value op() const { return hydrogen()->token(); }
953 }; 902 };
954 903
955 904
956 class LCmpTAndBranch: public LCmpT { 905 class LCmpTAndBranch: public LBinaryControlInstruction<> {
957 public: 906 public:
958 LCmpTAndBranch(LOperand* left, 907 LCmpTAndBranch(LOperand* left, LOperand* right)
959 LOperand* right, 908 : LBinaryControlInstruction<>(left, right) { }
960 int true_block_id,
961 int false_block_id)
962 : LCmpT(left, right),
963 true_block_id_(true_block_id),
964 false_block_id_(false_block_id) { }
965 909
966 DECLARE_CONCRETE_INSTRUCTION(CmpTAndBranch, "cmp-t-and-branch") 910 DECLARE_CONCRETE_INSTRUCTION(CmpTAndBranch, "cmp-t-and-branch")
911 DECLARE_HYDROGEN_ACCESSOR(Compare)
967 912
968 int true_block_id() const { return true_block_id_; } 913 Token::Value op() const { return hydrogen()->token(); }
969 int false_block_id() const { return false_block_id_; }
970
971 private:
972 int true_block_id_;
973 int false_block_id_;
974 }; 914 };
975 915
976 916
977 class LInstanceOf: public LBinaryOperation<1> { 917 class LInstanceOf: public LBinaryOperation<1> {
978 public: 918 public:
979 LInstanceOf(LOperand* left, LOperand* right) 919 LInstanceOf(LOperand* left, LOperand* right)
980 : LBinaryOperation<1>(left, right) { } 920 : LBinaryOperation<1>(left, right) { }
981 921
982 DECLARE_CONCRETE_INSTRUCTION(InstanceOf, "instance-of") 922 DECLARE_CONCRETE_INSTRUCTION(InstanceOf, "instance-of")
983 }; 923 };
984 924
985 925
986 class LInstanceOfAndBranch: public LInstanceOf { 926 class LInstanceOfAndBranch: public LBinaryControlInstruction<> {
987 public: 927 public:
988 LInstanceOfAndBranch(LOperand* left, 928 LInstanceOfAndBranch(LOperand* left, LOperand* right)
989 LOperand* right, 929 : LBinaryControlInstruction<>(left, right) { }
990 int true_block_id,
991 int false_block_id)
992 : LInstanceOf(left, right),
993 true_block_id_(true_block_id),
994 false_block_id_(false_block_id) { }
995 930
996 DECLARE_CONCRETE_INSTRUCTION(InstanceOfAndBranch, "instance-of-and-branch") 931 DECLARE_CONCRETE_INSTRUCTION(InstanceOfAndBranch, "instance-of-and-branch")
997
998 int true_block_id() const { return true_block_id_; }
999 int false_block_id() const { return false_block_id_; }
1000
1001 private:
1002 int true_block_id_;
1003 int false_block_id_;
1004 }; 932 };
1005 933
1006 934
1007 class LInstanceOfKnownGlobal: public LUnaryOperation<1> { 935 class LInstanceOfKnownGlobal: public LUnaryOperation<1, 1> {
1008 public: 936 public:
1009 LInstanceOfKnownGlobal(LOperand* left, LOperand* temp) 937 LInstanceOfKnownGlobal(LOperand* left, LOperand* temp)
1010 : LUnaryOperation<1>(left), temp_(temp) { } 938 : LUnaryOperation<1, 1>(left) {
939 SetTempAt(0, temp);
940 }
1011 941
1012 DECLARE_CONCRETE_INSTRUCTION(InstanceOfKnownGlobal, 942 DECLARE_CONCRETE_INSTRUCTION(InstanceOfKnownGlobal,
1013 "instance-of-known-global") 943 "instance-of-known-global")
1014 DECLARE_HYDROGEN_ACCESSOR(InstanceOfKnownGlobal) 944 DECLARE_HYDROGEN_ACCESSOR(InstanceOfKnownGlobal)
1015 945
1016 Handle<JSFunction> function() const { return hydrogen()->function(); } 946 Handle<JSFunction> function() const { return hydrogen()->function(); }
1017 LOperand* temp() const { return temp_; }
1018
1019 private:
1020 LOperand* temp_;
1021 }; 947 };
1022 948
1023 949
1024 class LBoundsCheck: public LBinaryOperation<0> { 950 class LBoundsCheck: public LBinaryOperation<0> {
1025 public: 951 public:
1026 LBoundsCheck(LOperand* index, LOperand* length) 952 LBoundsCheck(LOperand* index, LOperand* length)
1027 : LBinaryOperation<0>(index, length) { } 953 : LBinaryOperation<0>(index, length) { }
1028 954
1029 LOperand* index() const { return left(); } 955 LOperand* index() const { return left(); }
1030 LOperand* length() const { return right(); } 956 LOperand* length() const { return right(); }
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
1108 explicit LConstantT(Handle<Object> value) : value_(value) { } 1034 explicit LConstantT(Handle<Object> value) : value_(value) { }
1109 Handle<Object> value() const { return value_; } 1035 Handle<Object> value() const { return value_; }
1110 1036
1111 DECLARE_CONCRETE_INSTRUCTION(ConstantT, "constant-t") 1037 DECLARE_CONCRETE_INSTRUCTION(ConstantT, "constant-t")
1112 1038
1113 private: 1039 private:
1114 Handle<Object> value_; 1040 Handle<Object> value_;
1115 }; 1041 };
1116 1042
1117 1043
1118 class LBranch: public LUnaryOperation<0> { 1044 class LBranch: public LUnaryControlInstruction<> {
1119 public: 1045 public:
1120 LBranch(LOperand* input, int true_block_id, int false_block_id) 1046 explicit LBranch(LOperand* input) : LUnaryControlInstruction<>(input) { }
1121 : LUnaryOperation<0>(input),
1122 true_block_id_(true_block_id),
1123 false_block_id_(false_block_id) { }
1124 1047
1125 DECLARE_CONCRETE_INSTRUCTION(Branch, "branch") 1048 DECLARE_CONCRETE_INSTRUCTION(Branch, "branch")
1126 DECLARE_HYDROGEN_ACCESSOR(Value) 1049 DECLARE_HYDROGEN_ACCESSOR(Value)
1127 1050
1128 virtual void PrintDataTo(StringStream* stream); 1051 virtual void PrintDataTo(StringStream* stream);
1129 virtual bool IsControl() const { return true; }
1130
1131 int true_block_id() const { return true_block_id_; }
1132 int false_block_id() const { return false_block_id_; }
1133
1134 private:
1135 int true_block_id_;
1136 int false_block_id_;
1137 }; 1052 };
1138 1053
1139 1054
1140 class LCmpMapAndBranch: public LUnaryOperation<0> { 1055 class LCmpMapAndBranch: public LUnaryOperation<0> {
1141 public: 1056 public:
1142 explicit LCmpMapAndBranch(LOperand* value) : LUnaryOperation<0>(value) { } 1057 explicit LCmpMapAndBranch(LOperand* value) : LUnaryOperation<0>(value) { }
1143 1058
1144 DECLARE_CONCRETE_INSTRUCTION(CmpMapAndBranch, "cmp-map-and-branch") 1059 DECLARE_CONCRETE_INSTRUCTION(CmpMapAndBranch, "cmp-map-and-branch")
1145 DECLARE_HYDROGEN_ACCESSOR(CompareMapAndBranch) 1060 DECLARE_HYDROGEN_ACCESSOR(CompareMapAndBranch)
1146 1061
(...skipping 20 matching lines...) Expand all
1167 1082
1168 class LFixedArrayLength: public LUnaryOperation<1> { 1083 class LFixedArrayLength: public LUnaryOperation<1> {
1169 public: 1084 public:
1170 explicit LFixedArrayLength(LOperand* input) : LUnaryOperation<1>(input) { } 1085 explicit LFixedArrayLength(LOperand* input) : LUnaryOperation<1>(input) { }
1171 1086
1172 DECLARE_CONCRETE_INSTRUCTION(FixedArrayLength, "fixed-array-length") 1087 DECLARE_CONCRETE_INSTRUCTION(FixedArrayLength, "fixed-array-length")
1173 DECLARE_HYDROGEN_ACCESSOR(FixedArrayLength) 1088 DECLARE_HYDROGEN_ACCESSOR(FixedArrayLength)
1174 }; 1089 };
1175 1090
1176 1091
1177 class LValueOf: public LUnaryOperation<1> { 1092 class LValueOf: public LUnaryOperation<1, 1> {
1178 public: 1093 public:
1179 LValueOf(LOperand* input, LOperand* temporary) 1094 LValueOf(LOperand* input, LOperand* temp)
1180 : LUnaryOperation<1>(input), temporary_(temporary) { } 1095 : LUnaryOperation<1, 1>(input) {
1181 1096 SetTempAt(0, temp);
1182 LOperand* temporary() const { return temporary_; } 1097 }
1183 1098
1184 DECLARE_CONCRETE_INSTRUCTION(ValueOf, "value-of") 1099 DECLARE_CONCRETE_INSTRUCTION(ValueOf, "value-of")
1185 DECLARE_HYDROGEN_ACCESSOR(ValueOf) 1100 DECLARE_HYDROGEN_ACCESSOR(ValueOf)
1186
1187 private:
1188 LOperand* temporary_;
1189 }; 1101 };
1190 1102
1191 1103
1192 class LThrow: public LUnaryOperation<1> { 1104 class LThrow: public LUnaryOperation<1> {
1193 public: 1105 public:
1194 explicit LThrow(LOperand* value) : LUnaryOperation<1>(value) { } 1106 explicit LThrow(LOperand* value) : LUnaryOperation<1>(value) { }
1195 1107
1196 DECLARE_CONCRETE_INSTRUCTION(Throw, "throw") 1108 DECLARE_CONCRETE_INSTRUCTION(Throw, "throw")
1197 }; 1109 };
1198 1110
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
1277 explicit LLoadNamedGeneric(LOperand* object) : LUnaryOperation<1>(object) { } 1189 explicit LLoadNamedGeneric(LOperand* object) : LUnaryOperation<1>(object) { }
1278 1190
1279 DECLARE_CONCRETE_INSTRUCTION(LoadNamedGeneric, "load-named-generic") 1191 DECLARE_CONCRETE_INSTRUCTION(LoadNamedGeneric, "load-named-generic")
1280 DECLARE_HYDROGEN_ACCESSOR(LoadNamedGeneric) 1192 DECLARE_HYDROGEN_ACCESSOR(LoadNamedGeneric)
1281 1193
1282 LOperand* object() const { return input(); } 1194 LOperand* object() const { return input(); }
1283 Handle<Object> name() const { return hydrogen()->name(); } 1195 Handle<Object> name() const { return hydrogen()->name(); }
1284 }; 1196 };
1285 1197
1286 1198
1287 class LLoadFunctionPrototype: public LUnaryOperation<1> { 1199 class LLoadFunctionPrototype: public LUnaryOperation<1, 1> {
1288 public: 1200 public:
1289 LLoadFunctionPrototype(LOperand* function, LOperand* temporary) 1201 LLoadFunctionPrototype(LOperand* function, LOperand* temp)
1290 : LUnaryOperation<1>(function), temporary_(temporary) { } 1202 : LUnaryOperation<1, 1>(function) {
1203 SetTempAt(0, temp);
1204 }
1291 1205
1292 DECLARE_CONCRETE_INSTRUCTION(LoadFunctionPrototype, "load-function-prototype") 1206 DECLARE_CONCRETE_INSTRUCTION(LoadFunctionPrototype, "load-function-prototype")
1293 DECLARE_HYDROGEN_ACCESSOR(LoadFunctionPrototype) 1207 DECLARE_HYDROGEN_ACCESSOR(LoadFunctionPrototype)
1294 1208
1295 LOperand* function() const { return input(); } 1209 LOperand* function() const { return input(); }
1296 LOperand* temporary() const { return temporary_; }
1297
1298 private:
1299 LOperand* temporary_;
1300 }; 1210 };
1301 1211
1302 1212
1303 class LLoadElements: public LUnaryOperation<1> { 1213 class LLoadElements: public LUnaryOperation<1> {
1304 public: 1214 public:
1305 explicit LLoadElements(LOperand* obj) : LUnaryOperation<1>(obj) { } 1215 explicit LLoadElements(LOperand* obj) : LUnaryOperation<1>(obj) { }
1306 1216
1307 DECLARE_CONCRETE_INSTRUCTION(LoadElements, "load-elements") 1217 DECLARE_CONCRETE_INSTRUCTION(LoadElements, "load-elements")
1308 }; 1218 };
1309 1219
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
1374 DECLARE_CONCRETE_INSTRUCTION(CallConstantFunction, "call-constant-function") 1284 DECLARE_CONCRETE_INSTRUCTION(CallConstantFunction, "call-constant-function")
1375 DECLARE_HYDROGEN_ACCESSOR(CallConstantFunction) 1285 DECLARE_HYDROGEN_ACCESSOR(CallConstantFunction)
1376 1286
1377 virtual void PrintDataTo(StringStream* stream); 1287 virtual void PrintDataTo(StringStream* stream);
1378 1288
1379 Handle<JSFunction> function() { return hydrogen()->function(); } 1289 Handle<JSFunction> function() { return hydrogen()->function(); }
1380 int arity() const { return hydrogen()->argument_count() - 1; } 1290 int arity() const { return hydrogen()->argument_count() - 1; }
1381 }; 1291 };
1382 1292
1383 1293
1384 class LCallKeyed: public LTemplateInstruction<1, 0, 0> { 1294 class LCallKeyed: public LTemplateInstruction<1, 0, 1> {
1385 public: 1295 public:
1296 explicit LCallKeyed(LOperand* temp) {
1297 SetTempAt(0, temp);
1298 }
1299
1386 DECLARE_CONCRETE_INSTRUCTION(CallKeyed, "call-keyed") 1300 DECLARE_CONCRETE_INSTRUCTION(CallKeyed, "call-keyed")
1387 DECLARE_HYDROGEN_ACCESSOR(CallKeyed) 1301 DECLARE_HYDROGEN_ACCESSOR(CallKeyed)
1388 1302
1389 virtual void PrintDataTo(StringStream* stream); 1303 virtual void PrintDataTo(StringStream* stream);
1390 1304
1391 int arity() const { return hydrogen()->argument_count() - 1; } 1305 int arity() const { return hydrogen()->argument_count() - 1; }
1392 }; 1306 };
1393 1307
1394 1308
1395 class LCallNamed: public LTemplateInstruction<1, 0, 0> { 1309 class LCallNamed: public LTemplateInstruction<1, 0, 0> {
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
1469 1383
1470 1384
1471 class LNumberTagI: public LUnaryOperation<1> { 1385 class LNumberTagI: public LUnaryOperation<1> {
1472 public: 1386 public:
1473 explicit LNumberTagI(LOperand* use) : LUnaryOperation<1>(use) { } 1387 explicit LNumberTagI(LOperand* use) : LUnaryOperation<1>(use) { }
1474 1388
1475 DECLARE_CONCRETE_INSTRUCTION(NumberTagI, "number-tag-i") 1389 DECLARE_CONCRETE_INSTRUCTION(NumberTagI, "number-tag-i")
1476 }; 1390 };
1477 1391
1478 1392
1479 class LNumberTagD: public LUnaryOperation<1> { 1393 class LNumberTagD: public LUnaryOperation<1, 1> {
1480 public: 1394 public:
1481 explicit LNumberTagD(LOperand* value, LOperand* temp) 1395 explicit LNumberTagD(LOperand* value, LOperand* temp)
1482 : LUnaryOperation<1>(value), temp_(temp) { } 1396 : LUnaryOperation<1, 1>(value) {
1397 SetTempAt(0, temp);
1398 }
1483 1399
1484 DECLARE_CONCRETE_INSTRUCTION(NumberTagD, "number-tag-d") 1400 DECLARE_CONCRETE_INSTRUCTION(NumberTagD, "number-tag-d")
1485
1486 LOperand* temp() const { return temp_; }
1487
1488 private:
1489 LOperand* temp_;
1490 }; 1401 };
1491 1402
1492 1403
1493 // Sometimes truncating conversion from a tagged value to an int32. 1404 // Sometimes truncating conversion from a tagged value to an int32.
1494 class LDoubleToI: public LUnaryOperation<1> { 1405 class LDoubleToI: public LUnaryOperation<1, 1> {
1495 public: 1406 public:
1496 LDoubleToI(LOperand* value, LOperand* temporary) 1407 LDoubleToI(LOperand* value, LOperand* temp) : LUnaryOperation<1, 1>(value) {
1497 : LUnaryOperation<1>(value), temporary_(temporary) { } 1408 SetTempAt(0, temp);
1409 }
1498 1410
1499 DECLARE_CONCRETE_INSTRUCTION(DoubleToI, "double-to-i") 1411 DECLARE_CONCRETE_INSTRUCTION(DoubleToI, "double-to-i")
1500 DECLARE_HYDROGEN_ACCESSOR(Change) 1412 DECLARE_HYDROGEN_ACCESSOR(Change)
1501 1413
1502 bool truncating() { return hydrogen()->CanTruncateToInt32(); } 1414 bool truncating() { return hydrogen()->CanTruncateToInt32(); }
1503 LOperand* temporary() const { return temporary_; }
1504
1505 private:
1506 LOperand* temporary_;
1507 }; 1415 };
1508 1416
1509 1417
1510 // Truncating conversion from a tagged value to an int32. 1418 // Truncating conversion from a tagged value to an int32.
1511 class LTaggedToI: public LUnaryOperation<1> { 1419 class LTaggedToI: public LUnaryOperation<1, 1> {
1512 public: 1420 public:
1513 LTaggedToI(LOperand* value, LOperand* temp) 1421 LTaggedToI(LOperand* value, LOperand* temp)
1514 : LUnaryOperation<1>(value), temp_(temp) { } 1422 : LUnaryOperation<1, 1>(value) {
1423 SetTempAt(0, temp);
1424 }
1515 1425
1516 DECLARE_CONCRETE_INSTRUCTION(TaggedToI, "tagged-to-i") 1426 DECLARE_CONCRETE_INSTRUCTION(TaggedToI, "tagged-to-i")
1517 DECLARE_HYDROGEN_ACCESSOR(Change) 1427 DECLARE_HYDROGEN_ACCESSOR(Change)
1518 1428
1519 bool truncating() { return hydrogen()->CanTruncateToInt32(); } 1429 bool truncating() { return hydrogen()->CanTruncateToInt32(); }
1520 LOperand* temp() const { return temp_; }
1521
1522 private:
1523 LOperand* temp_;
1524 }; 1430 };
1525 1431
1526 1432
1527 class LSmiTag: public LUnaryOperation<1> { 1433 class LSmiTag: public LUnaryOperation<1> {
1528 public: 1434 public:
1529 explicit LSmiTag(LOperand* use) : LUnaryOperation<1>(use) { } 1435 explicit LSmiTag(LOperand* use) : LUnaryOperation<1>(use) { }
1530 1436
1531 DECLARE_CONCRETE_INSTRUCTION(SmiTag, "smi-tag") 1437 DECLARE_CONCRETE_INSTRUCTION(SmiTag, "smi-tag")
1532 }; 1438 };
1533 1439
(...skipping 13 matching lines...) Expand all
1547 1453
1548 DECLARE_CONCRETE_INSTRUCTION(SmiUntag, "smi-untag") 1454 DECLARE_CONCRETE_INSTRUCTION(SmiUntag, "smi-untag")
1549 1455
1550 bool needs_check() const { return needs_check_; } 1456 bool needs_check() const { return needs_check_; }
1551 1457
1552 private: 1458 private:
1553 bool needs_check_; 1459 bool needs_check_;
1554 }; 1460 };
1555 1461
1556 1462
1557 class LStoreNamed: public LTemplateInstruction<0, 2, 0> { 1463 class LStoreNamed: public LTemplateInstruction<0, 2, 1> {
1558 public: 1464 public:
1559 LStoreNamed(LOperand* obj, LOperand* val) { 1465 LStoreNamed(LOperand* obj, LOperand* val) {
1560 this->SetInputAt(0, obj); 1466 this->SetInputAt(0, obj);
1561 this->SetInputAt(1, val); 1467 this->SetInputAt(1, val);
1562 } 1468 }
1563 1469
1564 DECLARE_INSTRUCTION(StoreNamed) 1470 DECLARE_INSTRUCTION(StoreNamed)
1565 DECLARE_HYDROGEN_ACCESSOR(StoreNamed) 1471 DECLARE_HYDROGEN_ACCESSOR(StoreNamed)
1566 1472
1567 virtual void PrintDataTo(StringStream* stream); 1473 virtual void PrintDataTo(StringStream* stream);
1568 1474
1569 LOperand* object() const { return this->InputAt(0); } 1475 LOperand* object() const { return this->InputAt(0); }
1570 LOperand* value() const { return this->InputAt(1); } 1476 LOperand* value() const { return this->InputAt(1); }
1571 Handle<Object> name() const { return hydrogen()->name(); } 1477 Handle<Object> name() const { return hydrogen()->name(); }
1572 }; 1478 };
1573 1479
1574 1480
1575 class LStoreNamedField: public LStoreNamed { 1481 class LStoreNamedField: public LStoreNamed {
1576 public: 1482 public:
1577 LStoreNamedField(LOperand* obj, LOperand* val, LOperand* temp) 1483 LStoreNamedField(LOperand* obj, LOperand* val, LOperand* temp)
1578 : LStoreNamed(obj, val), temp_(temp) { } 1484 : LStoreNamed(obj, val) {
1485 SetTempAt(0, temp);
1486 }
1579 1487
1580 DECLARE_CONCRETE_INSTRUCTION(StoreNamedField, "store-named-field") 1488 DECLARE_CONCRETE_INSTRUCTION(StoreNamedField, "store-named-field")
1581 DECLARE_HYDROGEN_ACCESSOR(StoreNamedField) 1489 DECLARE_HYDROGEN_ACCESSOR(StoreNamedField)
1582 1490
1583 bool is_in_object() { return hydrogen()->is_in_object(); } 1491 bool is_in_object() { return hydrogen()->is_in_object(); }
1584 int offset() { return hydrogen()->offset(); } 1492 int offset() { return hydrogen()->offset(); }
1585 bool needs_write_barrier() { return hydrogen()->NeedsWriteBarrier(); } 1493 bool needs_write_barrier() { return hydrogen()->NeedsWriteBarrier(); }
1586 Handle<Map> transition() const { return hydrogen()->transition(); } 1494 Handle<Map> transition() const { return hydrogen()->transition(); }
1587
1588 LOperand* temp() { return temp_; }
1589
1590 private:
1591 LOperand* temp_;
1592 }; 1495 };
1593 1496
1594 1497
1595 class LStoreNamedGeneric: public LStoreNamed { 1498 class LStoreNamedGeneric: public LStoreNamed {
1596 public: 1499 public:
1597 LStoreNamedGeneric(LOperand* obj, LOperand* val) 1500 LStoreNamedGeneric(LOperand* obj, LOperand* val)
1598 : LStoreNamed(obj, val) { } 1501 : LStoreNamed(obj, val) { }
1599 1502
1600 DECLARE_CONCRETE_INSTRUCTION(StoreNamedGeneric, "store-named-generic") 1503 DECLARE_CONCRETE_INSTRUCTION(StoreNamedGeneric, "store-named-generic")
1601 DECLARE_HYDROGEN_ACCESSOR(StoreNamedGeneric) 1504 DECLARE_HYDROGEN_ACCESSOR(StoreNamedGeneric)
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
1642 1545
1643 class LCheckFunction: public LUnaryOperation<0> { 1546 class LCheckFunction: public LUnaryOperation<0> {
1644 public: 1547 public:
1645 explicit LCheckFunction(LOperand* use) : LUnaryOperation<0>(use) { } 1548 explicit LCheckFunction(LOperand* use) : LUnaryOperation<0>(use) { }
1646 1549
1647 DECLARE_CONCRETE_INSTRUCTION(CheckFunction, "check-function") 1550 DECLARE_CONCRETE_INSTRUCTION(CheckFunction, "check-function")
1648 DECLARE_HYDROGEN_ACCESSOR(CheckFunction) 1551 DECLARE_HYDROGEN_ACCESSOR(CheckFunction)
1649 }; 1552 };
1650 1553
1651 1554
1652 class LCheckInstanceType: public LUnaryOperation<0> { 1555 class LCheckInstanceType: public LUnaryOperation<0, 1> {
1653 public: 1556 public:
1654 LCheckInstanceType(LOperand* use, LOperand* temp) 1557 LCheckInstanceType(LOperand* use, LOperand* temp)
1655 : LUnaryOperation<0>(use), temp_(temp) { } 1558 : LUnaryOperation<0, 1>(use) {
1559 SetTempAt(0, temp);
1560 }
1656 1561
1657 DECLARE_CONCRETE_INSTRUCTION(CheckInstanceType, "check-instance-type") 1562 DECLARE_CONCRETE_INSTRUCTION(CheckInstanceType, "check-instance-type")
1658 DECLARE_HYDROGEN_ACCESSOR(CheckInstanceType) 1563 DECLARE_HYDROGEN_ACCESSOR(CheckInstanceType)
1659
1660 LOperand* temp() const { return temp_; }
1661
1662 private:
1663 LOperand* temp_;
1664 }; 1564 };
1665 1565
1666 1566
1667 class LCheckMap: public LUnaryOperation<0> { 1567 class LCheckMap: public LUnaryOperation<0> {
1668 public: 1568 public:
1669 explicit LCheckMap(LOperand* use) : LUnaryOperation<0>(use) { } 1569 explicit LCheckMap(LOperand* use) : LUnaryOperation<0>(use) { }
1670 1570
1671 DECLARE_CONCRETE_INSTRUCTION(CheckMap, "check-map") 1571 DECLARE_CONCRETE_INSTRUCTION(CheckMap, "check-map")
1672 DECLARE_HYDROGEN_ACCESSOR(CheckMap) 1572 DECLARE_HYDROGEN_ACCESSOR(CheckMap)
1673 }; 1573 };
1674 1574
1675 1575
1676 class LCheckPrototypeMaps: public LTemplateInstruction<0, 0, 0> { 1576 class LCheckPrototypeMaps: public LTemplateInstruction<0, 0, 1> {
1677 public: 1577 public:
1678 explicit LCheckPrototypeMaps(LOperand* temp) : temp_(temp) { } 1578 explicit LCheckPrototypeMaps(LOperand* temp) {
1579 SetTempAt(0, temp);
1580 }
1679 1581
1680 DECLARE_CONCRETE_INSTRUCTION(CheckPrototypeMaps, "check-prototype-maps") 1582 DECLARE_CONCRETE_INSTRUCTION(CheckPrototypeMaps, "check-prototype-maps")
1681 DECLARE_HYDROGEN_ACCESSOR(CheckPrototypeMaps) 1583 DECLARE_HYDROGEN_ACCESSOR(CheckPrototypeMaps)
1682 1584
1683 Handle<JSObject> holder() const { return hydrogen()->holder(); } 1585 Handle<JSObject> holder() const { return hydrogen()->holder(); }
1684 Handle<Map> receiver_map() const { return hydrogen()->receiver_map(); } 1586 Handle<Map> receiver_map() const { return hydrogen()->receiver_map(); }
1685
1686 LOperand* temp() const { return temp_; }
1687
1688 private:
1689 LOperand* temp_;
1690 }; 1587 };
1691 1588
1692 1589
1693 class LCheckSmi: public LUnaryOperation<0> { 1590 class LCheckSmi: public LUnaryOperation<0> {
1694 public: 1591 public:
1695 LCheckSmi(LOperand* use, Condition condition) 1592 LCheckSmi(LOperand* use, Condition condition)
1696 : LUnaryOperation<0>(use), condition_(condition) { } 1593 : LUnaryOperation<0>(use), condition_(condition) { }
1697 1594
1698 Condition condition() const { return condition_; } 1595 Condition condition() const { return condition_; }
1699 1596
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
1747 public: 1644 public:
1748 explicit LTypeof(LOperand* input) : LUnaryOperation<1>(input) { } 1645 explicit LTypeof(LOperand* input) : LUnaryOperation<1>(input) { }
1749 1646
1750 DECLARE_CONCRETE_INSTRUCTION(Typeof, "typeof") 1647 DECLARE_CONCRETE_INSTRUCTION(Typeof, "typeof")
1751 }; 1648 };
1752 1649
1753 1650
1754 class LTypeofIs: public LUnaryOperation<1> { 1651 class LTypeofIs: public LUnaryOperation<1> {
1755 public: 1652 public:
1756 explicit LTypeofIs(LOperand* input) : LUnaryOperation<1>(input) { } 1653 explicit LTypeofIs(LOperand* input) : LUnaryOperation<1>(input) { }
1757 virtual void PrintDataTo(StringStream* stream);
1758 1654
1759 DECLARE_CONCRETE_INSTRUCTION(TypeofIs, "typeof-is") 1655 DECLARE_CONCRETE_INSTRUCTION(TypeofIs, "typeof-is")
1760 DECLARE_HYDROGEN_ACCESSOR(TypeofIs) 1656 DECLARE_HYDROGEN_ACCESSOR(TypeofIs)
1761 1657
1762 Handle<String> type_literal() { return hydrogen()->type_literal(); } 1658 Handle<String> type_literal() { return hydrogen()->type_literal(); }
1659
1660 virtual void PrintDataTo(StringStream* stream);
1763 }; 1661 };
1764 1662
1765 1663
1766 class LTypeofIsAndBranch: public LTypeofIs { 1664 class LTypeofIsAndBranch: public LUnaryControlInstruction<> {
1767 public: 1665 public:
1768 LTypeofIsAndBranch(LOperand* value, 1666 explicit LTypeofIsAndBranch(LOperand* value)
1769 int true_block_id, 1667 : LUnaryControlInstruction<>(value) { }
1770 int false_block_id)
1771 : LTypeofIs(value),
1772 true_block_id_(true_block_id),
1773 false_block_id_(false_block_id) { }
1774 1668
1775 DECLARE_CONCRETE_INSTRUCTION(TypeofIsAndBranch, "typeof-is-and-branch") 1669 DECLARE_CONCRETE_INSTRUCTION(TypeofIsAndBranch, "typeof-is-and-branch")
1670 DECLARE_HYDROGEN_ACCESSOR(TypeofIs)
1671
1672 Handle<String> type_literal() { return hydrogen()->type_literal(); }
1776 1673
1777 virtual void PrintDataTo(StringStream* stream); 1674 virtual void PrintDataTo(StringStream* stream);
1778 virtual bool IsControl() const { return true; }
1779
1780 int true_block_id() const { return true_block_id_; }
1781 int false_block_id() const { return false_block_id_; }
1782
1783 private:
1784 int true_block_id_;
1785 int false_block_id_;
1786 }; 1675 };
1787 1676
1788 1677
1789 class LDeleteProperty: public LBinaryOperation<1> { 1678 class LDeleteProperty: public LBinaryOperation<1> {
1790 public: 1679 public:
1791 LDeleteProperty(LOperand* obj, LOperand* key) 1680 LDeleteProperty(LOperand* obj, LOperand* key)
1792 : LBinaryOperation<1>(obj, key) { } 1681 : LBinaryOperation<1>(obj, key) { }
1793 1682
1794 DECLARE_CONCRETE_INSTRUCTION(DeleteProperty, "delete-property") 1683 DECLARE_CONCRETE_INSTRUCTION(DeleteProperty, "delete-property")
1795 1684
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
1931 bool is_aborted() const { return status_ == ABORTED; } 1820 bool is_aborted() const { return status_ == ABORTED; }
1932 1821
1933 void Abort(const char* format, ...); 1822 void Abort(const char* format, ...);
1934 1823
1935 // Methods for getting operands for Use / Define / Temp. 1824 // Methods for getting operands for Use / Define / Temp.
1936 LRegister* ToOperand(Register reg); 1825 LRegister* ToOperand(Register reg);
1937 LUnallocated* ToUnallocated(Register reg); 1826 LUnallocated* ToUnallocated(Register reg);
1938 LUnallocated* ToUnallocated(XMMRegister reg); 1827 LUnallocated* ToUnallocated(XMMRegister reg);
1939 1828
1940 // Methods for setting up define-use relationships. 1829 // Methods for setting up define-use relationships.
1941 LOperand* Use(HValue* value, LUnallocated* operand); 1830 MUST_USE_RESULT LOperand* Use(HValue* value, LUnallocated* operand);
1942 LOperand* UseFixed(HValue* value, Register fixed_register); 1831 MUST_USE_RESULT LOperand* UseFixed(HValue* value, Register fixed_register);
1943 LOperand* UseFixedDouble(HValue* value, XMMRegister fixed_register); 1832 MUST_USE_RESULT LOperand* UseFixedDouble(HValue* value,
1833 XMMRegister fixed_register);
1944 1834
1945 // A value that is guaranteed to be allocated to a register. 1835 // A value that is guaranteed to be allocated to a register.
1946 // Operand created by UseRegister is guaranteed to be live until the end of 1836 // Operand created by UseRegister is guaranteed to be live until the end of
1947 // instruction. This means that register allocator will not reuse it's 1837 // instruction. This means that register allocator will not reuse it's
1948 // register for any other operand inside instruction. 1838 // register for any other operand inside instruction.
1949 // Operand created by UseRegisterAtStart is guaranteed to be live only at 1839 // Operand created by UseRegisterAtStart is guaranteed to be live only at
1950 // instruction start. Register allocator is free to assign the same register 1840 // instruction start. Register allocator is free to assign the same register
1951 // to some other operand used inside instruction (i.e. temporary or 1841 // to some other operand used inside instruction (i.e. temporary or
1952 // output). 1842 // output).
1953 LOperand* UseRegister(HValue* value); 1843 MUST_USE_RESULT LOperand* UseRegister(HValue* value);
1954 LOperand* UseRegisterAtStart(HValue* value); 1844 MUST_USE_RESULT LOperand* UseRegisterAtStart(HValue* value);
1955 1845
1956 // A value in a register that may be trashed. 1846 // A value in a register that may be trashed.
1957 LOperand* UseTempRegister(HValue* value); 1847 MUST_USE_RESULT LOperand* UseTempRegister(HValue* value);
1958 LOperand* Use(HValue* value); 1848 MUST_USE_RESULT LOperand* Use(HValue* value);
1959 LOperand* UseAtStart(HValue* value); 1849 MUST_USE_RESULT LOperand* UseAtStart(HValue* value);
1960 LOperand* UseOrConstant(HValue* value); 1850 MUST_USE_RESULT LOperand* UseOrConstant(HValue* value);
1961 LOperand* UseOrConstantAtStart(HValue* value); 1851 MUST_USE_RESULT LOperand* UseOrConstantAtStart(HValue* value);
1962 LOperand* UseRegisterOrConstant(HValue* value); 1852 MUST_USE_RESULT LOperand* UseRegisterOrConstant(HValue* value);
1963 LOperand* UseRegisterOrConstantAtStart(HValue* value); 1853 MUST_USE_RESULT LOperand* UseRegisterOrConstantAtStart(HValue* value);
1854
1855 // Temporary operand that must be in a register.
1856 MUST_USE_RESULT LUnallocated* TempRegister();
1857 MUST_USE_RESULT LOperand* FixedTemp(Register reg);
1858 MUST_USE_RESULT LOperand* FixedTemp(XMMRegister reg);
1964 1859
1965 // Methods for setting up define-use relationships. 1860 // Methods for setting up define-use relationships.
1966 // Return the same instruction that they are passed. 1861 // Return the same instruction that they are passed.
1967 template<int I, int T> 1862 template<int I, int T>
1968 LInstruction* Define(LTemplateInstruction<1, I, T>* instr, 1863 LInstruction* Define(LTemplateInstruction<1, I, T>* instr,
1969 LUnallocated* result); 1864 LUnallocated* result);
1970 template<int I, int T> 1865 template<int I, int T>
1971 LInstruction* Define(LTemplateInstruction<1, I, T>* instr); 1866 LInstruction* Define(LTemplateInstruction<1, I, T>* instr);
1972 template<int I, int T> 1867 template<int I, int T>
1973 LInstruction* DefineAsRegister(LTemplateInstruction<1, I, T>* instr); 1868 LInstruction* DefineAsRegister(LTemplateInstruction<1, I, T>* instr);
(...skipping 21 matching lines...) Expand all
1995 HInstruction* hinstr, 1890 HInstruction* hinstr,
1996 CanDeoptimize can_deoptimize = CANNOT_DEOPTIMIZE_EAGERLY); 1891 CanDeoptimize can_deoptimize = CANNOT_DEOPTIMIZE_EAGERLY);
1997 LInstruction* MarkAsSaveDoubles(LInstruction* instr); 1892 LInstruction* MarkAsSaveDoubles(LInstruction* instr);
1998 1893
1999 LInstruction* SetInstructionPendingDeoptimizationEnvironment( 1894 LInstruction* SetInstructionPendingDeoptimizationEnvironment(
2000 LInstruction* instr, int ast_id); 1895 LInstruction* instr, int ast_id);
2001 void ClearInstructionPendingDeoptimizationEnvironment(); 1896 void ClearInstructionPendingDeoptimizationEnvironment();
2002 1897
2003 LEnvironment* CreateEnvironment(HEnvironment* hydrogen_env); 1898 LEnvironment* CreateEnvironment(HEnvironment* hydrogen_env);
2004 1899
2005 // Temporary operand that must be in a register.
2006 LUnallocated* TempRegister();
2007 LOperand* FixedTemp(Register reg);
2008 LOperand* FixedTemp(XMMRegister reg);
2009
2010 void VisitInstruction(HInstruction* current); 1900 void VisitInstruction(HInstruction* current);
2011 1901
2012 void DoBasicBlock(HBasicBlock* block, HBasicBlock* next_block); 1902 void DoBasicBlock(HBasicBlock* block, HBasicBlock* next_block);
2013 LInstruction* DoBit(Token::Value op, HBitwiseBinaryOperation* instr); 1903 LInstruction* DoBit(Token::Value op, HBitwiseBinaryOperation* instr);
2014 LInstruction* DoShift(Token::Value op, HBitwiseBinaryOperation* instr); 1904 LInstruction* DoShift(Token::Value op, HBitwiseBinaryOperation* instr);
2015 LInstruction* DoArithmeticD(Token::Value op, 1905 LInstruction* DoArithmeticD(Token::Value op,
2016 HArithmeticBinaryOperation* instr); 1906 HArithmeticBinaryOperation* instr);
2017 LInstruction* DoArithmeticT(Token::Value op, 1907 LInstruction* DoArithmeticT(Token::Value op,
2018 HArithmeticBinaryOperation* instr); 1908 HArithmeticBinaryOperation* instr);
2019 1909
(...skipping 12 matching lines...) Expand all
2032 DISALLOW_COPY_AND_ASSIGN(LChunkBuilder); 1922 DISALLOW_COPY_AND_ASSIGN(LChunkBuilder);
2033 }; 1923 };
2034 1924
2035 #undef DECLARE_HYDROGEN_ACCESSOR 1925 #undef DECLARE_HYDROGEN_ACCESSOR
2036 #undef DECLARE_INSTRUCTION 1926 #undef DECLARE_INSTRUCTION
2037 #undef DECLARE_CONCRETE_INSTRUCTION 1927 #undef DECLARE_CONCRETE_INSTRUCTION
2038 1928
2039 } } // namespace v8::internal 1929 } } // namespace v8::internal
2040 1930
2041 #endif // V8_IA32_LITHIUM_IA32_H_ 1931 #endif // V8_IA32_LITHIUM_IA32_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698