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 5509 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5520 } else { | 5520 } else { |
5521 m.Call(*i); | 5521 m.Call(*i); |
5522 CHECK_EQ(0, success); | 5522 CHECK_EQ(0, success); |
5523 } | 5523 } |
5524 } | 5524 } |
5525 } | 5525 } |
5526 | 5526 |
5527 | 5527 |
5528 TEST(RunTruncateFloat32ToUint64) { | 5528 TEST(RunTruncateFloat32ToUint64) { |
5529 BufferedRawMachineAssemblerTester<uint64_t> m(MachineType::Float32()); | 5529 BufferedRawMachineAssemblerTester<uint64_t> m(MachineType::Float32()); |
5530 m.Return(m.TruncateFloat32ToUint64(m.Parameter(0))); | 5530 m.Return(m.TryTruncateFloat32ToUint64(m.Parameter(0))); |
5531 | 5531 |
5532 FOR_UINT64_INPUTS(i) { | 5532 FOR_UINT64_INPUTS(i) { |
5533 float input = static_cast<float>(*i); | 5533 float input = static_cast<float>(*i); |
5534 if (input < 18446744073709551616.0) { | 5534 if (input < 18446744073709551616.0) { |
5535 CHECK_EQ(static_cast<uint64_t>(input), m.Call(input)); | 5535 CHECK_EQ(static_cast<uint64_t>(input), m.Call(input)); |
5536 } | 5536 } |
5537 } | 5537 } |
5538 FOR_FLOAT32_INPUTS(j) { | 5538 FOR_FLOAT32_INPUTS(j) { |
5539 if (*j < 18446744073709551616.0 && *j >= 0) { | 5539 if (*j < 18446744073709551616.0 && *j >= 0) { |
5540 CHECK_EQ(static_cast<uint64_t>(*j), m.Call(*j)); | 5540 CHECK_EQ(static_cast<uint64_t>(*j), m.Call(*j)); |
5541 } | 5541 } |
5542 } | 5542 } |
5543 } | 5543 } |
5544 | 5544 |
5545 | 5545 |
| 5546 TEST(RunTryTruncateFloat32ToUint64WithCheck) { |
| 5547 int64_t success = 0; |
| 5548 BufferedRawMachineAssemblerTester<uint64_t> m(MachineType::Float32()); |
| 5549 Node* trunc = m.TryTruncateFloat32ToUint64(m.Parameter(0)); |
| 5550 Node* val = m.Projection(0, trunc); |
| 5551 Node* check = m.Projection(1, trunc); |
| 5552 m.StoreToPointer(&success, MachineType::Int64(), check); |
| 5553 m.Return(val); |
| 5554 |
| 5555 FOR_FLOAT32_INPUTS(i) { |
| 5556 if (*i < 18446744073709551616.0 && *i >= 0.0) { |
| 5557 // Conversions within this range should succeed. |
| 5558 CHECK_EQ(static_cast<uint64_t>(*i), m.Call(*i)); |
| 5559 CHECK_NE(0, success); |
| 5560 } else { |
| 5561 m.Call(*i); |
| 5562 CHECK_EQ(0, success); |
| 5563 } |
| 5564 } |
| 5565 } |
| 5566 |
| 5567 |
5546 TEST(RunTryTruncateFloat64ToUint64WithoutCheck) { | 5568 TEST(RunTryTruncateFloat64ToUint64WithoutCheck) { |
5547 BufferedRawMachineAssemblerTester<uint64_t> m(MachineType::Float64()); | 5569 BufferedRawMachineAssemblerTester<uint64_t> m(MachineType::Float64()); |
5548 m.Return(m.TruncateFloat64ToUint64(m.Parameter(0))); | 5570 m.Return(m.TruncateFloat64ToUint64(m.Parameter(0))); |
5549 | 5571 |
5550 FOR_UINT64_INPUTS(j) { | 5572 FOR_UINT64_INPUTS(j) { |
5551 double input = static_cast<double>(*j); | 5573 double input = static_cast<double>(*j); |
5552 | 5574 |
5553 if (input < 18446744073709551616.0) { | 5575 if (input < 18446744073709551616.0) { |
5554 CHECK_EQ(static_cast<uint64_t>(input), m.Call(input)); | 5576 CHECK_EQ(static_cast<uint64_t>(input), m.Call(input)); |
5555 } | 5577 } |
(...skipping 295 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5851 Node* call = r.AddNode(r.common()->Call(desc), phi); | 5873 Node* call = r.AddNode(r.common()->Call(desc), phi); |
5852 r.Return(call); | 5874 r.Return(call); |
5853 | 5875 |
5854 CHECK_EQ(33, r.Call(1)); | 5876 CHECK_EQ(33, r.Call(1)); |
5855 CHECK_EQ(44, r.Call(0)); | 5877 CHECK_EQ(44, r.Call(0)); |
5856 } | 5878 } |
5857 | 5879 |
5858 } // namespace compiler | 5880 } // namespace compiler |
5859 } // namespace internal | 5881 } // namespace internal |
5860 } // namespace v8 | 5882 } // namespace v8 |
OLD | NEW |