OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. Use of this | 1 // Copyright 2014 the V8 project authors. All rights reserved. Use of this |
2 // source code is governed by a BSD-style license that can be found in the | 2 // source code is governed by a BSD-style license that can be found in the |
3 // LICENSE file. | 3 // LICENSE file. |
4 | 4 |
5 #include <cmath> | 5 #include <cmath> |
6 #include <functional> | 6 #include <functional> |
7 #include <limits> | 7 #include <limits> |
8 | 8 |
9 #include "src/base/bits.h" | 9 #include "src/base/bits.h" |
10 #include "src/base/utils/random-number-generator.h" | 10 #include "src/base/utils/random-number-generator.h" |
(...skipping 1179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1190 Node* load = m.Load(MachineType::Float32(), m.PointerConstant(from), | 1190 Node* load = m.Load(MachineType::Float32(), m.PointerConstant(from), |
1191 m.IntPtrConstant(offset)); | 1191 m.IntPtrConstant(offset)); |
1192 m.Store(MachineRepresentation::kFloat32, m.PointerConstant(to), | 1192 m.Store(MachineRepresentation::kFloat32, m.PointerConstant(to), |
1193 m.IntPtrConstant(offset), load, kNoWriteBarrier); | 1193 m.IntPtrConstant(offset), load, kNoWriteBarrier); |
1194 m.Return(m.Int32Constant(magic)); | 1194 m.Return(m.Int32Constant(magic)); |
1195 | 1195 |
1196 FOR_FLOAT32_INPUTS(j) { | 1196 FOR_FLOAT32_INPUTS(j) { |
1197 p1 = *j; | 1197 p1 = *j; |
1198 p2 = *j - 5; | 1198 p2 = *j - 5; |
1199 CHECK_EQ(magic, m.Call()); | 1199 CHECK_EQ(magic, m.Call()); |
1200 CheckDoubleEq(p1, p2); | 1200 CHECK_DOUBLE_EQ(p1, p2); |
1201 } | 1201 } |
1202 } | 1202 } |
1203 } | 1203 } |
1204 | 1204 |
1205 | 1205 |
1206 TEST(RunLoadStoreFloat64Offset) { | 1206 TEST(RunLoadStoreFloat64Offset) { |
1207 double p1 = 0; // loads directly from this location. | 1207 double p1 = 0; // loads directly from this location. |
1208 double p2 = 0; // and stores directly into this location. | 1208 double p2 = 0; // and stores directly into this location. |
1209 | 1209 |
1210 FOR_INT32_INPUTS(i) { | 1210 FOR_INT32_INPUTS(i) { |
1211 int32_t magic = 0x2342aabb + *i * 3; | 1211 int32_t magic = 0x2342aabb + *i * 3; |
1212 RawMachineAssemblerTester<int32_t> m; | 1212 RawMachineAssemblerTester<int32_t> m; |
1213 int32_t offset = *i; | 1213 int32_t offset = *i; |
1214 byte* from = reinterpret_cast<byte*>(&p1) - offset; | 1214 byte* from = reinterpret_cast<byte*>(&p1) - offset; |
1215 byte* to = reinterpret_cast<byte*>(&p2) - offset; | 1215 byte* to = reinterpret_cast<byte*>(&p2) - offset; |
1216 // generate load [#base + #index] | 1216 // generate load [#base + #index] |
1217 Node* load = m.Load(MachineType::Float64(), m.PointerConstant(from), | 1217 Node* load = m.Load(MachineType::Float64(), m.PointerConstant(from), |
1218 m.IntPtrConstant(offset)); | 1218 m.IntPtrConstant(offset)); |
1219 m.Store(MachineRepresentation::kFloat64, m.PointerConstant(to), | 1219 m.Store(MachineRepresentation::kFloat64, m.PointerConstant(to), |
1220 m.IntPtrConstant(offset), load, kNoWriteBarrier); | 1220 m.IntPtrConstant(offset), load, kNoWriteBarrier); |
1221 m.Return(m.Int32Constant(magic)); | 1221 m.Return(m.Int32Constant(magic)); |
1222 | 1222 |
1223 FOR_FLOAT64_INPUTS(j) { | 1223 FOR_FLOAT64_INPUTS(j) { |
1224 p1 = *j; | 1224 p1 = *j; |
1225 p2 = *j - 5; | 1225 p2 = *j - 5; |
1226 CHECK_EQ(magic, m.Call()); | 1226 CHECK_EQ(magic, m.Call()); |
1227 CheckDoubleEq(p1, p2); | 1227 CHECK_DOUBLE_EQ(p1, p2); |
1228 } | 1228 } |
1229 } | 1229 } |
1230 } | 1230 } |
1231 | 1231 |
1232 | 1232 |
1233 TEST(RunInt32AddP) { | 1233 TEST(RunInt32AddP) { |
1234 RawMachineAssemblerTester<int32_t> m; | 1234 RawMachineAssemblerTester<int32_t> m; |
1235 Int32BinopTester bt(&m); | 1235 Int32BinopTester bt(&m); |
1236 | 1236 |
1237 bt.AddReturn(m.Int32Add(bt.param0, bt.param1)); | 1237 bt.AddReturn(m.Int32Add(bt.param0, bt.param1)); |
(...skipping 2413 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3651 RunLoadStore<double>(MachineType::Float64()); | 3651 RunLoadStore<double>(MachineType::Float64()); |
3652 } | 3652 } |
3653 | 3653 |
3654 | 3654 |
3655 TEST(RunFloat32Add) { | 3655 TEST(RunFloat32Add) { |
3656 BufferedRawMachineAssemblerTester<float> m(MachineType::Float32(), | 3656 BufferedRawMachineAssemblerTester<float> m(MachineType::Float32(), |
3657 MachineType::Float32()); | 3657 MachineType::Float32()); |
3658 m.Return(m.Float32Add(m.Parameter(0), m.Parameter(1))); | 3658 m.Return(m.Float32Add(m.Parameter(0), m.Parameter(1))); |
3659 | 3659 |
3660 FOR_FLOAT32_INPUTS(i) { | 3660 FOR_FLOAT32_INPUTS(i) { |
3661 FOR_FLOAT32_INPUTS(j) { | 3661 FOR_FLOAT32_INPUTS(j) { CHECK_FLOAT_EQ(*i + *j, m.Call(*i, *j)); } |
3662 volatile float expected = *i + *j; | |
3663 CheckFloatEq(expected, m.Call(*i, *j)); | |
3664 } | |
3665 } | 3662 } |
3666 } | 3663 } |
3667 | 3664 |
3668 | 3665 |
3669 TEST(RunFloat32Sub) { | 3666 TEST(RunFloat32Sub) { |
3670 BufferedRawMachineAssemblerTester<float> m(MachineType::Float32(), | 3667 BufferedRawMachineAssemblerTester<float> m(MachineType::Float32(), |
3671 MachineType::Float32()); | 3668 MachineType::Float32()); |
3672 m.Return(m.Float32Sub(m.Parameter(0), m.Parameter(1))); | 3669 m.Return(m.Float32Sub(m.Parameter(0), m.Parameter(1))); |
3673 | 3670 |
3674 FOR_FLOAT32_INPUTS(i) { | 3671 FOR_FLOAT32_INPUTS(i) { |
3675 FOR_FLOAT32_INPUTS(j) { | 3672 FOR_FLOAT32_INPUTS(j) { CHECK_FLOAT_EQ(*i - *j, m.Call(*i, *j)); } |
3676 volatile float expected = *i - *j; | |
3677 CheckFloatEq(expected, m.Call(*i, *j)); | |
3678 } | |
3679 } | 3673 } |
3680 } | 3674 } |
3681 | 3675 |
3682 | 3676 |
3683 TEST(RunFloat32Mul) { | 3677 TEST(RunFloat32Mul) { |
3684 BufferedRawMachineAssemblerTester<float> m(MachineType::Float32(), | 3678 BufferedRawMachineAssemblerTester<float> m(MachineType::Float32(), |
3685 MachineType::Float32()); | 3679 MachineType::Float32()); |
3686 m.Return(m.Float32Mul(m.Parameter(0), m.Parameter(1))); | 3680 m.Return(m.Float32Mul(m.Parameter(0), m.Parameter(1))); |
3687 | 3681 |
3688 FOR_FLOAT32_INPUTS(i) { | 3682 FOR_FLOAT32_INPUTS(i) { |
3689 FOR_FLOAT32_INPUTS(j) { | 3683 FOR_FLOAT32_INPUTS(j) { CHECK_FLOAT_EQ(*i * *j, m.Call(*i, *j)); } |
3690 volatile float expected = *i * *j; | |
3691 CheckFloatEq(expected, m.Call(*i, *j)); | |
3692 } | |
3693 } | 3684 } |
3694 } | 3685 } |
3695 | 3686 |
3696 | 3687 |
3697 TEST(RunFloat32Div) { | 3688 TEST(RunFloat32Div) { |
3698 BufferedRawMachineAssemblerTester<float> m(MachineType::Float32(), | 3689 BufferedRawMachineAssemblerTester<float> m(MachineType::Float32(), |
3699 MachineType::Float32()); | 3690 MachineType::Float32()); |
3700 m.Return(m.Float32Div(m.Parameter(0), m.Parameter(1))); | 3691 m.Return(m.Float32Div(m.Parameter(0), m.Parameter(1))); |
3701 | 3692 |
3702 FOR_FLOAT32_INPUTS(i) { | 3693 FOR_FLOAT32_INPUTS(i) { |
3703 FOR_FLOAT32_INPUTS(j) { | 3694 FOR_FLOAT32_INPUTS(j) { CHECK_FLOAT_EQ(*i / *j, m.Call(*i, *j)); } |
3704 volatile float expected = *i / *j; | |
3705 CheckFloatEq(expected, m.Call(*i, *j)); | |
3706 } | |
3707 } | 3695 } |
3708 } | 3696 } |
3709 | 3697 |
3710 | 3698 |
3711 TEST(RunFloat64Add) { | 3699 TEST(RunFloat64Add) { |
3712 BufferedRawMachineAssemblerTester<double> m(MachineType::Float64(), | 3700 BufferedRawMachineAssemblerTester<double> m(MachineType::Float64(), |
3713 MachineType::Float64()); | 3701 MachineType::Float64()); |
3714 m.Return(m.Float64Add(m.Parameter(0), m.Parameter(1))); | 3702 m.Return(m.Float64Add(m.Parameter(0), m.Parameter(1))); |
3715 | 3703 |
3716 FOR_FLOAT64_INPUTS(i) { | 3704 FOR_FLOAT64_INPUTS(i) { |
3717 FOR_FLOAT64_INPUTS(j) { | 3705 FOR_FLOAT64_INPUTS(j) { CHECK_DOUBLE_EQ(*i + *j, m.Call(*i, *j)); } |
3718 volatile double expected = *i + *j; | |
3719 CheckDoubleEq(expected, m.Call(*i, *j)); | |
3720 } | |
3721 } | 3706 } |
3722 } | 3707 } |
3723 | 3708 |
3724 | 3709 |
3725 TEST(RunFloat64Sub) { | 3710 TEST(RunFloat64Sub) { |
3726 BufferedRawMachineAssemblerTester<double> m(MachineType::Float64(), | 3711 BufferedRawMachineAssemblerTester<double> m(MachineType::Float64(), |
3727 MachineType::Float64()); | 3712 MachineType::Float64()); |
3728 m.Return(m.Float64Sub(m.Parameter(0), m.Parameter(1))); | 3713 m.Return(m.Float64Sub(m.Parameter(0), m.Parameter(1))); |
3729 | 3714 |
3730 FOR_FLOAT64_INPUTS(i) { | 3715 FOR_FLOAT64_INPUTS(i) { |
3731 FOR_FLOAT64_INPUTS(j) { | 3716 FOR_FLOAT64_INPUTS(j) { CHECK_DOUBLE_EQ(*i - *j, m.Call(*i, *j)); } |
3732 volatile double expected = *i - *j; | |
3733 CheckDoubleEq(expected, m.Call(*i, *j)); | |
3734 } | |
3735 } | 3717 } |
3736 } | 3718 } |
3737 | 3719 |
3738 | 3720 |
3739 TEST(RunFloat64Mul) { | 3721 TEST(RunFloat64Mul) { |
3740 BufferedRawMachineAssemblerTester<double> m(MachineType::Float64(), | 3722 BufferedRawMachineAssemblerTester<double> m(MachineType::Float64(), |
3741 MachineType::Float64()); | 3723 MachineType::Float64()); |
3742 m.Return(m.Float64Mul(m.Parameter(0), m.Parameter(1))); | 3724 m.Return(m.Float64Mul(m.Parameter(0), m.Parameter(1))); |
3743 | 3725 |
3744 FOR_FLOAT64_INPUTS(i) { | 3726 FOR_FLOAT64_INPUTS(i) { |
3745 FOR_FLOAT64_INPUTS(j) { | 3727 FOR_FLOAT64_INPUTS(j) { CHECK_DOUBLE_EQ(*i * *j, m.Call(*i, *j)); } |
3746 volatile double expected = *i * *j; | |
3747 CheckDoubleEq(expected, m.Call(*i, *j)); | |
3748 } | |
3749 } | 3728 } |
3750 } | 3729 } |
3751 | 3730 |
3752 | 3731 |
3753 TEST(RunFloat64Div) { | 3732 TEST(RunFloat64Div) { |
3754 BufferedRawMachineAssemblerTester<double> m(MachineType::Float64(), | 3733 BufferedRawMachineAssemblerTester<double> m(MachineType::Float64(), |
3755 MachineType::Float64()); | 3734 MachineType::Float64()); |
3756 m.Return(m.Float64Div(m.Parameter(0), m.Parameter(1))); | 3735 m.Return(m.Float64Div(m.Parameter(0), m.Parameter(1))); |
3757 | 3736 |
3758 FOR_FLOAT64_INPUTS(i) { | 3737 FOR_FLOAT64_INPUTS(i) { |
3759 FOR_FLOAT64_INPUTS(j) { | 3738 FOR_FLOAT64_INPUTS(j) { CHECK_DOUBLE_EQ(*i / *j, m.Call(*i, *j)); } |
3760 volatile double expected = *i / *j; | |
3761 CheckDoubleEq(expected, m.Call(*i, *j)); | |
3762 } | |
3763 } | 3739 } |
3764 } | 3740 } |
3765 | 3741 |
3766 | 3742 |
3767 TEST(RunFloat64Mod) { | 3743 TEST(RunFloat64Mod) { |
3768 BufferedRawMachineAssemblerTester<double> m(MachineType::Float64(), | 3744 BufferedRawMachineAssemblerTester<double> m(MachineType::Float64(), |
3769 MachineType::Float64()); | 3745 MachineType::Float64()); |
3770 m.Return(m.Float64Mod(m.Parameter(0), m.Parameter(1))); | 3746 m.Return(m.Float64Mod(m.Parameter(0), m.Parameter(1))); |
3771 | 3747 |
3772 FOR_FLOAT64_INPUTS(i) { | 3748 FOR_FLOAT64_INPUTS(i) { |
3773 FOR_FLOAT64_INPUTS(j) { CheckDoubleEq(modulo(*i, *j), m.Call(*i, *j)); } | 3749 FOR_FLOAT64_INPUTS(j) { CHECK_DOUBLE_EQ(modulo(*i, *j), m.Call(*i, *j)); } |
3774 } | 3750 } |
3775 } | 3751 } |
3776 | 3752 |
3777 | 3753 |
3778 TEST(RunDeadFloat32Binops) { | 3754 TEST(RunDeadFloat32Binops) { |
3779 RawMachineAssemblerTester<int32_t> m; | 3755 RawMachineAssemblerTester<int32_t> m; |
3780 | 3756 |
3781 const Operator* ops[] = {m.machine()->Float32Add(), m.machine()->Float32Sub(), | 3757 const Operator* ops[] = {m.machine()->Float32Add(), m.machine()->Float32Sub(), |
3782 m.machine()->Float32Mul(), m.machine()->Float32Div(), | 3758 m.machine()->Float32Mul(), m.machine()->Float32Div(), |
3783 NULL}; | 3759 NULL}; |
(...skipping 25 matching lines...) Expand all Loading... |
3809 } | 3785 } |
3810 | 3786 |
3811 | 3787 |
3812 TEST(RunFloat32AddP) { | 3788 TEST(RunFloat32AddP) { |
3813 RawMachineAssemblerTester<int32_t> m; | 3789 RawMachineAssemblerTester<int32_t> m; |
3814 Float32BinopTester bt(&m); | 3790 Float32BinopTester bt(&m); |
3815 | 3791 |
3816 bt.AddReturn(m.Float32Add(bt.param0, bt.param1)); | 3792 bt.AddReturn(m.Float32Add(bt.param0, bt.param1)); |
3817 | 3793 |
3818 FOR_FLOAT32_INPUTS(pl) { | 3794 FOR_FLOAT32_INPUTS(pl) { |
3819 FOR_FLOAT32_INPUTS(pr) { | 3795 FOR_FLOAT32_INPUTS(pr) { CHECK_FLOAT_EQ(*pl + *pr, bt.call(*pl, *pr)); } |
3820 float expected = *pl + *pr; | |
3821 CheckFloatEq(expected, bt.call(*pl, *pr)); | |
3822 } | |
3823 } | 3796 } |
3824 } | 3797 } |
3825 | 3798 |
3826 | 3799 |
3827 TEST(RunFloat64AddP) { | 3800 TEST(RunFloat64AddP) { |
3828 RawMachineAssemblerTester<int32_t> m; | 3801 RawMachineAssemblerTester<int32_t> m; |
3829 Float64BinopTester bt(&m); | 3802 Float64BinopTester bt(&m); |
3830 | 3803 |
3831 bt.AddReturn(m.Float64Add(bt.param0, bt.param1)); | 3804 bt.AddReturn(m.Float64Add(bt.param0, bt.param1)); |
3832 | 3805 |
3833 FOR_FLOAT64_INPUTS(pl) { | 3806 FOR_FLOAT64_INPUTS(pl) { |
3834 FOR_FLOAT64_INPUTS(pr) { | 3807 FOR_FLOAT64_INPUTS(pr) { CHECK_DOUBLE_EQ(*pl + *pr, bt.call(*pl, *pr)); } |
3835 double expected = *pl + *pr; | |
3836 CheckDoubleEq(expected, bt.call(*pl, *pr)); | |
3837 } | |
3838 } | 3808 } |
3839 } | 3809 } |
3840 | 3810 |
3841 | 3811 |
3842 TEST(RunFloa32MaxP) { | 3812 TEST(RunFloa32MaxP) { |
3843 RawMachineAssemblerTester<int32_t> m; | 3813 RawMachineAssemblerTester<int32_t> m; |
3844 Float32BinopTester bt(&m); | 3814 Float32BinopTester bt(&m); |
3845 if (!m.machine()->Float32Max().IsSupported()) return; | 3815 if (!m.machine()->Float32Max().IsSupported()) return; |
3846 | 3816 |
3847 bt.AddReturn(m.Float32Max(bt.param0, bt.param1)); | 3817 bt.AddReturn(m.Float32Max(bt.param0, bt.param1)); |
3848 | 3818 |
3849 FOR_FLOAT32_INPUTS(pl) { | 3819 FOR_FLOAT32_INPUTS(pl) { |
3850 FOR_FLOAT32_INPUTS(pr) { | 3820 FOR_FLOAT32_INPUTS(pr) { |
3851 double expected = *pl > *pr ? *pl : *pr; | 3821 CHECK_DOUBLE_EQ(*pl > *pr ? *pl : *pr, bt.call(*pl, *pr)); |
3852 CheckDoubleEq(expected, bt.call(*pl, *pr)); | |
3853 } | 3822 } |
3854 } | 3823 } |
3855 } | 3824 } |
3856 | 3825 |
3857 | 3826 |
3858 TEST(RunFloat64MaxP) { | 3827 TEST(RunFloat64MaxP) { |
3859 RawMachineAssemblerTester<int32_t> m; | 3828 RawMachineAssemblerTester<int32_t> m; |
3860 Float64BinopTester bt(&m); | 3829 Float64BinopTester bt(&m); |
3861 if (!m.machine()->Float64Max().IsSupported()) return; | 3830 if (!m.machine()->Float64Max().IsSupported()) return; |
3862 | 3831 |
3863 bt.AddReturn(m.Float64Max(bt.param0, bt.param1)); | 3832 bt.AddReturn(m.Float64Max(bt.param0, bt.param1)); |
3864 | 3833 |
3865 FOR_FLOAT64_INPUTS(pl) { | 3834 FOR_FLOAT64_INPUTS(pl) { |
3866 FOR_FLOAT64_INPUTS(pr) { | 3835 FOR_FLOAT64_INPUTS(pr) { |
3867 double expected = *pl > *pr ? *pl : *pr; | 3836 CHECK_DOUBLE_EQ(*pl > *pr ? *pl : *pr, bt.call(*pl, *pr)); |
3868 CheckDoubleEq(expected, bt.call(*pl, *pr)); | |
3869 } | 3837 } |
3870 } | 3838 } |
3871 } | 3839 } |
3872 | 3840 |
3873 | 3841 |
3874 TEST(RunFloat32MinP) { | 3842 TEST(RunFloat32MinP) { |
3875 RawMachineAssemblerTester<int32_t> m; | 3843 RawMachineAssemblerTester<int32_t> m; |
3876 Float32BinopTester bt(&m); | 3844 Float32BinopTester bt(&m); |
3877 if (!m.machine()->Float32Min().IsSupported()) return; | 3845 if (!m.machine()->Float32Min().IsSupported()) return; |
3878 | 3846 |
3879 bt.AddReturn(m.Float32Min(bt.param0, bt.param1)); | 3847 bt.AddReturn(m.Float32Min(bt.param0, bt.param1)); |
3880 | 3848 |
3881 FOR_FLOAT32_INPUTS(pl) { | 3849 FOR_FLOAT32_INPUTS(pl) { |
3882 FOR_FLOAT32_INPUTS(pr) { | 3850 FOR_FLOAT32_INPUTS(pr) { |
3883 double expected = *pl < *pr ? *pl : *pr; | 3851 CHECK_DOUBLE_EQ(*pl < *pr ? *pl : *pr, bt.call(*pl, *pr)); |
3884 CheckDoubleEq(expected, bt.call(*pl, *pr)); | |
3885 } | 3852 } |
3886 } | 3853 } |
3887 } | 3854 } |
3888 | 3855 |
3889 | 3856 |
3890 TEST(RunFloat64MinP) { | 3857 TEST(RunFloat64MinP) { |
3891 RawMachineAssemblerTester<int32_t> m; | 3858 RawMachineAssemblerTester<int32_t> m; |
3892 Float64BinopTester bt(&m); | 3859 Float64BinopTester bt(&m); |
3893 if (!m.machine()->Float64Min().IsSupported()) return; | 3860 if (!m.machine()->Float64Min().IsSupported()) return; |
3894 | 3861 |
3895 bt.AddReturn(m.Float64Min(bt.param0, bt.param1)); | 3862 bt.AddReturn(m.Float64Min(bt.param0, bt.param1)); |
3896 | 3863 |
3897 FOR_FLOAT64_INPUTS(pl) { | 3864 FOR_FLOAT64_INPUTS(pl) { |
3898 FOR_FLOAT64_INPUTS(pr) { | 3865 FOR_FLOAT64_INPUTS(pr) { |
3899 double expected = *pl < *pr ? *pl : *pr; | 3866 CHECK_DOUBLE_EQ(*pl < *pr ? *pl : *pr, bt.call(*pl, *pr)); |
3900 CheckDoubleEq(expected, bt.call(*pl, *pr)); | |
3901 } | 3867 } |
3902 } | 3868 } |
3903 } | 3869 } |
3904 | 3870 |
3905 | 3871 |
3906 TEST(RunFloat32SubP) { | 3872 TEST(RunFloat32SubP) { |
3907 RawMachineAssemblerTester<int32_t> m; | 3873 RawMachineAssemblerTester<int32_t> m; |
3908 Float32BinopTester bt(&m); | 3874 Float32BinopTester bt(&m); |
3909 | 3875 |
3910 bt.AddReturn(m.Float32Sub(bt.param0, bt.param1)); | 3876 bt.AddReturn(m.Float32Sub(bt.param0, bt.param1)); |
3911 | 3877 |
3912 FOR_FLOAT32_INPUTS(pl) { | 3878 FOR_FLOAT32_INPUTS(pl) { |
3913 FOR_FLOAT32_INPUTS(pr) { | 3879 FOR_FLOAT32_INPUTS(pr) { CHECK_FLOAT_EQ(*pl - *pr, bt.call(*pl, *pr)); } |
3914 float expected = *pl - *pr; | |
3915 CheckFloatEq(expected, bt.call(*pl, *pr)); | |
3916 } | |
3917 } | 3880 } |
3918 } | 3881 } |
3919 | 3882 |
3920 | 3883 |
3921 TEST(RunFloat32SubImm1) { | 3884 TEST(RunFloat32SubImm1) { |
3922 FOR_FLOAT32_INPUTS(i) { | 3885 FOR_FLOAT32_INPUTS(i) { |
3923 BufferedRawMachineAssemblerTester<float> m(MachineType::Float32()); | 3886 BufferedRawMachineAssemblerTester<float> m(MachineType::Float32()); |
3924 m.Return(m.Float32Sub(m.Float32Constant(*i), m.Parameter(0))); | 3887 m.Return(m.Float32Sub(m.Float32Constant(*i), m.Parameter(0))); |
3925 | 3888 |
3926 FOR_FLOAT32_INPUTS(j) { | 3889 FOR_FLOAT32_INPUTS(j) { CHECK_FLOAT_EQ(*i - *j, m.Call(*j)); } |
3927 volatile float expected = *i - *j; | |
3928 CheckFloatEq(expected, m.Call(*j)); | |
3929 } | |
3930 } | 3890 } |
3931 } | 3891 } |
3932 | 3892 |
3933 | 3893 |
3934 TEST(RunFloat32SubImm2) { | 3894 TEST(RunFloat32SubImm2) { |
3935 FOR_FLOAT32_INPUTS(i) { | 3895 FOR_FLOAT32_INPUTS(i) { |
3936 BufferedRawMachineAssemblerTester<float> m(MachineType::Float32()); | 3896 BufferedRawMachineAssemblerTester<float> m(MachineType::Float32()); |
3937 m.Return(m.Float32Sub(m.Parameter(0), m.Float32Constant(*i))); | 3897 m.Return(m.Float32Sub(m.Parameter(0), m.Float32Constant(*i))); |
3938 | 3898 |
3939 FOR_FLOAT32_INPUTS(j) { | 3899 FOR_FLOAT32_INPUTS(j) { CHECK_FLOAT_EQ(*j - *i, m.Call(*j)); } |
3940 volatile float expected = *j - *i; | |
3941 CheckFloatEq(expected, m.Call(*j)); | |
3942 } | |
3943 } | 3900 } |
3944 } | 3901 } |
3945 | 3902 |
3946 | 3903 |
3947 TEST(RunFloat64SubImm1) { | 3904 TEST(RunFloat64SubImm1) { |
3948 FOR_FLOAT64_INPUTS(i) { | 3905 FOR_FLOAT64_INPUTS(i) { |
3949 BufferedRawMachineAssemblerTester<double> m(MachineType::Float64()); | 3906 BufferedRawMachineAssemblerTester<double> m(MachineType::Float64()); |
3950 m.Return(m.Float64Sub(m.Float64Constant(*i), m.Parameter(0))); | 3907 m.Return(m.Float64Sub(m.Float64Constant(*i), m.Parameter(0))); |
3951 | 3908 |
3952 FOR_FLOAT64_INPUTS(j) { CheckFloatEq(*i - *j, m.Call(*j)); } | 3909 FOR_FLOAT64_INPUTS(j) { CHECK_FLOAT_EQ(*i - *j, m.Call(*j)); } |
3953 } | 3910 } |
3954 } | 3911 } |
3955 | 3912 |
3956 | 3913 |
3957 TEST(RunFloat64SubImm2) { | 3914 TEST(RunFloat64SubImm2) { |
3958 FOR_FLOAT64_INPUTS(i) { | 3915 FOR_FLOAT64_INPUTS(i) { |
3959 BufferedRawMachineAssemblerTester<double> m(MachineType::Float64()); | 3916 BufferedRawMachineAssemblerTester<double> m(MachineType::Float64()); |
3960 m.Return(m.Float64Sub(m.Parameter(0), m.Float64Constant(*i))); | 3917 m.Return(m.Float64Sub(m.Parameter(0), m.Float64Constant(*i))); |
3961 | 3918 |
3962 FOR_FLOAT64_INPUTS(j) { CheckFloatEq(*j - *i, m.Call(*j)); } | 3919 FOR_FLOAT64_INPUTS(j) { CHECK_FLOAT_EQ(*j - *i, m.Call(*j)); } |
3963 } | 3920 } |
3964 } | 3921 } |
3965 | 3922 |
3966 | 3923 |
3967 TEST(RunFloat64SubP) { | 3924 TEST(RunFloat64SubP) { |
3968 RawMachineAssemblerTester<int32_t> m; | 3925 RawMachineAssemblerTester<int32_t> m; |
3969 Float64BinopTester bt(&m); | 3926 Float64BinopTester bt(&m); |
3970 | 3927 |
3971 bt.AddReturn(m.Float64Sub(bt.param0, bt.param1)); | 3928 bt.AddReturn(m.Float64Sub(bt.param0, bt.param1)); |
3972 | 3929 |
3973 FOR_FLOAT64_INPUTS(pl) { | 3930 FOR_FLOAT64_INPUTS(pl) { |
3974 FOR_FLOAT64_INPUTS(pr) { | 3931 FOR_FLOAT64_INPUTS(pr) { |
3975 double expected = *pl - *pr; | 3932 double expected = *pl - *pr; |
3976 CheckDoubleEq(expected, bt.call(*pl, *pr)); | 3933 CHECK_DOUBLE_EQ(expected, bt.call(*pl, *pr)); |
3977 } | 3934 } |
3978 } | 3935 } |
3979 } | 3936 } |
3980 | 3937 |
3981 | 3938 |
3982 TEST(RunFloat32MulP) { | 3939 TEST(RunFloat32MulP) { |
3983 RawMachineAssemblerTester<int32_t> m; | 3940 RawMachineAssemblerTester<int32_t> m; |
3984 Float32BinopTester bt(&m); | 3941 Float32BinopTester bt(&m); |
3985 | 3942 |
3986 bt.AddReturn(m.Float32Mul(bt.param0, bt.param1)); | 3943 bt.AddReturn(m.Float32Mul(bt.param0, bt.param1)); |
3987 | 3944 |
3988 FOR_FLOAT32_INPUTS(pl) { | 3945 FOR_FLOAT32_INPUTS(pl) { |
3989 FOR_FLOAT32_INPUTS(pr) { | 3946 FOR_FLOAT32_INPUTS(pr) { CHECK_FLOAT_EQ(*pl * *pr, bt.call(*pl, *pr)); } |
3990 float expected = *pl * *pr; | |
3991 CheckFloatEq(expected, bt.call(*pl, *pr)); | |
3992 } | |
3993 } | 3947 } |
3994 } | 3948 } |
3995 | 3949 |
3996 | 3950 |
3997 TEST(RunFloat64MulP) { | 3951 TEST(RunFloat64MulP) { |
3998 RawMachineAssemblerTester<int32_t> m; | 3952 RawMachineAssemblerTester<int32_t> m; |
3999 Float64BinopTester bt(&m); | 3953 Float64BinopTester bt(&m); |
4000 | 3954 |
4001 bt.AddReturn(m.Float64Mul(bt.param0, bt.param1)); | 3955 bt.AddReturn(m.Float64Mul(bt.param0, bt.param1)); |
4002 | 3956 |
4003 FOR_FLOAT64_INPUTS(pl) { | 3957 FOR_FLOAT64_INPUTS(pl) { |
4004 FOR_FLOAT64_INPUTS(pr) { | 3958 FOR_FLOAT64_INPUTS(pr) { |
4005 double expected = *pl * *pr; | 3959 double expected = *pl * *pr; |
4006 CheckDoubleEq(expected, bt.call(*pl, *pr)); | 3960 CHECK_DOUBLE_EQ(expected, bt.call(*pl, *pr)); |
4007 } | 3961 } |
4008 } | 3962 } |
4009 } | 3963 } |
4010 | 3964 |
4011 | 3965 |
4012 TEST(RunFloat64MulAndFloat64Add1) { | 3966 TEST(RunFloat64MulAndFloat64Add1) { |
4013 BufferedRawMachineAssemblerTester<double> m( | 3967 BufferedRawMachineAssemblerTester<double> m( |
4014 MachineType::Float64(), MachineType::Float64(), MachineType::Float64()); | 3968 MachineType::Float64(), MachineType::Float64(), MachineType::Float64()); |
4015 m.Return(m.Float64Add(m.Float64Mul(m.Parameter(0), m.Parameter(1)), | 3969 m.Return(m.Float64Add(m.Float64Mul(m.Parameter(0), m.Parameter(1)), |
4016 m.Parameter(2))); | 3970 m.Parameter(2))); |
4017 | 3971 |
4018 FOR_FLOAT64_INPUTS(i) { | 3972 FOR_FLOAT64_INPUTS(i) { |
4019 FOR_FLOAT64_INPUTS(j) { | 3973 FOR_FLOAT64_INPUTS(j) { |
4020 FOR_FLOAT64_INPUTS(k) { | 3974 FOR_FLOAT64_INPUTS(k) { |
4021 CheckDoubleEq((*i * *j) + *k, m.Call(*i, *j, *k)); | 3975 CHECK_DOUBLE_EQ((*i * *j) + *k, m.Call(*i, *j, *k)); |
4022 } | 3976 } |
4023 } | 3977 } |
4024 } | 3978 } |
4025 } | 3979 } |
4026 | 3980 |
4027 | 3981 |
4028 TEST(RunFloat64MulAndFloat64Add2) { | 3982 TEST(RunFloat64MulAndFloat64Add2) { |
4029 BufferedRawMachineAssemblerTester<double> m( | 3983 BufferedRawMachineAssemblerTester<double> m( |
4030 MachineType::Float64(), MachineType::Float64(), MachineType::Float64()); | 3984 MachineType::Float64(), MachineType::Float64(), MachineType::Float64()); |
4031 m.Return(m.Float64Add(m.Parameter(0), | 3985 m.Return(m.Float64Add(m.Parameter(0), |
4032 m.Float64Mul(m.Parameter(1), m.Parameter(2)))); | 3986 m.Float64Mul(m.Parameter(1), m.Parameter(2)))); |
4033 | 3987 |
4034 FOR_FLOAT64_INPUTS(i) { | 3988 FOR_FLOAT64_INPUTS(i) { |
4035 FOR_FLOAT64_INPUTS(j) { | 3989 FOR_FLOAT64_INPUTS(j) { |
4036 FOR_FLOAT64_INPUTS(k) { | 3990 FOR_FLOAT64_INPUTS(k) { |
4037 CheckDoubleEq(*i + (*j * *k), m.Call(*i, *j, *k)); | 3991 CHECK_DOUBLE_EQ(*i + (*j * *k), m.Call(*i, *j, *k)); |
4038 } | 3992 } |
4039 } | 3993 } |
4040 } | 3994 } |
4041 } | 3995 } |
4042 | 3996 |
4043 | 3997 |
4044 TEST(RunFloat64MulAndFloat64Sub1) { | 3998 TEST(RunFloat64MulAndFloat64Sub1) { |
4045 BufferedRawMachineAssemblerTester<double> m( | 3999 BufferedRawMachineAssemblerTester<double> m( |
4046 MachineType::Float64(), MachineType::Float64(), MachineType::Float64()); | 4000 MachineType::Float64(), MachineType::Float64(), MachineType::Float64()); |
4047 m.Return(m.Float64Sub(m.Float64Mul(m.Parameter(0), m.Parameter(1)), | 4001 m.Return(m.Float64Sub(m.Float64Mul(m.Parameter(0), m.Parameter(1)), |
4048 m.Parameter(2))); | 4002 m.Parameter(2))); |
4049 | 4003 |
4050 FOR_FLOAT64_INPUTS(i) { | 4004 FOR_FLOAT64_INPUTS(i) { |
4051 FOR_FLOAT64_INPUTS(j) { | 4005 FOR_FLOAT64_INPUTS(j) { |
4052 FOR_FLOAT64_INPUTS(k) { | 4006 FOR_FLOAT64_INPUTS(k) { |
4053 CheckDoubleEq((*i * *j) - *k, m.Call(*i, *j, *k)); | 4007 CHECK_DOUBLE_EQ((*i * *j) - *k, m.Call(*i, *j, *k)); |
4054 } | 4008 } |
4055 } | 4009 } |
4056 } | 4010 } |
4057 } | 4011 } |
4058 | 4012 |
4059 | 4013 |
4060 TEST(RunFloat64MulAndFloat64Sub2) { | 4014 TEST(RunFloat64MulAndFloat64Sub2) { |
4061 BufferedRawMachineAssemblerTester<double> m( | 4015 BufferedRawMachineAssemblerTester<double> m( |
4062 MachineType::Float64(), MachineType::Float64(), MachineType::Float64()); | 4016 MachineType::Float64(), MachineType::Float64(), MachineType::Float64()); |
4063 m.Return(m.Float64Sub(m.Parameter(0), | 4017 m.Return(m.Float64Sub(m.Parameter(0), |
4064 m.Float64Mul(m.Parameter(1), m.Parameter(2)))); | 4018 m.Float64Mul(m.Parameter(1), m.Parameter(2)))); |
4065 | 4019 |
4066 FOR_FLOAT64_INPUTS(i) { | 4020 FOR_FLOAT64_INPUTS(i) { |
4067 FOR_FLOAT64_INPUTS(j) { | 4021 FOR_FLOAT64_INPUTS(j) { |
4068 FOR_FLOAT64_INPUTS(k) { | 4022 FOR_FLOAT64_INPUTS(k) { |
4069 CheckDoubleEq(*i - (*j * *k), m.Call(*i, *j, *k)); | 4023 CHECK_DOUBLE_EQ(*i - (*j * *k), m.Call(*i, *j, *k)); |
4070 } | 4024 } |
4071 } | 4025 } |
4072 } | 4026 } |
4073 } | 4027 } |
4074 | 4028 |
4075 | 4029 |
4076 TEST(RunFloat64MulImm1) { | 4030 TEST(RunFloat64MulImm1) { |
4077 FOR_FLOAT64_INPUTS(i) { | 4031 FOR_FLOAT64_INPUTS(i) { |
4078 BufferedRawMachineAssemblerTester<double> m(MachineType::Float64()); | 4032 BufferedRawMachineAssemblerTester<double> m(MachineType::Float64()); |
4079 m.Return(m.Float64Mul(m.Float64Constant(*i), m.Parameter(0))); | 4033 m.Return(m.Float64Mul(m.Float64Constant(*i), m.Parameter(0))); |
4080 | 4034 |
4081 FOR_FLOAT64_INPUTS(j) { CheckFloatEq(*i * *j, m.Call(*j)); } | 4035 FOR_FLOAT64_INPUTS(j) { CHECK_FLOAT_EQ(*i * *j, m.Call(*j)); } |
4082 } | 4036 } |
4083 } | 4037 } |
4084 | 4038 |
4085 | 4039 |
4086 TEST(RunFloat64MulImm2) { | 4040 TEST(RunFloat64MulImm2) { |
4087 FOR_FLOAT64_INPUTS(i) { | 4041 FOR_FLOAT64_INPUTS(i) { |
4088 BufferedRawMachineAssemblerTester<double> m(MachineType::Float64()); | 4042 BufferedRawMachineAssemblerTester<double> m(MachineType::Float64()); |
4089 m.Return(m.Float64Mul(m.Parameter(0), m.Float64Constant(*i))); | 4043 m.Return(m.Float64Mul(m.Parameter(0), m.Float64Constant(*i))); |
4090 | 4044 |
4091 FOR_FLOAT64_INPUTS(j) { CheckFloatEq(*j * *i, m.Call(*j)); } | 4045 FOR_FLOAT64_INPUTS(j) { CHECK_FLOAT_EQ(*j * *i, m.Call(*j)); } |
4092 } | 4046 } |
4093 } | 4047 } |
4094 | 4048 |
4095 | 4049 |
4096 TEST(RunFloat32DivP) { | 4050 TEST(RunFloat32DivP) { |
4097 RawMachineAssemblerTester<int32_t> m; | 4051 RawMachineAssemblerTester<int32_t> m; |
4098 Float32BinopTester bt(&m); | 4052 Float32BinopTester bt(&m); |
4099 | 4053 |
4100 bt.AddReturn(m.Float32Div(bt.param0, bt.param1)); | 4054 bt.AddReturn(m.Float32Div(bt.param0, bt.param1)); |
4101 | 4055 |
4102 FOR_FLOAT32_INPUTS(pl) { | 4056 FOR_FLOAT32_INPUTS(pl) { |
4103 FOR_FLOAT32_INPUTS(pr) { | 4057 FOR_FLOAT32_INPUTS(pr) { CHECK_FLOAT_EQ(*pl / *pr, bt.call(*pl, *pr)); } |
4104 float expected = *pl / *pr; | |
4105 CheckFloatEq(expected, bt.call(*pl, *pr)); | |
4106 } | |
4107 } | 4058 } |
4108 } | 4059 } |
4109 | 4060 |
4110 | 4061 |
4111 TEST(RunFloat64DivP) { | 4062 TEST(RunFloat64DivP) { |
4112 RawMachineAssemblerTester<int32_t> m; | 4063 RawMachineAssemblerTester<int32_t> m; |
4113 Float64BinopTester bt(&m); | 4064 Float64BinopTester bt(&m); |
4114 | 4065 |
4115 bt.AddReturn(m.Float64Div(bt.param0, bt.param1)); | 4066 bt.AddReturn(m.Float64Div(bt.param0, bt.param1)); |
4116 | 4067 |
4117 FOR_FLOAT64_INPUTS(pl) { | 4068 FOR_FLOAT64_INPUTS(pl) { |
4118 FOR_FLOAT64_INPUTS(pr) { | 4069 FOR_FLOAT64_INPUTS(pr) { CHECK_DOUBLE_EQ(*pl / *pr, bt.call(*pl, *pr)); } |
4119 double expected = *pl / *pr; | |
4120 CheckDoubleEq(expected, bt.call(*pl, *pr)); | |
4121 } | |
4122 } | 4070 } |
4123 } | 4071 } |
4124 | 4072 |
4125 | 4073 |
4126 TEST(RunFloat64ModP) { | 4074 TEST(RunFloat64ModP) { |
4127 RawMachineAssemblerTester<int32_t> m; | 4075 RawMachineAssemblerTester<int32_t> m; |
4128 Float64BinopTester bt(&m); | 4076 Float64BinopTester bt(&m); |
4129 | 4077 |
4130 bt.AddReturn(m.Float64Mod(bt.param0, bt.param1)); | 4078 bt.AddReturn(m.Float64Mod(bt.param0, bt.param1)); |
4131 | 4079 |
4132 FOR_FLOAT64_INPUTS(i) { | 4080 FOR_FLOAT64_INPUTS(i) { |
4133 FOR_FLOAT64_INPUTS(j) { | 4081 FOR_FLOAT64_INPUTS(j) { CHECK_DOUBLE_EQ(modulo(*i, *j), bt.call(*i, *j)); } |
4134 double expected = modulo(*i, *j); | |
4135 double found = bt.call(*i, *j); | |
4136 CheckDoubleEq(expected, found); | |
4137 } | |
4138 } | 4082 } |
4139 } | 4083 } |
4140 | 4084 |
4141 | 4085 |
4142 TEST(RunChangeInt32ToFloat64_A) { | 4086 TEST(RunChangeInt32ToFloat64_A) { |
4143 int32_t magic = 0x986234; | 4087 int32_t magic = 0x986234; |
4144 BufferedRawMachineAssemblerTester<double> m; | 4088 BufferedRawMachineAssemblerTester<double> m; |
4145 m.Return(m.ChangeInt32ToFloat64(m.Int32Constant(magic))); | 4089 m.Return(m.ChangeInt32ToFloat64(m.Int32Constant(magic))); |
4146 CheckDoubleEq(static_cast<double>(magic), m.Call()); | 4090 CHECK_DOUBLE_EQ(static_cast<double>(magic), m.Call()); |
4147 } | 4091 } |
4148 | 4092 |
4149 | 4093 |
4150 TEST(RunChangeInt32ToFloat64_B) { | 4094 TEST(RunChangeInt32ToFloat64_B) { |
4151 BufferedRawMachineAssemblerTester<double> m(MachineType::Int32()); | 4095 BufferedRawMachineAssemblerTester<double> m(MachineType::Int32()); |
4152 m.Return(m.ChangeInt32ToFloat64(m.Parameter(0))); | 4096 m.Return(m.ChangeInt32ToFloat64(m.Parameter(0))); |
4153 | 4097 |
4154 FOR_INT32_INPUTS(i) { CheckDoubleEq(static_cast<double>(*i), m.Call(*i)); } | 4098 FOR_INT32_INPUTS(i) { CHECK_DOUBLE_EQ(static_cast<double>(*i), m.Call(*i)); } |
4155 } | 4099 } |
4156 | 4100 |
4157 | 4101 |
4158 TEST(RunChangeUint32ToFloat64) { | 4102 TEST(RunChangeUint32ToFloat64) { |
4159 BufferedRawMachineAssemblerTester<double> m(MachineType::Uint32()); | 4103 BufferedRawMachineAssemblerTester<double> m(MachineType::Uint32()); |
4160 m.Return(m.ChangeUint32ToFloat64(m.Parameter(0))); | 4104 m.Return(m.ChangeUint32ToFloat64(m.Parameter(0))); |
4161 | 4105 |
4162 FOR_UINT32_INPUTS(i) { CheckDoubleEq(static_cast<double>(*i), m.Call(*i)); } | 4106 FOR_UINT32_INPUTS(i) { CHECK_DOUBLE_EQ(static_cast<double>(*i), m.Call(*i)); } |
4163 } | 4107 } |
4164 | 4108 |
4165 | 4109 |
4166 TEST(RunTruncateFloat32ToInt32) { | 4110 TEST(RunTruncateFloat32ToInt32) { |
4167 BufferedRawMachineAssemblerTester<int32_t> m(MachineType::Float32()); | 4111 BufferedRawMachineAssemblerTester<int32_t> m(MachineType::Float32()); |
4168 m.Return(m.TruncateFloat32ToInt32(m.Parameter(0))); | 4112 m.Return(m.TruncateFloat32ToInt32(m.Parameter(0))); |
4169 FOR_FLOAT32_INPUTS(i) { | 4113 FOR_FLOAT32_INPUTS(i) { |
4170 if (*i <= static_cast<float>(std::numeric_limits<int32_t>::max()) && | 4114 if (*i <= static_cast<float>(std::numeric_limits<int32_t>::max()) && |
4171 *i >= static_cast<float>(std::numeric_limits<int32_t>::min())) { | 4115 *i >= static_cast<float>(std::numeric_limits<int32_t>::min())) { |
4172 CheckFloatEq(static_cast<int32_t>(*i), m.Call(*i)); | 4116 CHECK_FLOAT_EQ(static_cast<int32_t>(*i), m.Call(*i)); |
4173 } | 4117 } |
4174 } | 4118 } |
4175 } | 4119 } |
4176 | 4120 |
4177 | 4121 |
4178 TEST(RunTruncateFloat32ToUint32) { | 4122 TEST(RunTruncateFloat32ToUint32) { |
4179 BufferedRawMachineAssemblerTester<uint32_t> m(MachineType::Float32()); | 4123 BufferedRawMachineAssemblerTester<uint32_t> m(MachineType::Float32()); |
4180 m.Return(m.TruncateFloat32ToUint32(m.Parameter(0))); | 4124 m.Return(m.TruncateFloat32ToUint32(m.Parameter(0))); |
4181 { | 4125 { |
4182 FOR_UINT32_INPUTS(i) { | 4126 FOR_UINT32_INPUTS(i) { |
4183 float input = static_cast<float>(*i); | 4127 float input = static_cast<float>(*i); |
4184 // This condition on 'input' is required because | 4128 // This condition on 'input' is required because |
4185 // static_cast<float>(std::numeric_limits<uint32_t>::max()) results in a | 4129 // static_cast<float>(std::numeric_limits<uint32_t>::max()) results in a |
4186 // value outside uint32 range. | 4130 // value outside uint32 range. |
4187 if (input < static_cast<float>(std::numeric_limits<uint32_t>::max())) { | 4131 if (input < static_cast<float>(std::numeric_limits<uint32_t>::max())) { |
4188 CHECK_EQ(static_cast<uint32_t>(input), m.Call(input)); | 4132 CHECK_EQ(static_cast<uint32_t>(input), m.Call(input)); |
4189 } | 4133 } |
4190 } | 4134 } |
4191 } | 4135 } |
4192 { | 4136 { |
4193 FOR_FLOAT32_INPUTS(i) { | 4137 FOR_FLOAT32_INPUTS(i) { |
4194 if (*i <= static_cast<float>(std::numeric_limits<uint32_t>::max()) && | 4138 if (*i <= static_cast<float>(std::numeric_limits<uint32_t>::max()) && |
4195 *i >= static_cast<float>(std::numeric_limits<uint32_t>::min())) { | 4139 *i >= static_cast<float>(std::numeric_limits<uint32_t>::min())) { |
4196 CheckFloatEq(static_cast<uint32_t>(*i), m.Call(*i)); | 4140 CHECK_FLOAT_EQ(static_cast<uint32_t>(*i), m.Call(*i)); |
4197 } | 4141 } |
4198 } | 4142 } |
4199 } | 4143 } |
4200 } | 4144 } |
4201 | 4145 |
4202 | 4146 |
4203 TEST(RunChangeFloat64ToInt32_A) { | 4147 TEST(RunChangeFloat64ToInt32_A) { |
4204 BufferedRawMachineAssemblerTester<int32_t> m; | 4148 BufferedRawMachineAssemblerTester<int32_t> m; |
4205 double magic = 11.1; | 4149 double magic = 11.1; |
4206 m.Return(m.ChangeFloat64ToInt32(m.Float64Constant(magic))); | 4150 m.Return(m.ChangeFloat64ToInt32(m.Float64Constant(magic))); |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4243 // Note we don't check fractional inputs, because these Convert operators | 4187 // Note we don't check fractional inputs, because these Convert operators |
4244 // really should be Change operators. | 4188 // really should be Change operators. |
4245 } | 4189 } |
4246 | 4190 |
4247 | 4191 |
4248 TEST(RunTruncateFloat64ToFloat32) { | 4192 TEST(RunTruncateFloat64ToFloat32) { |
4249 BufferedRawMachineAssemblerTester<float> m(MachineType::Float64()); | 4193 BufferedRawMachineAssemblerTester<float> m(MachineType::Float64()); |
4250 | 4194 |
4251 m.Return(m.TruncateFloat64ToFloat32(m.Parameter(0))); | 4195 m.Return(m.TruncateFloat64ToFloat32(m.Parameter(0))); |
4252 | 4196 |
4253 FOR_FLOAT64_INPUTS(i) { CheckFloatEq(DoubleToFloat32(*i), m.Call(*i)); } | 4197 FOR_FLOAT64_INPUTS(i) { CHECK_FLOAT_EQ(DoubleToFloat32(*i), m.Call(*i)); } |
4254 } | 4198 } |
4255 | 4199 |
4256 | 4200 |
4257 TEST(RunDeadChangeFloat64ToInt32) { | 4201 TEST(RunDeadChangeFloat64ToInt32) { |
4258 RawMachineAssemblerTester<int32_t> m; | 4202 RawMachineAssemblerTester<int32_t> m; |
4259 const int magic = 0x88abcda4; | 4203 const int magic = 0x88abcda4; |
4260 m.ChangeFloat64ToInt32(m.Float64Constant(999.78)); | 4204 m.ChangeFloat64ToInt32(m.Float64Constant(999.78)); |
4261 m.Return(m.Int32Constant(magic)); | 4205 m.Return(m.Int32Constant(magic)); |
4262 CHECK_EQ(magic, m.Call()); | 4206 CHECK_EQ(magic, m.Call()); |
4263 } | 4207 } |
(...skipping 1027 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5291 CHECK_EQ(static_cast<int>(expected), m.Call()); | 5235 CHECK_EQ(static_cast<int>(expected), m.Call()); |
5292 } | 5236 } |
5293 } | 5237 } |
5294 | 5238 |
5295 | 5239 |
5296 TEST(RunChangeFloat32ToFloat64) { | 5240 TEST(RunChangeFloat32ToFloat64) { |
5297 BufferedRawMachineAssemblerTester<double> m(MachineType::Float32()); | 5241 BufferedRawMachineAssemblerTester<double> m(MachineType::Float32()); |
5298 | 5242 |
5299 m.Return(m.ChangeFloat32ToFloat64(m.Parameter(0))); | 5243 m.Return(m.ChangeFloat32ToFloat64(m.Parameter(0))); |
5300 | 5244 |
5301 FOR_FLOAT32_INPUTS(i) { CheckDoubleEq(static_cast<double>(*i), m.Call(*i)); } | 5245 FOR_FLOAT32_INPUTS(i) { |
| 5246 CHECK_DOUBLE_EQ(static_cast<double>(*i), m.Call(*i)); |
| 5247 } |
5302 } | 5248 } |
5303 | 5249 |
5304 | 5250 |
5305 TEST(RunFloat32Constant) { | 5251 TEST(RunFloat32Constant) { |
5306 FOR_FLOAT32_INPUTS(i) { | 5252 FOR_FLOAT32_INPUTS(i) { |
5307 BufferedRawMachineAssemblerTester<float> m; | 5253 BufferedRawMachineAssemblerTester<float> m; |
5308 m.Return(m.Float32Constant(*i)); | 5254 m.Return(m.Float32Constant(*i)); |
5309 CheckFloatEq(*i, m.Call()); | 5255 CHECK_FLOAT_EQ(*i, m.Call()); |
5310 } | 5256 } |
5311 } | 5257 } |
5312 | 5258 |
5313 | 5259 |
5314 TEST(RunFloat64ExtractLowWord32) { | 5260 TEST(RunFloat64ExtractLowWord32) { |
5315 BufferedRawMachineAssemblerTester<uint32_t> m(MachineType::Float64()); | 5261 BufferedRawMachineAssemblerTester<uint32_t> m(MachineType::Float64()); |
5316 m.Return(m.Float64ExtractLowWord32(m.Parameter(0))); | 5262 m.Return(m.Float64ExtractLowWord32(m.Parameter(0))); |
5317 FOR_FLOAT64_INPUTS(i) { | 5263 FOR_FLOAT64_INPUTS(i) { |
5318 uint32_t expected = static_cast<uint32_t>(bit_cast<uint64_t>(*i)); | 5264 uint32_t expected = static_cast<uint32_t>(bit_cast<uint64_t>(*i)); |
5319 CHECK_EQ(expected, m.Call(*i)); | 5265 CHECK_EQ(expected, m.Call(*i)); |
(...skipping 13 matching lines...) Expand all Loading... |
5333 | 5279 |
5334 TEST(RunFloat64InsertLowWord32) { | 5280 TEST(RunFloat64InsertLowWord32) { |
5335 BufferedRawMachineAssemblerTester<double> m(MachineType::Float64(), | 5281 BufferedRawMachineAssemblerTester<double> m(MachineType::Float64(), |
5336 MachineType::Int32()); | 5282 MachineType::Int32()); |
5337 m.Return(m.Float64InsertLowWord32(m.Parameter(0), m.Parameter(1))); | 5283 m.Return(m.Float64InsertLowWord32(m.Parameter(0), m.Parameter(1))); |
5338 FOR_FLOAT64_INPUTS(i) { | 5284 FOR_FLOAT64_INPUTS(i) { |
5339 FOR_INT32_INPUTS(j) { | 5285 FOR_INT32_INPUTS(j) { |
5340 double expected = bit_cast<double>( | 5286 double expected = bit_cast<double>( |
5341 (bit_cast<uint64_t>(*i) & ~(V8_UINT64_C(0xFFFFFFFF))) | | 5287 (bit_cast<uint64_t>(*i) & ~(V8_UINT64_C(0xFFFFFFFF))) | |
5342 (static_cast<uint64_t>(bit_cast<uint32_t>(*j)))); | 5288 (static_cast<uint64_t>(bit_cast<uint32_t>(*j)))); |
5343 CheckDoubleEq(expected, m.Call(*i, *j)); | 5289 CHECK_DOUBLE_EQ(expected, m.Call(*i, *j)); |
5344 } | 5290 } |
5345 } | 5291 } |
5346 } | 5292 } |
5347 | 5293 |
5348 | 5294 |
5349 TEST(RunFloat64InsertHighWord32) { | 5295 TEST(RunFloat64InsertHighWord32) { |
5350 BufferedRawMachineAssemblerTester<double> m(MachineType::Float64(), | 5296 BufferedRawMachineAssemblerTester<double> m(MachineType::Float64(), |
5351 MachineType::Uint32()); | 5297 MachineType::Uint32()); |
5352 m.Return(m.Float64InsertHighWord32(m.Parameter(0), m.Parameter(1))); | 5298 m.Return(m.Float64InsertHighWord32(m.Parameter(0), m.Parameter(1))); |
5353 FOR_FLOAT64_INPUTS(i) { | 5299 FOR_FLOAT64_INPUTS(i) { |
5354 FOR_UINT32_INPUTS(j) { | 5300 FOR_UINT32_INPUTS(j) { |
5355 uint64_t expected = (bit_cast<uint64_t>(*i) & 0xFFFFFFFF) | | 5301 uint64_t expected = (bit_cast<uint64_t>(*i) & 0xFFFFFFFF) | |
5356 (static_cast<uint64_t>(*j) << 32); | 5302 (static_cast<uint64_t>(*j) << 32); |
5357 | 5303 |
5358 CheckDoubleEq(bit_cast<double>(expected), m.Call(*i, *j)); | 5304 CHECK_DOUBLE_EQ(bit_cast<double>(expected), m.Call(*i, *j)); |
5359 } | 5305 } |
5360 } | 5306 } |
5361 } | 5307 } |
5362 | 5308 |
5363 | 5309 |
5364 TEST(RunFloat32Abs) { | 5310 TEST(RunFloat32Abs) { |
5365 BufferedRawMachineAssemblerTester<float> m(MachineType::Float32()); | 5311 BufferedRawMachineAssemblerTester<float> m(MachineType::Float32()); |
5366 m.Return(m.Float32Abs(m.Parameter(0))); | 5312 m.Return(m.Float32Abs(m.Parameter(0))); |
5367 FOR_FLOAT32_INPUTS(i) { CheckFloatEq(std::abs(*i), m.Call(*i)); } | 5313 FOR_FLOAT32_INPUTS(i) { CHECK_FLOAT_EQ(std::abs(*i), m.Call(*i)); } |
5368 } | 5314 } |
5369 | 5315 |
5370 | 5316 |
5371 TEST(RunFloat64Abs) { | 5317 TEST(RunFloat64Abs) { |
5372 BufferedRawMachineAssemblerTester<double> m(MachineType::Float64()); | 5318 BufferedRawMachineAssemblerTester<double> m(MachineType::Float64()); |
5373 m.Return(m.Float64Abs(m.Parameter(0))); | 5319 m.Return(m.Float64Abs(m.Parameter(0))); |
5374 FOR_FLOAT64_INPUTS(i) { CheckDoubleEq(std::abs(*i), m.Call(*i)); } | 5320 FOR_FLOAT64_INPUTS(i) { CHECK_DOUBLE_EQ(std::abs(*i), m.Call(*i)); } |
5375 } | 5321 } |
5376 | 5322 |
5377 | 5323 |
5378 static double two_30 = 1 << 30; // 2^30 is a smi boundary. | 5324 static double two_30 = 1 << 30; // 2^30 is a smi boundary. |
5379 static double two_52 = two_30 * (1 << 22); // 2^52 is a precision boundary. | 5325 static double two_52 = two_30 * (1 << 22); // 2^52 is a precision boundary. |
5380 static double kValues[] = {0.1, | 5326 static double kValues[] = {0.1, |
5381 0.2, | 5327 0.2, |
5382 0.49999999999999994, | 5328 0.49999999999999994, |
5383 0.5, | 5329 0.5, |
5384 0.7, | 5330 0.7, |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5472 -two_52 + 1 - 0.5, | 5418 -two_52 + 1 - 0.5, |
5473 -two_52 + 1 - 0.7}; | 5419 -two_52 + 1 - 0.7}; |
5474 | 5420 |
5475 | 5421 |
5476 TEST(RunFloat32RoundDown) { | 5422 TEST(RunFloat32RoundDown) { |
5477 BufferedRawMachineAssemblerTester<float> m(MachineType::Float32()); | 5423 BufferedRawMachineAssemblerTester<float> m(MachineType::Float32()); |
5478 if (!m.machine()->Float32RoundDown().IsSupported()) return; | 5424 if (!m.machine()->Float32RoundDown().IsSupported()) return; |
5479 | 5425 |
5480 m.Return(m.Float32RoundDown(m.Parameter(0))); | 5426 m.Return(m.Float32RoundDown(m.Parameter(0))); |
5481 | 5427 |
5482 FOR_FLOAT32_INPUTS(i) { CheckFloatEq(floorf(*i), m.Call(*i)); } | 5428 FOR_FLOAT32_INPUTS(i) { CHECK_FLOAT_EQ(floorf(*i), m.Call(*i)); } |
5483 } | 5429 } |
5484 | 5430 |
5485 | 5431 |
5486 TEST(RunFloat64RoundDown1) { | 5432 TEST(RunFloat64RoundDown1) { |
5487 BufferedRawMachineAssemblerTester<double> m(MachineType::Float64()); | 5433 BufferedRawMachineAssemblerTester<double> m(MachineType::Float64()); |
5488 if (!m.machine()->Float64RoundDown().IsSupported()) return; | 5434 if (!m.machine()->Float64RoundDown().IsSupported()) return; |
5489 | 5435 |
5490 m.Return(m.Float64RoundDown(m.Parameter(0))); | 5436 m.Return(m.Float64RoundDown(m.Parameter(0))); |
5491 | 5437 |
5492 FOR_FLOAT64_INPUTS(i) { CheckDoubleEq(floor(*i), m.Call(*i)); } | 5438 FOR_FLOAT64_INPUTS(i) { CHECK_DOUBLE_EQ(floor(*i), m.Call(*i)); } |
5493 } | 5439 } |
5494 | 5440 |
5495 | 5441 |
5496 TEST(RunFloat64RoundDown2) { | 5442 TEST(RunFloat64RoundDown2) { |
5497 BufferedRawMachineAssemblerTester<double> m(MachineType::Float64()); | 5443 BufferedRawMachineAssemblerTester<double> m(MachineType::Float64()); |
5498 if (!m.machine()->Float64RoundDown().IsSupported()) return; | 5444 if (!m.machine()->Float64RoundDown().IsSupported()) return; |
5499 m.Return(m.Float64Sub(m.Float64Constant(-0.0), | 5445 m.Return(m.Float64Sub(m.Float64Constant(-0.0), |
5500 m.Float64RoundDown(m.Float64Sub(m.Float64Constant(-0.0), | 5446 m.Float64RoundDown(m.Float64Sub(m.Float64Constant(-0.0), |
5501 m.Parameter(0))))); | 5447 m.Parameter(0))))); |
5502 | 5448 |
5503 for (size_t i = 0; i < arraysize(kValues); ++i) { | 5449 for (size_t i = 0; i < arraysize(kValues); ++i) { |
5504 CHECK_EQ(ceil(kValues[i]), m.Call(kValues[i])); | 5450 CHECK_EQ(ceil(kValues[i]), m.Call(kValues[i])); |
5505 } | 5451 } |
5506 } | 5452 } |
5507 | 5453 |
5508 | 5454 |
5509 TEST(RunFloat32RoundUp) { | 5455 TEST(RunFloat32RoundUp) { |
5510 BufferedRawMachineAssemblerTester<float> m(MachineType::Float32()); | 5456 BufferedRawMachineAssemblerTester<float> m(MachineType::Float32()); |
5511 if (!m.machine()->Float32RoundUp().IsSupported()) return; | 5457 if (!m.machine()->Float32RoundUp().IsSupported()) return; |
5512 m.Return(m.Float32RoundUp(m.Parameter(0))); | 5458 m.Return(m.Float32RoundUp(m.Parameter(0))); |
5513 | 5459 |
5514 FOR_FLOAT32_INPUTS(i) { CheckFloatEq(ceilf(*i), m.Call(*i)); } | 5460 FOR_FLOAT32_INPUTS(i) { CHECK_FLOAT_EQ(ceilf(*i), m.Call(*i)); } |
5515 } | 5461 } |
5516 | 5462 |
5517 | 5463 |
5518 TEST(RunFloat64RoundUp) { | 5464 TEST(RunFloat64RoundUp) { |
5519 BufferedRawMachineAssemblerTester<double> m(MachineType::Float64()); | 5465 BufferedRawMachineAssemblerTester<double> m(MachineType::Float64()); |
5520 if (!m.machine()->Float64RoundUp().IsSupported()) return; | 5466 if (!m.machine()->Float64RoundUp().IsSupported()) return; |
5521 m.Return(m.Float64RoundUp(m.Parameter(0))); | 5467 m.Return(m.Float64RoundUp(m.Parameter(0))); |
5522 | 5468 |
5523 FOR_FLOAT64_INPUTS(i) { CheckDoubleEq(ceil(*i), m.Call(*i)); } | 5469 FOR_FLOAT64_INPUTS(i) { CHECK_DOUBLE_EQ(ceil(*i), m.Call(*i)); } |
5524 } | 5470 } |
5525 | 5471 |
5526 | 5472 |
5527 TEST(RunFloat32RoundTiesEven) { | 5473 TEST(RunFloat32RoundTiesEven) { |
5528 BufferedRawMachineAssemblerTester<float> m(MachineType::Float32()); | 5474 BufferedRawMachineAssemblerTester<float> m(MachineType::Float32()); |
5529 if (!m.machine()->Float32RoundTiesEven().IsSupported()) return; | 5475 if (!m.machine()->Float32RoundTiesEven().IsSupported()) return; |
5530 m.Return(m.Float32RoundTiesEven(m.Parameter(0))); | 5476 m.Return(m.Float32RoundTiesEven(m.Parameter(0))); |
5531 | 5477 |
5532 FOR_FLOAT32_INPUTS(i) { CheckFloatEq(nearbyint(*i), m.Call(*i)); } | 5478 FOR_FLOAT32_INPUTS(i) { CHECK_FLOAT_EQ(nearbyint(*i), m.Call(*i)); } |
5533 } | 5479 } |
5534 | 5480 |
5535 | 5481 |
5536 TEST(RunFloat64RoundTiesEven) { | 5482 TEST(RunFloat64RoundTiesEven) { |
5537 BufferedRawMachineAssemblerTester<double> m(MachineType::Float64()); | 5483 BufferedRawMachineAssemblerTester<double> m(MachineType::Float64()); |
5538 if (!m.machine()->Float64RoundTiesEven().IsSupported()) return; | 5484 if (!m.machine()->Float64RoundTiesEven().IsSupported()) return; |
5539 m.Return(m.Float64RoundTiesEven(m.Parameter(0))); | 5485 m.Return(m.Float64RoundTiesEven(m.Parameter(0))); |
5540 | 5486 |
5541 FOR_FLOAT64_INPUTS(i) { CheckDoubleEq(nearbyint(*i), m.Call(*i)); } | 5487 FOR_FLOAT64_INPUTS(i) { CHECK_DOUBLE_EQ(nearbyint(*i), m.Call(*i)); } |
5542 } | 5488 } |
5543 | 5489 |
5544 | 5490 |
5545 TEST(RunFloat32RoundTruncate) { | 5491 TEST(RunFloat32RoundTruncate) { |
5546 BufferedRawMachineAssemblerTester<float> m(MachineType::Float32()); | 5492 BufferedRawMachineAssemblerTester<float> m(MachineType::Float32()); |
5547 if (!m.machine()->Float32RoundTruncate().IsSupported()) return; | 5493 if (!m.machine()->Float32RoundTruncate().IsSupported()) return; |
5548 | 5494 |
5549 m.Return(m.Float32RoundTruncate(m.Parameter(0))); | 5495 m.Return(m.Float32RoundTruncate(m.Parameter(0))); |
5550 | 5496 |
5551 FOR_FLOAT32_INPUTS(i) { CheckFloatEq(truncf(*i), m.Call(*i)); } | 5497 FOR_FLOAT32_INPUTS(i) { CHECK_FLOAT_EQ(truncf(*i), m.Call(*i)); } |
5552 } | 5498 } |
5553 | 5499 |
5554 | 5500 |
5555 TEST(RunFloat64RoundTruncate) { | 5501 TEST(RunFloat64RoundTruncate) { |
5556 BufferedRawMachineAssemblerTester<double> m(MachineType::Float64()); | 5502 BufferedRawMachineAssemblerTester<double> m(MachineType::Float64()); |
5557 if (!m.machine()->Float64RoundTruncate().IsSupported()) return; | 5503 if (!m.machine()->Float64RoundTruncate().IsSupported()) return; |
5558 m.Return(m.Float64RoundTruncate(m.Parameter(0))); | 5504 m.Return(m.Float64RoundTruncate(m.Parameter(0))); |
5559 for (size_t i = 0; i < arraysize(kValues); ++i) { | 5505 for (size_t i = 0; i < arraysize(kValues); ++i) { |
5560 CHECK_EQ(trunc(kValues[i]), m.Call(kValues[i])); | 5506 CHECK_EQ(trunc(kValues[i]), m.Call(kValues[i])); |
5561 } | 5507 } |
(...skipping 619 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6181 r.Goto(&merge); | 6127 r.Goto(&merge); |
6182 r.Bind(&merge); | 6128 r.Bind(&merge); |
6183 Node* phi = r.Phi(MachineRepresentation::kWord32, fa, fb); | 6129 Node* phi = r.Phi(MachineRepresentation::kWord32, fa, fb); |
6184 r.Return(phi); | 6130 r.Return(phi); |
6185 CHECK_EQ(1, r.Call(1)); | 6131 CHECK_EQ(1, r.Call(1)); |
6186 } | 6132 } |
6187 | 6133 |
6188 } // namespace compiler | 6134 } // namespace compiler |
6189 } // namespace internal | 6135 } // namespace internal |
6190 } // namespace v8 | 6136 } // namespace v8 |
OLD | NEW |