OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "test/unittests/compiler/node-test-utils.h" | 5 #include "test/unittests/compiler/node-test-utils.h" |
6 | 6 |
7 #include "src/compiler/node-properties-inl.h" | 7 #include "src/compiler/node-properties-inl.h" |
8 #include "src/compiler/simplified-operator.h" | 8 #include "src/compiler/simplified-operator.h" |
9 | 9 |
10 using testing::_; | 10 using testing::_; |
(...skipping 337 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
348 const Matcher<Node*> value3_matcher_; | 348 const Matcher<Node*> value3_matcher_; |
349 const Matcher<Node*> effect_matcher_; | 349 const Matcher<Node*> effect_matcher_; |
350 const Matcher<Node*> control_matcher_; | 350 const Matcher<Node*> control_matcher_; |
351 }; | 351 }; |
352 | 352 |
353 | 353 |
354 class IsLoadFieldMatcher FINAL : public NodeMatcher { | 354 class IsLoadFieldMatcher FINAL : public NodeMatcher { |
355 public: | 355 public: |
356 IsLoadFieldMatcher(const Matcher<FieldAccess>& access_matcher, | 356 IsLoadFieldMatcher(const Matcher<FieldAccess>& access_matcher, |
357 const Matcher<Node*>& base_matcher, | 357 const Matcher<Node*>& base_matcher, |
358 const Matcher<Node*>& effect_matcher) | 358 const Matcher<Node*>& effect_matcher, |
| 359 const Matcher<Node*>& control_matcher) |
359 : NodeMatcher(IrOpcode::kLoadField), | 360 : NodeMatcher(IrOpcode::kLoadField), |
360 access_matcher_(access_matcher), | 361 access_matcher_(access_matcher), |
361 base_matcher_(base_matcher), | 362 base_matcher_(base_matcher), |
362 effect_matcher_(effect_matcher) {} | 363 effect_matcher_(effect_matcher), |
| 364 control_matcher_(control_matcher) {} |
363 | 365 |
364 virtual void DescribeTo(std::ostream* os) const OVERRIDE { | 366 virtual void DescribeTo(std::ostream* os) const OVERRIDE { |
365 NodeMatcher::DescribeTo(os); | 367 NodeMatcher::DescribeTo(os); |
366 *os << " whose access ("; | 368 *os << " whose access ("; |
367 access_matcher_.DescribeTo(os); | 369 access_matcher_.DescribeTo(os); |
368 *os << "), base ("; | 370 *os << "), base ("; |
369 base_matcher_.DescribeTo(os); | 371 base_matcher_.DescribeTo(os); |
370 *os << ") and effect ("; | 372 *os << "), effect ("; |
371 effect_matcher_.DescribeTo(os); | 373 effect_matcher_.DescribeTo(os); |
| 374 *os << ") and control ("; |
| 375 control_matcher_.DescribeTo(os); |
372 *os << ")"; | 376 *os << ")"; |
373 } | 377 } |
374 | 378 |
375 virtual bool MatchAndExplain(Node* node, | 379 virtual bool MatchAndExplain(Node* node, |
376 MatchResultListener* listener) const OVERRIDE { | 380 MatchResultListener* listener) const OVERRIDE { |
377 return (NodeMatcher::MatchAndExplain(node, listener) && | 381 return (NodeMatcher::MatchAndExplain(node, listener) && |
378 PrintMatchAndExplain(OpParameter<FieldAccess>(node), "access", | 382 PrintMatchAndExplain(OpParameter<FieldAccess>(node), "access", |
379 access_matcher_, listener) && | 383 access_matcher_, listener) && |
380 PrintMatchAndExplain(NodeProperties::GetValueInput(node, 0), "base", | 384 PrintMatchAndExplain(NodeProperties::GetValueInput(node, 0), "base", |
381 base_matcher_, listener) && | 385 base_matcher_, listener) && |
382 PrintMatchAndExplain(NodeProperties::GetEffectInput(node), "effect", | 386 PrintMatchAndExplain(NodeProperties::GetEffectInput(node), "effect", |
383 effect_matcher_, listener)); | 387 effect_matcher_, listener) && |
| 388 PrintMatchAndExplain(NodeProperties::GetControlInput(node), |
| 389 "control", control_matcher_, listener)); |
384 } | 390 } |
385 | 391 |
386 private: | 392 private: |
387 const Matcher<FieldAccess> access_matcher_; | 393 const Matcher<FieldAccess> access_matcher_; |
388 const Matcher<Node*> base_matcher_; | 394 const Matcher<Node*> base_matcher_; |
389 const Matcher<Node*> effect_matcher_; | 395 const Matcher<Node*> effect_matcher_; |
| 396 const Matcher<Node*> control_matcher_; |
390 }; | 397 }; |
391 | 398 |
392 | 399 |
393 class IsLoadElementMatcher FINAL : public NodeMatcher { | 400 class IsLoadElementMatcher FINAL : public NodeMatcher { |
394 public: | 401 public: |
395 IsLoadElementMatcher(const Matcher<ElementAccess>& access_matcher, | 402 IsLoadElementMatcher(const Matcher<ElementAccess>& access_matcher, |
396 const Matcher<Node*>& base_matcher, | 403 const Matcher<Node*>& base_matcher, |
397 const Matcher<Node*>& index_matcher, | 404 const Matcher<Node*>& index_matcher, |
398 const Matcher<Node*>& length_matcher, | 405 const Matcher<Node*>& length_matcher, |
399 const Matcher<Node*>& effect_matcher, | 406 const Matcher<Node*>& effect_matcher, |
(...skipping 388 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
788 const Matcher<Node*>& effect_matcher, | 795 const Matcher<Node*>& effect_matcher, |
789 const Matcher<Node*>& control_matcher) { | 796 const Matcher<Node*>& control_matcher) { |
790 return MakeMatcher(new IsCallMatcher( | 797 return MakeMatcher(new IsCallMatcher( |
791 descriptor_matcher, value0_matcher, value1_matcher, value2_matcher, | 798 descriptor_matcher, value0_matcher, value1_matcher, value2_matcher, |
792 value3_matcher, effect_matcher, control_matcher)); | 799 value3_matcher, effect_matcher, control_matcher)); |
793 } | 800 } |
794 | 801 |
795 | 802 |
796 Matcher<Node*> IsLoadField(const Matcher<FieldAccess>& access_matcher, | 803 Matcher<Node*> IsLoadField(const Matcher<FieldAccess>& access_matcher, |
797 const Matcher<Node*>& base_matcher, | 804 const Matcher<Node*>& base_matcher, |
798 const Matcher<Node*>& effect_matcher) { | 805 const Matcher<Node*>& effect_matcher, |
799 return MakeMatcher( | 806 const Matcher<Node*>& control_matcher) { |
800 new IsLoadFieldMatcher(access_matcher, base_matcher, effect_matcher)); | 807 return MakeMatcher(new IsLoadFieldMatcher(access_matcher, base_matcher, |
| 808 effect_matcher, control_matcher)); |
801 } | 809 } |
802 | 810 |
803 | 811 |
804 Matcher<Node*> IsLoadElement(const Matcher<ElementAccess>& access_matcher, | 812 Matcher<Node*> IsLoadElement(const Matcher<ElementAccess>& access_matcher, |
805 const Matcher<Node*>& base_matcher, | 813 const Matcher<Node*>& base_matcher, |
806 const Matcher<Node*>& index_matcher, | 814 const Matcher<Node*>& index_matcher, |
807 const Matcher<Node*>& length_matcher, | 815 const Matcher<Node*>& length_matcher, |
808 const Matcher<Node*>& effect_matcher, | 816 const Matcher<Node*>& effect_matcher, |
809 const Matcher<Node*>& control_matcher) { | 817 const Matcher<Node*>& control_matcher) { |
810 return MakeMatcher(new IsLoadElementMatcher(access_matcher, base_matcher, | 818 return MakeMatcher(new IsLoadElementMatcher(access_matcher, base_matcher, |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
847 effect_matcher, control_matcher)); | 855 effect_matcher, control_matcher)); |
848 } | 856 } |
849 | 857 |
850 | 858 |
851 #define IS_BINOP_MATCHER(Name) \ | 859 #define IS_BINOP_MATCHER(Name) \ |
852 Matcher<Node*> Is##Name(const Matcher<Node*>& lhs_matcher, \ | 860 Matcher<Node*> Is##Name(const Matcher<Node*>& lhs_matcher, \ |
853 const Matcher<Node*>& rhs_matcher) { \ | 861 const Matcher<Node*>& rhs_matcher) { \ |
854 return MakeMatcher( \ | 862 return MakeMatcher( \ |
855 new IsBinopMatcher(IrOpcode::k##Name, lhs_matcher, rhs_matcher)); \ | 863 new IsBinopMatcher(IrOpcode::k##Name, lhs_matcher, rhs_matcher)); \ |
856 } | 864 } |
| 865 IS_BINOP_MATCHER(NumberEqual) |
857 IS_BINOP_MATCHER(NumberLessThan) | 866 IS_BINOP_MATCHER(NumberLessThan) |
858 IS_BINOP_MATCHER(NumberSubtract) | 867 IS_BINOP_MATCHER(NumberSubtract) |
859 IS_BINOP_MATCHER(Word32And) | 868 IS_BINOP_MATCHER(Word32And) |
860 IS_BINOP_MATCHER(Word32Sar) | 869 IS_BINOP_MATCHER(Word32Sar) |
861 IS_BINOP_MATCHER(Word32Shl) | 870 IS_BINOP_MATCHER(Word32Shl) |
862 IS_BINOP_MATCHER(Word32Shr) | 871 IS_BINOP_MATCHER(Word32Shr) |
863 IS_BINOP_MATCHER(Word32Ror) | 872 IS_BINOP_MATCHER(Word32Ror) |
864 IS_BINOP_MATCHER(Word32Equal) | 873 IS_BINOP_MATCHER(Word32Equal) |
865 IS_BINOP_MATCHER(Word64And) | 874 IS_BINOP_MATCHER(Word64And) |
866 IS_BINOP_MATCHER(Word64Sar) | 875 IS_BINOP_MATCHER(Word64Sar) |
867 IS_BINOP_MATCHER(Word64Shl) | 876 IS_BINOP_MATCHER(Word64Shl) |
868 IS_BINOP_MATCHER(Word64Equal) | 877 IS_BINOP_MATCHER(Word64Equal) |
869 IS_BINOP_MATCHER(Int32AddWithOverflow) | 878 IS_BINOP_MATCHER(Int32AddWithOverflow) |
870 IS_BINOP_MATCHER(Int32Add) | 879 IS_BINOP_MATCHER(Int32Add) |
871 IS_BINOP_MATCHER(Int32Sub) | 880 IS_BINOP_MATCHER(Int32Sub) |
872 IS_BINOP_MATCHER(Int32Mul) | 881 IS_BINOP_MATCHER(Int32Mul) |
873 IS_BINOP_MATCHER(Int32MulHigh) | 882 IS_BINOP_MATCHER(Int32MulHigh) |
874 IS_BINOP_MATCHER(Int32LessThan) | 883 IS_BINOP_MATCHER(Int32LessThan) |
875 IS_BINOP_MATCHER(Uint32LessThan) | 884 IS_BINOP_MATCHER(Uint32LessThan) |
876 IS_BINOP_MATCHER(Uint32LessThanOrEqual) | 885 IS_BINOP_MATCHER(Uint32LessThanOrEqual) |
877 #undef IS_BINOP_MATCHER | 886 #undef IS_BINOP_MATCHER |
878 | 887 |
879 | 888 |
880 #define IS_UNOP_MATCHER(Name) \ | 889 #define IS_UNOP_MATCHER(Name) \ |
881 Matcher<Node*> Is##Name(const Matcher<Node*>& input_matcher) { \ | 890 Matcher<Node*> Is##Name(const Matcher<Node*>& input_matcher) { \ |
882 return MakeMatcher(new IsUnopMatcher(IrOpcode::k##Name, input_matcher)); \ | 891 return MakeMatcher(new IsUnopMatcher(IrOpcode::k##Name, input_matcher)); \ |
883 } | 892 } |
| 893 IS_UNOP_MATCHER(BooleanNot) |
884 IS_UNOP_MATCHER(ChangeFloat64ToInt32) | 894 IS_UNOP_MATCHER(ChangeFloat64ToInt32) |
885 IS_UNOP_MATCHER(ChangeFloat64ToUint32) | 895 IS_UNOP_MATCHER(ChangeFloat64ToUint32) |
886 IS_UNOP_MATCHER(ChangeInt32ToFloat64) | 896 IS_UNOP_MATCHER(ChangeInt32ToFloat64) |
887 IS_UNOP_MATCHER(ChangeInt32ToInt64) | 897 IS_UNOP_MATCHER(ChangeInt32ToInt64) |
888 IS_UNOP_MATCHER(ChangeUint32ToFloat64) | 898 IS_UNOP_MATCHER(ChangeUint32ToFloat64) |
889 IS_UNOP_MATCHER(ChangeUint32ToUint64) | 899 IS_UNOP_MATCHER(ChangeUint32ToUint64) |
890 IS_UNOP_MATCHER(TruncateFloat64ToFloat32) | 900 IS_UNOP_MATCHER(TruncateFloat64ToFloat32) |
891 IS_UNOP_MATCHER(TruncateFloat64ToInt32) | 901 IS_UNOP_MATCHER(TruncateFloat64ToInt32) |
892 IS_UNOP_MATCHER(TruncateInt64ToInt32) | 902 IS_UNOP_MATCHER(TruncateInt64ToInt32) |
893 IS_UNOP_MATCHER(Float64Sqrt) | 903 IS_UNOP_MATCHER(Float64Sqrt) |
894 #undef IS_UNOP_MATCHER | 904 #undef IS_UNOP_MATCHER |
895 | 905 |
896 } // namespace compiler | 906 } // namespace compiler |
897 } // namespace internal | 907 } // namespace internal |
898 } // namespace v8 | 908 } // namespace v8 |
OLD | NEW |