Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef VM_INTERMEDIATE_LANGUAGE_H_ | 5 #ifndef VM_INTERMEDIATE_LANGUAGE_H_ |
| 6 #define VM_INTERMEDIATE_LANGUAGE_H_ | 6 #define VM_INTERMEDIATE_LANGUAGE_H_ |
| 7 | 7 |
| 8 #include "vm/allocation.h" | 8 #include "vm/allocation.h" |
| 9 #include "vm/ast.h" | 9 #include "vm/ast.h" |
| 10 #include "vm/growable_array.h" | 10 #include "vm/growable_array.h" |
| (...skipping 486 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 497 M(BoxInteger) \ | 497 M(BoxInteger) \ |
| 498 M(BinaryMintOp) \ | 498 M(BinaryMintOp) \ |
| 499 M(ShiftMintOp) \ | 499 M(ShiftMintOp) \ |
| 500 M(UnaryMintOp) \ | 500 M(UnaryMintOp) \ |
| 501 M(CheckArrayBound) \ | 501 M(CheckArrayBound) \ |
| 502 M(Constraint) \ | 502 M(Constraint) \ |
| 503 M(StringFromCharCode) \ | 503 M(StringFromCharCode) \ |
| 504 M(InvokeMathCFunction) \ | 504 M(InvokeMathCFunction) \ |
| 505 M(GuardField) \ | 505 M(GuardField) \ |
| 506 M(IfThenElse) \ | 506 M(IfThenElse) \ |
| 507 M(TestSmi) \ | |
| 507 | 508 |
| 508 #define FORWARD_DECLARATION(type) class type##Instr; | 509 #define FORWARD_DECLARATION(type) class type##Instr; |
| 509 FOR_EACH_INSTRUCTION(FORWARD_DECLARATION) | 510 FOR_EACH_INSTRUCTION(FORWARD_DECLARATION) |
| 510 #undef FORWARD_DECLARATION | 511 #undef FORWARD_DECLARATION |
| 511 | 512 |
| 512 | 513 |
| 513 // Functions required in all concrete instruction classes. | 514 // Functions required in all concrete instruction classes. |
| 514 #define DECLARE_INSTRUCTION(type) \ | 515 #define DECLARE_INSTRUCTION(type) \ |
| 515 virtual Tag tag() const { return k##type; } \ | 516 virtual Tag tag() const { return k##type; } \ |
| 516 virtual void Accept(FlowGraphVisitor* visitor); \ | 517 virtual void Accept(FlowGraphVisitor* visitor); \ |
| (...skipping 1962 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2479 | 2480 |
| 2480 Token::Kind kind() const { return kind_; } | 2481 Token::Kind kind() const { return kind_; } |
| 2481 | 2482 |
| 2482 virtual void EmitBranchCode(FlowGraphCompiler* compiler, | 2483 virtual void EmitBranchCode(FlowGraphCompiler* compiler, |
| 2483 BranchInstr* branch) = 0; | 2484 BranchInstr* branch) = 0; |
| 2484 | 2485 |
| 2485 void SetDeoptId(intptr_t deopt_id) { | 2486 void SetDeoptId(intptr_t deopt_id) { |
| 2486 deopt_id_ = deopt_id; | 2487 deopt_id_ = deopt_id; |
| 2487 } | 2488 } |
| 2488 | 2489 |
| 2490 virtual bool IsSmiEquality() const { | |
| 2491 return false; | |
| 2492 } | |
| 2493 | |
| 2489 protected: | 2494 protected: |
| 2490 Token::Kind kind_; | 2495 Token::Kind kind_; |
| 2491 }; | 2496 }; |
| 2492 | 2497 |
| 2493 | 2498 |
| 2494 // Inlined functions from class BranchInstr that forward to their comparison. | 2499 // Inlined functions from class BranchInstr that forward to their comparison. |
| 2495 inline intptr_t BranchInstr::ArgumentCount() const { | 2500 inline intptr_t BranchInstr::ArgumentCount() const { |
| 2496 return comparison()->ArgumentCount(); | 2501 return comparison()->ArgumentCount(); |
| 2497 } | 2502 } |
| 2498 | 2503 |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2578 | 2583 |
| 2579 private: | 2584 private: |
| 2580 // True if the comparison must check for double, Mint or Bigint and | 2585 // True if the comparison must check for double, Mint or Bigint and |
| 2581 // use value comparison instead. | 2586 // use value comparison instead. |
| 2582 bool needs_number_check_; | 2587 bool needs_number_check_; |
| 2583 | 2588 |
| 2584 DISALLOW_COPY_AND_ASSIGN(StrictCompareInstr); | 2589 DISALLOW_COPY_AND_ASSIGN(StrictCompareInstr); |
| 2585 }; | 2590 }; |
| 2586 | 2591 |
| 2587 | 2592 |
| 2593 class TestSmiInstr : public ComparisonInstr { | |
|
srdjan
2013/04/15 20:27:27
Maybe add comment what this instruction is for.
Vyacheslav Egorov (Google)
2013/04/16 11:51:16
Done.
| |
| 2594 public: | |
| 2595 TestSmiInstr(Token::Kind kind, Value* left, Value* right) | |
| 2596 : ComparisonInstr(kind, left, right) { | |
| 2597 } | |
| 2598 | |
| 2599 DECLARE_INSTRUCTION(TestSmi); | |
| 2600 | |
| 2601 virtual CompileType ComputeType() const { | |
| 2602 return CompileType::Bool(); | |
| 2603 } | |
| 2604 | |
| 2605 virtual bool CanDeoptimize() const { | |
| 2606 return false; | |
| 2607 } | |
| 2608 | |
| 2609 virtual bool HasSideEffect() const { | |
| 2610 return false; | |
| 2611 } | |
| 2612 | |
| 2613 virtual void EmitBranchCode(FlowGraphCompiler* compiler, | |
| 2614 BranchInstr* branch); | |
| 2615 | |
| 2616 virtual Representation RequiredInputRepresentation(intptr_t idx) const { | |
| 2617 return kTagged; | |
| 2618 } | |
| 2619 | |
| 2620 private: | |
| 2621 DISALLOW_COPY_AND_ASSIGN(TestSmiInstr); | |
| 2622 }; | |
| 2623 | |
| 2624 | |
| 2588 class EqualityCompareInstr : public ComparisonInstr { | 2625 class EqualityCompareInstr : public ComparisonInstr { |
| 2589 public: | 2626 public: |
| 2590 EqualityCompareInstr(intptr_t token_pos, | 2627 EqualityCompareInstr(intptr_t token_pos, |
| 2591 Token::Kind kind, | 2628 Token::Kind kind, |
| 2592 Value* left, | 2629 Value* left, |
| 2593 Value* right) | 2630 Value* right) |
| 2594 : ComparisonInstr(kind, left, right), | 2631 : ComparisonInstr(kind, left, right), |
| 2595 token_pos_(token_pos), | 2632 token_pos_(token_pos), |
| 2596 receiver_class_id_(kIllegalCid) { | 2633 receiver_class_id_(kIllegalCid) { |
| 2597 // deopt_id() checks receiver_class_id_ value. | 2634 // deopt_id() checks receiver_class_id_ value. |
| 2598 ic_data_ = Isolate::Current()->GetICDataForDeoptId(deopt_id()); | 2635 ic_data_ = Isolate::Current()->GetICDataForDeoptId(deopt_id()); |
| 2599 ASSERT((kind == Token::kEQ) || (kind == Token::kNE)); | 2636 ASSERT((kind == Token::kEQ) || |
| 2637 (kind == Token::kNE)); | |
|
srdjan
2013/04/15 20:27:27
Back to one line?
Vyacheslav Egorov (Google)
2013/04/16 11:51:16
Done.
| |
| 2600 } | 2638 } |
| 2601 | 2639 |
| 2602 DECLARE_INSTRUCTION(EqualityCompare) | 2640 DECLARE_INSTRUCTION(EqualityCompare) |
| 2603 virtual CompileType ComputeType() const; | 2641 virtual CompileType ComputeType() const; |
| 2604 virtual bool RecomputeType(); | 2642 virtual bool RecomputeType(); |
| 2605 | 2643 |
| 2606 const ICData* ic_data() const { return ic_data_; } | 2644 const ICData* ic_data() const { return ic_data_; } |
| 2607 bool HasICData() const { | 2645 bool HasICData() const { |
| 2608 return (ic_data() != NULL) && !ic_data()->IsNull(); | 2646 return (ic_data() != NULL) && !ic_data()->IsNull(); |
| 2609 } | 2647 } |
| (...skipping 30 matching lines...) Expand all Loading... | |
| 2640 | 2678 |
| 2641 virtual Representation RequiredInputRepresentation(intptr_t idx) const { | 2679 virtual Representation RequiredInputRepresentation(intptr_t idx) const { |
| 2642 ASSERT((idx == 0) || (idx == 1)); | 2680 ASSERT((idx == 0) || (idx == 1)); |
| 2643 if (receiver_class_id() == kDoubleCid) return kUnboxedDouble; | 2681 if (receiver_class_id() == kDoubleCid) return kUnboxedDouble; |
| 2644 if (receiver_class_id() == kMintCid) return kUnboxedMint; | 2682 if (receiver_class_id() == kMintCid) return kUnboxedMint; |
| 2645 return kTagged; | 2683 return kTagged; |
| 2646 } | 2684 } |
| 2647 | 2685 |
| 2648 bool IsPolymorphic() const; | 2686 bool IsPolymorphic() const; |
| 2649 | 2687 |
| 2688 virtual bool IsSmiEquality() const { | |
| 2689 return receiver_class_id() == kSmiCid; | |
| 2690 } | |
| 2691 | |
| 2650 private: | 2692 private: |
| 2651 const ICData* ic_data_; | 2693 const ICData* ic_data_; |
| 2652 const intptr_t token_pos_; | 2694 const intptr_t token_pos_; |
| 2653 intptr_t receiver_class_id_; // Set by optimizer. | 2695 intptr_t receiver_class_id_; // Set by optimizer. |
| 2654 | 2696 |
| 2655 DISALLOW_COPY_AND_ASSIGN(EqualityCompareInstr); | 2697 DISALLOW_COPY_AND_ASSIGN(EqualityCompareInstr); |
| 2656 }; | 2698 }; |
| 2657 | 2699 |
| 2658 | 2700 |
| 2659 class RelationalOpInstr : public ComparisonInstr { | 2701 class RelationalOpInstr : public ComparisonInstr { |
| (...skipping 2224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4884 ForwardInstructionIterator* current_iterator_; | 4926 ForwardInstructionIterator* current_iterator_; |
| 4885 | 4927 |
| 4886 private: | 4928 private: |
| 4887 DISALLOW_COPY_AND_ASSIGN(FlowGraphVisitor); | 4929 DISALLOW_COPY_AND_ASSIGN(FlowGraphVisitor); |
| 4888 }; | 4930 }; |
| 4889 | 4931 |
| 4890 | 4932 |
| 4891 } // namespace dart | 4933 } // namespace dart |
| 4892 | 4934 |
| 4893 #endif // VM_INTERMEDIATE_LANGUAGE_H_ | 4935 #endif // VM_INTERMEDIATE_LANGUAGE_H_ |
| OLD | NEW |