| 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 |