| 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 5511 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 5522       CHECK_EQ(static_cast<int64_t>(*i), m.Call(*i)); | 5522       CHECK_EQ(static_cast<int64_t>(*i), m.Call(*i)); | 
| 5523       CHECK_NE(0, success); | 5523       CHECK_NE(0, success); | 
| 5524     } else { | 5524     } else { | 
| 5525       m.Call(*i); | 5525       m.Call(*i); | 
| 5526       CHECK_EQ(0, success); | 5526       CHECK_EQ(0, success); | 
| 5527     } | 5527     } | 
| 5528   } | 5528   } | 
| 5529 } | 5529 } | 
| 5530 | 5530 | 
| 5531 | 5531 | 
| 5532 TEST(RunTruncateFloat32ToUint64) { | 5532 TEST(RunTryTruncateFloat32ToUint64WithoutCheck) { | 
| 5533   BufferedRawMachineAssemblerTester<uint64_t> m(MachineType::Float32()); | 5533   BufferedRawMachineAssemblerTester<uint64_t> m(MachineType::Float32()); | 
| 5534   m.Return(m.TryTruncateFloat32ToUint64(m.Parameter(0))); | 5534   m.Return(m.TryTruncateFloat32ToUint64(m.Parameter(0))); | 
| 5535 | 5535 | 
| 5536   FOR_UINT64_INPUTS(i) { | 5536   FOR_UINT64_INPUTS(i) { | 
| 5537     float input = static_cast<float>(*i); | 5537     float input = static_cast<float>(*i); | 
| 5538     if (input < 18446744073709551616.0) { | 5538     // This condition on 'input' is required because | 
|  | 5539     // static_cast<float>(UINT64_MAX) results in a value outside uint64 range. | 
|  | 5540     if (input < static_cast<float>(UINT64_MAX)) { | 
| 5539       CHECK_EQ(static_cast<uint64_t>(input), m.Call(input)); | 5541       CHECK_EQ(static_cast<uint64_t>(input), m.Call(input)); | 
| 5540     } | 5542     } | 
| 5541   } | 5543   } | 
| 5542   FOR_FLOAT32_INPUTS(j) { |  | 
| 5543     if (*j < 18446744073709551616.0 && *j >= 0) { |  | 
| 5544       CHECK_EQ(static_cast<uint64_t>(*j), m.Call(*j)); |  | 
| 5545     } |  | 
| 5546   } |  | 
| 5547 } | 5544 } | 
| 5548 | 5545 | 
| 5549 | 5546 | 
| 5550 TEST(RunTryTruncateFloat32ToUint64WithCheck) { | 5547 TEST(RunTryTruncateFloat32ToUint64WithCheck) { | 
| 5551   int64_t success = 0; | 5548   int64_t success = 0; | 
| 5552   BufferedRawMachineAssemblerTester<uint64_t> m(MachineType::Float32()); | 5549   BufferedRawMachineAssemblerTester<uint64_t> m(MachineType::Float32()); | 
| 5553   Node* trunc = m.TryTruncateFloat32ToUint64(m.Parameter(0)); | 5550   Node* trunc = m.TryTruncateFloat32ToUint64(m.Parameter(0)); | 
| 5554   Node* val = m.Projection(0, trunc); | 5551   Node* val = m.Projection(0, trunc); | 
| 5555   Node* check = m.Projection(1, trunc); | 5552   Node* check = m.Projection(1, trunc); | 
| 5556   m.StoreToPointer(&success, MachineRepresentation::kWord64, check); | 5553   m.StoreToPointer(&success, MachineRepresentation::kWord64, check); | 
| 5557   m.Return(val); | 5554   m.Return(val); | 
| 5558 | 5555 | 
| 5559   FOR_FLOAT32_INPUTS(i) { | 5556   FOR_FLOAT32_INPUTS(i) { | 
| 5560     if (*i < 18446744073709551616.0 && *i >= 0.0) { | 5557     if (*i < static_cast<float>(UINT64_MAX) && *i > -1.0) { | 
| 5561       // Conversions within this range should succeed. | 5558       // Conversions within this range should succeed. | 
| 5562       CHECK_EQ(static_cast<uint64_t>(*i), m.Call(*i)); | 5559       CHECK_EQ(static_cast<uint64_t>(*i), m.Call(*i)); | 
| 5563       CHECK_NE(0, success); | 5560       CHECK_NE(0, success); | 
| 5564     } else { | 5561     } else { | 
| 5565       m.Call(*i); | 5562       m.Call(*i); | 
| 5566       CHECK_EQ(0, success); | 5563       CHECK_EQ(0, success); | 
| 5567     } | 5564     } | 
| 5568   } | 5565   } | 
| 5569 } | 5566 } | 
| 5570 | 5567 | 
| 5571 | 5568 | 
| 5572 TEST(RunTryTruncateFloat64ToUint64WithoutCheck) { | 5569 TEST(RunTryTruncateFloat64ToUint64WithoutCheck) { | 
| 5573   BufferedRawMachineAssemblerTester<uint64_t> m(MachineType::Float64()); | 5570   BufferedRawMachineAssemblerTester<uint64_t> m(MachineType::Float64()); | 
| 5574   m.Return(m.TruncateFloat64ToUint64(m.Parameter(0))); | 5571   m.Return(m.TruncateFloat64ToUint64(m.Parameter(0))); | 
| 5575 | 5572 | 
| 5576   FOR_UINT64_INPUTS(j) { | 5573   FOR_UINT64_INPUTS(j) { | 
| 5577     double input = static_cast<double>(*j); | 5574     double input = static_cast<double>(*j); | 
| 5578 | 5575 | 
| 5579     if (input < 18446744073709551616.0) { | 5576     if (input < static_cast<float>(UINT64_MAX)) { | 
| 5580       CHECK_EQ(static_cast<uint64_t>(input), m.Call(input)); | 5577       CHECK_EQ(static_cast<uint64_t>(input), m.Call(input)); | 
| 5581     } | 5578     } | 
| 5582   } | 5579   } | 
| 5583 } | 5580 } | 
| 5584 | 5581 | 
| 5585 | 5582 | 
| 5586 TEST(RunTryTruncateFloat64ToUint64WithCheck) { | 5583 TEST(RunTryTruncateFloat64ToUint64WithCheck) { | 
| 5587   int64_t success = 0; | 5584   int64_t success = 0; | 
| 5588   BufferedRawMachineAssemblerTester<int64_t> m(MachineType::Float64()); | 5585   BufferedRawMachineAssemblerTester<int64_t> m(MachineType::Float64()); | 
| 5589   Node* trunc = m.TryTruncateFloat64ToUint64(m.Parameter(0)); | 5586   Node* trunc = m.TryTruncateFloat64ToUint64(m.Parameter(0)); | 
| 5590   Node* val = m.Projection(0, trunc); | 5587   Node* val = m.Projection(0, trunc); | 
| 5591   Node* check = m.Projection(1, trunc); | 5588   Node* check = m.Projection(1, trunc); | 
| 5592   m.StoreToPointer(&success, MachineRepresentation::kWord64, check); | 5589   m.StoreToPointer(&success, MachineRepresentation::kWord64, check); | 
| 5593   m.Return(val); | 5590   m.Return(val); | 
| 5594 | 5591 | 
| 5595   FOR_FLOAT64_INPUTS(i) { | 5592   FOR_FLOAT64_INPUTS(i) { | 
| 5596     if (*i < 18446744073709551616.0 && *i >= 0) { | 5593     if (*i < 18446744073709551616.0 && *i > -1) { | 
| 5597       // Conversions within this range should succeed. | 5594       // Conversions within this range should succeed. | 
| 5598       CHECK_EQ(static_cast<uint64_t>(*i), m.Call(*i)); | 5595       CHECK_EQ(static_cast<uint64_t>(*i), m.Call(*i)); | 
| 5599       CHECK_NE(0, success); | 5596       CHECK_NE(0, success); | 
| 5600     } else { | 5597     } else { | 
| 5601       m.Call(*i); | 5598       m.Call(*i); | 
| 5602       CHECK_EQ(0, success); | 5599       CHECK_EQ(0, success); | 
| 5603     } | 5600     } | 
| 5604   } | 5601   } | 
| 5605 } | 5602 } | 
| 5606 | 5603 | 
| (...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 5877   Node* call = r.AddNode(r.common()->Call(desc), phi); | 5874   Node* call = r.AddNode(r.common()->Call(desc), phi); | 
| 5878   r.Return(call); | 5875   r.Return(call); | 
| 5879 | 5876 | 
| 5880   CHECK_EQ(33, r.Call(1)); | 5877   CHECK_EQ(33, r.Call(1)); | 
| 5881   CHECK_EQ(44, r.Call(0)); | 5878   CHECK_EQ(44, r.Call(0)); | 
| 5882 } | 5879 } | 
| 5883 | 5880 | 
| 5884 }  // namespace compiler | 5881 }  // namespace compiler | 
| 5885 }  // namespace internal | 5882 }  // namespace internal | 
| 5886 }  // namespace v8 | 5883 }  // namespace v8 | 
| OLD | NEW | 
|---|