| 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/cctest/cctest.h" | 5 #include "test/cctest/cctest.h" |
| 6 | 6 |
| 7 #include "src/base/utils/random-number-generator.h" | 7 #include "src/base/utils/random-number-generator.h" |
| 8 #include "src/compiler/graph-inl.h" | 8 #include "src/compiler/graph-inl.h" |
| 9 #include "src/compiler/js-graph.h" | 9 #include "src/compiler/js-graph.h" |
| 10 #include "src/compiler/machine-operator-reducer.h" | 10 #include "src/compiler/machine-operator-reducer.h" |
| (...skipping 669 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 680 | 680 |
| 681 static void CheckNans(ReducerTester* R) { | 681 static void CheckNans(ReducerTester* R) { |
| 682 Node* x = R->Parameter(); | 682 Node* x = R->Parameter(); |
| 683 std::vector<double> nans = ValueHelper::nan_vector(); | 683 std::vector<double> nans = ValueHelper::nan_vector(); |
| 684 for (std::vector<double>::const_iterator pl = nans.begin(); pl != nans.end(); | 684 for (std::vector<double>::const_iterator pl = nans.begin(); pl != nans.end(); |
| 685 ++pl) { | 685 ++pl) { |
| 686 for (std::vector<double>::const_iterator pr = nans.begin(); | 686 for (std::vector<double>::const_iterator pr = nans.begin(); |
| 687 pr != nans.end(); ++pr) { | 687 pr != nans.end(); ++pr) { |
| 688 Node* nan1 = R->Constant<double>(*pl); | 688 Node* nan1 = R->Constant<double>(*pl); |
| 689 Node* nan2 = R->Constant<double>(*pr); | 689 Node* nan2 = R->Constant<double>(*pr); |
| 690 R->CheckBinop(nan1, x, nan1); // x % NaN => NaN | 690 R->CheckBinop(nan1, x, nan1); // x op NaN => NaN |
| 691 R->CheckBinop(nan1, nan1, x); // NaN % x => NaN | 691 R->CheckBinop(nan1, nan1, x); // NaN op x => NaN |
| 692 R->CheckBinop(nan1, nan2, nan1); // NaN % NaN => NaN | 692 R->CheckBinop(nan1, nan2, nan1); // NaN op NaN => NaN |
| 693 } | 693 } |
| 694 } | 694 } |
| 695 } | 695 } |
| 696 | 696 |
| 697 | 697 |
| 698 TEST(ReduceFloat64Add) { | 698 TEST(ReduceFloat64Add) { |
| 699 ReducerTester R; | 699 ReducerTester R; |
| 700 R.binop = R.machine.Float64Add(); | 700 R.binop = R.machine.Float64Add(); |
| 701 | 701 |
| 702 FOR_FLOAT64_INPUTS(pl) { | 702 FOR_FLOAT64_INPUTS(pl) { |
| 703 FOR_FLOAT64_INPUTS(pr) { | 703 FOR_FLOAT64_INPUTS(pr) { |
| 704 double x = *pl, y = *pr; | 704 double x = *pl, y = *pr; |
| 705 R.CheckFoldBinop<double>(x + y, x, y); | 705 R.CheckFoldBinop<double>(x + y, x, y); |
| 706 } | 706 } |
| 707 } | 707 } |
| 708 | 708 |
| 709 FOR_FLOAT64_INPUTS(i) { R.CheckPutConstantOnRight(*i); } | 709 FOR_FLOAT64_INPUTS(i) { |
| 710 // TODO(titzer): CheckNans(&R); | 710 Double tmp(*i); |
| 711 if (!tmp.IsSpecial() || tmp.IsInfinite()) { |
| 712 // Don't check NaNs as they are reduced more. |
| 713 R.CheckPutConstantOnRight(*i); |
| 714 } |
| 715 } |
| 716 |
| 717 CheckNans(&R); |
| 711 } | 718 } |
| 712 | 719 |
| 713 | 720 |
| 714 TEST(ReduceFloat64Sub) { | 721 TEST(ReduceFloat64Sub) { |
| 715 ReducerTester R; | 722 ReducerTester R; |
| 716 R.binop = R.machine.Float64Sub(); | 723 R.binop = R.machine.Float64Sub(); |
| 717 | 724 |
| 718 FOR_FLOAT64_INPUTS(pl) { | 725 FOR_FLOAT64_INPUTS(pl) { |
| 719 FOR_FLOAT64_INPUTS(pr) { | 726 FOR_FLOAT64_INPUTS(pr) { |
| 720 double x = *pl, y = *pr; | 727 double x = *pl, y = *pr; |
| 721 R.CheckFoldBinop<double>(x - y, x, y); | 728 R.CheckFoldBinop<double>(x - y, x, y); |
| 722 } | 729 } |
| 723 } | 730 } |
| 724 // TODO(titzer): CheckNans(&R); | 731 |
| 732 Node* zero = R.Constant<double>(0.0); |
| 733 Node* x = R.Parameter(); |
| 734 |
| 735 R.CheckBinop(x, x, zero); // x - 0.0 => x |
| 736 |
| 737 CheckNans(&R); |
| 725 } | 738 } |
| 726 | 739 |
| 727 | 740 |
| 728 TEST(ReduceFloat64Mul) { | 741 TEST(ReduceFloat64Mul) { |
| 729 ReducerTester R; | 742 ReducerTester R; |
| 730 R.binop = R.machine.Float64Mul(); | 743 R.binop = R.machine.Float64Mul(); |
| 731 | 744 |
| 732 FOR_FLOAT64_INPUTS(pl) { | 745 FOR_FLOAT64_INPUTS(pl) { |
| 733 FOR_FLOAT64_INPUTS(pr) { | 746 FOR_FLOAT64_INPUTS(pr) { |
| 734 double x = *pl, y = *pr; | 747 double x = *pl, y = *pr; |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 776 ReducerTester R; | 789 ReducerTester R; |
| 777 R.binop = R.machine.Float64Mod(); | 790 R.binop = R.machine.Float64Mod(); |
| 778 | 791 |
| 779 FOR_FLOAT64_INPUTS(pl) { | 792 FOR_FLOAT64_INPUTS(pl) { |
| 780 FOR_FLOAT64_INPUTS(pr) { | 793 FOR_FLOAT64_INPUTS(pr) { |
| 781 double x = *pl, y = *pr; | 794 double x = *pl, y = *pr; |
| 782 R.CheckFoldBinop<double>(modulo(x, y), x, y); | 795 R.CheckFoldBinop<double>(modulo(x, y), x, y); |
| 783 } | 796 } |
| 784 } | 797 } |
| 785 | 798 |
| 799 Node* x = R.Parameter(); |
| 800 Node* zero = R.Constant<double>(0.0); |
| 801 |
| 802 R.CheckFoldBinop<double>(v8::base::OS::nan_value(), x, zero); |
| 803 |
| 786 CheckNans(&R); | 804 CheckNans(&R); |
| 787 } | 805 } |
| 788 | 806 |
| 789 | 807 |
| 790 // TODO(titzer): test MachineOperatorReducer for Word64And | 808 // TODO(titzer): test MachineOperatorReducer for Word64And |
| 791 // TODO(titzer): test MachineOperatorReducer for Word64Or | 809 // TODO(titzer): test MachineOperatorReducer for Word64Or |
| 792 // TODO(titzer): test MachineOperatorReducer for Word64Xor | 810 // TODO(titzer): test MachineOperatorReducer for Word64Xor |
| 793 // TODO(titzer): test MachineOperatorReducer for Word64Shl | 811 // TODO(titzer): test MachineOperatorReducer for Word64Shl |
| 794 // TODO(titzer): test MachineOperatorReducer for Word64Shr | 812 // TODO(titzer): test MachineOperatorReducer for Word64Shr |
| 795 // TODO(titzer): test MachineOperatorReducer for Word64Sar | 813 // TODO(titzer): test MachineOperatorReducer for Word64Sar |
| 796 // TODO(titzer): test MachineOperatorReducer for Word64Equal | 814 // TODO(titzer): test MachineOperatorReducer for Word64Equal |
| 797 // TODO(titzer): test MachineOperatorReducer for Word64Not | 815 // TODO(titzer): test MachineOperatorReducer for Word64Not |
| 798 // TODO(titzer): test MachineOperatorReducer for Int64Add | 816 // TODO(titzer): test MachineOperatorReducer for Int64Add |
| 799 // TODO(titzer): test MachineOperatorReducer for Int64Sub | 817 // TODO(titzer): test MachineOperatorReducer for Int64Sub |
| 800 // TODO(titzer): test MachineOperatorReducer for Int64Mul | 818 // TODO(titzer): test MachineOperatorReducer for Int64Mul |
| 801 // TODO(titzer): test MachineOperatorReducer for Int64UMul | 819 // TODO(titzer): test MachineOperatorReducer for Int64UMul |
| 802 // TODO(titzer): test MachineOperatorReducer for Int64Div | 820 // TODO(titzer): test MachineOperatorReducer for Int64Div |
| 803 // TODO(titzer): test MachineOperatorReducer for Int64UDiv | 821 // TODO(titzer): test MachineOperatorReducer for Int64UDiv |
| 804 // TODO(titzer): test MachineOperatorReducer for Int64Mod | 822 // TODO(titzer): test MachineOperatorReducer for Int64Mod |
| 805 // TODO(titzer): test MachineOperatorReducer for Int64UMod | 823 // TODO(titzer): test MachineOperatorReducer for Int64UMod |
| 806 // TODO(titzer): test MachineOperatorReducer for Int64Neg | 824 // TODO(titzer): test MachineOperatorReducer for Int64Neg |
| 807 // TODO(titzer): test MachineOperatorReducer for ChangeInt32ToFloat64 | 825 // TODO(titzer): test MachineOperatorReducer for ChangeInt32ToFloat64 |
| 808 // TODO(titzer): test MachineOperatorReducer for ChangeFloat64ToInt32 | 826 // TODO(titzer): test MachineOperatorReducer for ChangeFloat64ToInt32 |
| 809 // TODO(titzer): test MachineOperatorReducer for Float64Compare | 827 // TODO(titzer): test MachineOperatorReducer for Float64Compare |
| OLD | NEW |