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 <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 4932 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4943 CHECK_EQ(expected, result); | 4943 CHECK_EQ(expected, result); |
4944 } | 4944 } |
4945 } | 4945 } |
4946 } | 4946 } |
4947 | 4947 |
4948 | 4948 |
4949 TEST(RunFloat32Abs) { | 4949 TEST(RunFloat32Abs) { |
4950 float input = -1.0; | 4950 float input = -1.0; |
4951 float result = 0.0; | 4951 float result = 0.0; |
4952 RawMachineAssemblerTester<int32_t> m; | 4952 RawMachineAssemblerTester<int32_t> m; |
4953 if (!m.machine()->HasFloat32Abs()) return; | 4953 if (!m.machine()->Float32Abs().supported()) return; |
4954 m.StoreToPointer(&result, kMachFloat32, | 4954 m.StoreToPointer(&result, kMachFloat32, |
4955 m.Float32Abs(m.LoadFromPointer(&input, kMachFloat32))); | 4955 m.Float32Abs(m.LoadFromPointer(&input, kMachFloat32))); |
4956 m.Return(m.Int32Constant(0)); | 4956 m.Return(m.Int32Constant(0)); |
4957 FOR_FLOAT32_INPUTS(i) { | 4957 FOR_FLOAT32_INPUTS(i) { |
4958 input = *i; | 4958 input = *i; |
4959 float expected = std::abs(input); | 4959 float expected = std::abs(input); |
4960 CHECK_EQ(0, m.Call()); | 4960 CHECK_EQ(0, m.Call()); |
4961 CheckFloatEq(expected, result); | 4961 CheckFloatEq(expected, result); |
4962 } | 4962 } |
4963 } | 4963 } |
4964 | 4964 |
4965 | 4965 |
4966 TEST(RunFloat64Abs) { | 4966 TEST(RunFloat64Abs) { |
4967 double input = -1.0; | 4967 double input = -1.0; |
4968 double result = 0.0; | 4968 double result = 0.0; |
4969 RawMachineAssemblerTester<int32_t> m; | 4969 RawMachineAssemblerTester<int32_t> m; |
4970 if (!m.machine()->HasFloat64Abs()) return; | 4970 if (!m.machine()->Float64Abs().supported()) return; |
4971 m.StoreToPointer(&result, kMachFloat64, | 4971 m.StoreToPointer(&result, kMachFloat64, |
4972 m.Float64Abs(m.LoadFromPointer(&input, kMachFloat64))); | 4972 m.Float64Abs(m.LoadFromPointer(&input, kMachFloat64))); |
4973 m.Return(m.Int32Constant(0)); | 4973 m.Return(m.Int32Constant(0)); |
4974 FOR_FLOAT64_INPUTS(i) { | 4974 FOR_FLOAT64_INPUTS(i) { |
4975 input = *i; | 4975 input = *i; |
4976 double expected = std::abs(input); | 4976 double expected = std::abs(input); |
4977 CHECK_EQ(0, m.Call()); | 4977 CHECK_EQ(0, m.Call()); |
4978 CheckDoubleEq(expected, result); | 4978 CheckDoubleEq(expected, result); |
4979 } | 4979 } |
4980 } | 4980 } |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5075 -two_52 + 1, | 5075 -two_52 + 1, |
5076 -two_52 + 1 - 0.1, | 5076 -two_52 + 1 - 0.1, |
5077 -two_52 + 1 - 0.5, | 5077 -two_52 + 1 - 0.5, |
5078 -two_52 + 1 - 0.7}; | 5078 -two_52 + 1 - 0.7}; |
5079 | 5079 |
5080 | 5080 |
5081 TEST(RunFloat64RoundDown1) { | 5081 TEST(RunFloat64RoundDown1) { |
5082 double input = -1.0; | 5082 double input = -1.0; |
5083 double result = 0.0; | 5083 double result = 0.0; |
5084 RawMachineAssemblerTester<int32_t> m; | 5084 RawMachineAssemblerTester<int32_t> m; |
5085 if (!m.machine()->HasFloat64RoundDown()) return; | 5085 if (!m.machine()->Float64RoundDown().supported()) return; |
5086 m.StoreToPointer(&result, kMachFloat64, | 5086 m.StoreToPointer(&result, kMachFloat64, |
5087 m.Float64RoundDown(m.LoadFromPointer(&input, kMachFloat64))); | 5087 m.Float64RoundDown(m.LoadFromPointer(&input, kMachFloat64))); |
5088 m.Return(m.Int32Constant(0)); | 5088 m.Return(m.Int32Constant(0)); |
5089 for (size_t i = 0; i < arraysize(kValues); ++i) { | 5089 for (size_t i = 0; i < arraysize(kValues); ++i) { |
5090 input = kValues[i]; | 5090 input = kValues[i]; |
5091 CHECK_EQ(0, m.Call()); | 5091 CHECK_EQ(0, m.Call()); |
5092 double expected = std::floor(kValues[i]); | 5092 double expected = std::floor(kValues[i]); |
5093 CHECK_EQ(expected, result); | 5093 CHECK_EQ(expected, result); |
5094 } | 5094 } |
5095 } | 5095 } |
5096 | 5096 |
5097 | 5097 |
5098 TEST(RunFloat64RoundDown2) { | 5098 TEST(RunFloat64RoundDown2) { |
5099 double input = -1.0; | 5099 double input = -1.0; |
5100 double result = 0.0; | 5100 double result = 0.0; |
5101 RawMachineAssemblerTester<int32_t> m; | 5101 RawMachineAssemblerTester<int32_t> m; |
5102 if (!m.machine()->HasFloat64RoundDown()) return; | 5102 if (!m.machine()->Float64RoundDown().supported()) return; |
5103 m.StoreToPointer(&result, kMachFloat64, | 5103 m.StoreToPointer(&result, kMachFloat64, |
5104 m.Float64Sub(m.Float64Constant(-0.0), | 5104 m.Float64Sub(m.Float64Constant(-0.0), |
5105 m.Float64RoundDown(m.Float64Sub( | 5105 m.Float64RoundDown(m.Float64Sub( |
5106 m.Float64Constant(-0.0), | 5106 m.Float64Constant(-0.0), |
5107 m.LoadFromPointer(&input, kMachFloat64))))); | 5107 m.LoadFromPointer(&input, kMachFloat64))))); |
5108 m.Return(m.Int32Constant(0)); | 5108 m.Return(m.Int32Constant(0)); |
5109 for (size_t i = 0; i < arraysize(kValues); ++i) { | 5109 for (size_t i = 0; i < arraysize(kValues); ++i) { |
5110 input = kValues[i]; | 5110 input = kValues[i]; |
5111 CHECK_EQ(0, m.Call()); | 5111 CHECK_EQ(0, m.Call()); |
5112 double expected = std::ceil(kValues[i]); | 5112 double expected = std::ceil(kValues[i]); |
5113 CHECK_EQ(expected, result); | 5113 CHECK_EQ(expected, result); |
5114 } | 5114 } |
5115 } | 5115 } |
5116 | 5116 |
5117 | 5117 |
5118 TEST(RunFloat64RoundTruncate) { | 5118 TEST(RunFloat64RoundTruncate) { |
5119 double input = -1.0; | 5119 double input = -1.0; |
5120 double result = 0.0; | 5120 double result = 0.0; |
5121 RawMachineAssemblerTester<int32_t> m; | 5121 RawMachineAssemblerTester<int32_t> m; |
5122 if (!m.machine()->HasFloat64RoundTruncate()) return; | 5122 if (!m.machine()->Float64RoundTruncate().supported()) return; |
5123 m.StoreToPointer( | 5123 m.StoreToPointer( |
5124 &result, kMachFloat64, | 5124 &result, kMachFloat64, |
5125 m.Float64RoundTruncate(m.LoadFromPointer(&input, kMachFloat64))); | 5125 m.Float64RoundTruncate(m.LoadFromPointer(&input, kMachFloat64))); |
5126 m.Return(m.Int32Constant(0)); | 5126 m.Return(m.Int32Constant(0)); |
5127 for (size_t i = 0; i < arraysize(kValues); ++i) { | 5127 for (size_t i = 0; i < arraysize(kValues); ++i) { |
5128 input = kValues[i]; | 5128 input = kValues[i]; |
5129 CHECK_EQ(0, m.Call()); | 5129 CHECK_EQ(0, m.Call()); |
5130 double expected = trunc(kValues[i]); | 5130 double expected = trunc(kValues[i]); |
5131 CHECK_EQ(expected, result); | 5131 CHECK_EQ(expected, result); |
5132 } | 5132 } |
5133 } | 5133 } |
5134 | 5134 |
5135 | 5135 |
5136 TEST(RunFloat64RoundTiesAway) { | 5136 TEST(RunFloat64RoundTiesAway) { |
5137 double input = -1.0; | 5137 double input = -1.0; |
5138 double result = 0.0; | 5138 double result = 0.0; |
5139 RawMachineAssemblerTester<int32_t> m; | 5139 RawMachineAssemblerTester<int32_t> m; |
5140 if (!m.machine()->HasFloat64RoundTiesAway()) return; | 5140 if (!m.machine()->Float64RoundTiesAway().supported()) return; |
5141 m.StoreToPointer( | 5141 m.StoreToPointer( |
5142 &result, kMachFloat64, | 5142 &result, kMachFloat64, |
5143 m.Float64RoundTiesAway(m.LoadFromPointer(&input, kMachFloat64))); | 5143 m.Float64RoundTiesAway(m.LoadFromPointer(&input, kMachFloat64))); |
5144 m.Return(m.Int32Constant(0)); | 5144 m.Return(m.Int32Constant(0)); |
5145 for (size_t i = 0; i < arraysize(kValues); ++i) { | 5145 for (size_t i = 0; i < arraysize(kValues); ++i) { |
5146 input = kValues[i]; | 5146 input = kValues[i]; |
5147 CHECK_EQ(0, m.Call()); | 5147 CHECK_EQ(0, m.Call()); |
5148 double expected = round(kValues[i]); | 5148 double expected = round(kValues[i]); |
5149 CHECK_EQ(expected, result); | 5149 CHECK_EQ(expected, result); |
5150 } | 5150 } |
5151 } | 5151 } |
5152 | 5152 |
5153 #endif // V8_TURBOFAN_TARGET | 5153 #endif // V8_TURBOFAN_TARGET |
OLD | NEW |