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 5635 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5646 MachineType::Int32(), MachineType::Int32(), MachineType::Int32(), | 5646 MachineType::Int32(), MachineType::Int32(), MachineType::Int32(), |
5647 MachineType::Int32(), MachineType::Int32(), MachineType::Int32(), | 5647 MachineType::Int32(), MachineType::Int32(), MachineType::Int32(), |
5648 function, param, param, param, param, param, param, param, param)); | 5648 function, param, param, param, param, param, param, param, param)); |
5649 FOR_INT32_INPUTS(i) { | 5649 FOR_INT32_INPUTS(i) { |
5650 int32_t const x = *i; | 5650 int32_t const x = *i; |
5651 CHECK_EQ(x * 8, m.Call(x)); | 5651 CHECK_EQ(x * 8, m.Call(x)); |
5652 } | 5652 } |
5653 } | 5653 } |
5654 #endif // USE_SIMULATOR | 5654 #endif // USE_SIMULATOR |
5655 | 5655 |
5656 template <typename T> | |
5657 void TestExternalReferenceFunction( | |
5658 BufferedRawMachineAssemblerTester<int32_t>* m, ExternalReference ref, | |
5659 T (*comparison)(T)) { | |
5660 T parameter; | |
5661 | |
5662 Node* function = m->ExternalConstant(ref); | |
5663 m->CallCFunction1(MachineType::Pointer(), MachineType::Pointer(), function, | |
5664 m->PointerConstant(¶meter)); | |
5665 m->Return(m->Int32Constant(4356)); | |
5666 FOR_FLOAT64_INPUTS(i) { | |
5667 parameter = *i; | |
5668 m->Call(); | |
5669 CheckDoubleEq(comparison(*i), parameter); | |
5670 } | |
5671 } | |
5672 | |
5673 TEST(RunCallExternalReferenceF32Trunc) { | |
5674 BufferedRawMachineAssemblerTester<int32_t> m; | |
5675 ExternalReference ref = | |
5676 ExternalReference::f32_trunc_wrapper_function(m.isolate()); | |
5677 TestExternalReferenceFunction<float>(&m, ref, truncf); | |
5678 } | |
5679 | |
5680 TEST(RunCallExternalReferenceF32Floor) { | |
5681 BufferedRawMachineAssemblerTester<int32_t> m; | |
5682 ExternalReference ref = | |
5683 ExternalReference::f32_floor_wrapper_function(m.isolate()); | |
5684 TestExternalReferenceFunction<float>(&m, ref, floorf); | |
5685 } | |
5686 | |
5687 TEST(RunCallExternalReferenceF32Ceil) { | |
5688 BufferedRawMachineAssemblerTester<int32_t> m; | |
5689 ExternalReference ref = | |
5690 ExternalReference::f32_ceil_wrapper_function(m.isolate()); | |
5691 TestExternalReferenceFunction<float>(&m, ref, ceilf); | |
5692 } | |
5693 | |
5694 TEST(RunCallExternalReferenceF32RoundTiesEven) { | |
5695 BufferedRawMachineAssemblerTester<int32_t> m; | |
5696 ExternalReference ref = | |
5697 ExternalReference::f32_nearest_int_wrapper_function(m.isolate()); | |
5698 TestExternalReferenceFunction<float>(&m, ref, nearbyintf); | |
5699 } | |
5700 | |
5701 TEST(RunCallExternalReferenceF64Trunc) { | |
5702 BufferedRawMachineAssemblerTester<int32_t> m; | |
5703 ExternalReference ref = | |
5704 ExternalReference::f64_trunc_wrapper_function(m.isolate()); | |
5705 TestExternalReferenceFunction<double>(&m, ref, trunc); | |
5706 } | |
5707 | |
5708 TEST(RunCallExternalReferenceF64Floor) { | |
5709 BufferedRawMachineAssemblerTester<int32_t> m; | |
5710 ExternalReference ref = | |
5711 ExternalReference::f64_floor_wrapper_function(m.isolate()); | |
5712 TestExternalReferenceFunction<double>(&m, ref, floor); | |
5713 } | |
5714 | |
5715 TEST(RunCallExternalReferenceF64Ceil) { | |
5716 BufferedRawMachineAssemblerTester<int32_t> m; | |
5717 ExternalReference ref = | |
5718 ExternalReference::f64_ceil_wrapper_function(m.isolate()); | |
5719 TestExternalReferenceFunction<double>(&m, ref, ceil); | |
5720 } | |
5721 | |
5722 TEST(RunCallExternalReferenceF64RoundTiesEven) { | |
5723 BufferedRawMachineAssemblerTester<int32_t> m; | |
5724 ExternalReference ref = | |
5725 ExternalReference::f64_nearest_int_wrapper_function(m.isolate()); | |
5726 TestExternalReferenceFunction<double>(&m, ref, nearbyint); | |
5727 } | |
5728 | 5656 |
5729 #if V8_TARGET_ARCH_64_BIT | 5657 #if V8_TARGET_ARCH_64_BIT |
5730 // TODO(titzer): run int64 tests on all platforms when supported. | 5658 // TODO(titzer): run int64 tests on all platforms when supported. |
5731 TEST(RunCheckedLoadInt64) { | 5659 TEST(RunCheckedLoadInt64) { |
5732 int64_t buffer[] = {0x66bbccddeeff0011LL, 0x1122334455667788LL}; | 5660 int64_t buffer[] = {0x66bbccddeeff0011LL, 0x1122334455667788LL}; |
5733 RawMachineAssemblerTester<int64_t> m(MachineType::Int32()); | 5661 RawMachineAssemblerTester<int64_t> m(MachineType::Int32()); |
5734 Node* base = m.PointerConstant(buffer); | 5662 Node* base = m.PointerConstant(buffer); |
5735 Node* index = m.Parameter(0); | 5663 Node* index = m.Parameter(0); |
5736 Node* length = m.Int32Constant(16); | 5664 Node* length = m.Int32Constant(16); |
5737 Node* load = m.AddNode(m.machine()->CheckedLoad(MachineType::Int64()), base, | 5665 Node* load = m.AddNode(m.machine()->CheckedLoad(MachineType::Int64()), base, |
(...skipping 377 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6115 {0x3ff, 0x447fc000}, | 6043 {0x3ff, 0x447fc000}, |
6116 {0x1ff, 0x43ff8000}, | 6044 {0x1ff, 0x43ff8000}, |
6117 {0x3fffffffffff, 0x56800000}, | 6045 {0x3fffffffffff, 0x56800000}, |
6118 {0x1fffffffffff, 0x56000000}, | 6046 {0x1fffffffffff, 0x56000000}, |
6119 {0xfffffffffff, 0x55800000}, | 6047 {0xfffffffffff, 0x55800000}, |
6120 {0x7ffffffffff, 0x55000000}, | 6048 {0x7ffffffffff, 0x55000000}, |
6121 {0x3ffffffffff, 0x54800000}, | 6049 {0x3ffffffffff, 0x54800000}, |
6122 {0x1ffffffffff, 0x54000000}, | 6050 {0x1ffffffffff, 0x54000000}, |
6123 {0x8000008000000000, 0x5f000000}, | 6051 {0x8000008000000000, 0x5f000000}, |
6124 {0x8000008000000001, 0x5f000001}, | 6052 {0x8000008000000001, 0x5f000001}, |
| 6053 {0x8000008000000002, 0x5f000001}, |
| 6054 {0x8000008000000004, 0x5f000001}, |
| 6055 {0x8000008000000008, 0x5f000001}, |
| 6056 {0x8000008000000010, 0x5f000001}, |
| 6057 {0x8000008000000020, 0x5f000001}, |
| 6058 {0x8000008000000040, 0x5f000001}, |
| 6059 {0x8000008000000080, 0x5f000001}, |
| 6060 {0x8000008000000100, 0x5f000001}, |
6125 {0x8000000000000400, 0x5f000000}, | 6061 {0x8000000000000400, 0x5f000000}, |
6126 {0x8000000000000401, 0x5f000000}}; | 6062 {0x8000000000000401, 0x5f000000}}; |
6127 | 6063 |
6128 BufferedRawMachineAssemblerTester<float> m(MachineType::Uint64()); | 6064 BufferedRawMachineAssemblerTester<float> m(MachineType::Uint64()); |
6129 m.Return(m.RoundUint64ToFloat32(m.Parameter(0))); | 6065 m.Return(m.RoundUint64ToFloat32(m.Parameter(0))); |
6130 | 6066 |
6131 for (size_t i = 0; i < arraysize(values); i++) { | 6067 for (size_t i = 0; i < arraysize(values); i++) { |
6132 CHECK_EQ(bit_cast<float>(values[i].expected), m.Call(values[i].input)); | 6068 CHECK_EQ(bit_cast<float>(values[i].expected), m.Call(values[i].input)); |
6133 } | 6069 } |
6134 } | 6070 } |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6254 r.Goto(&merge); | 6190 r.Goto(&merge); |
6255 r.Bind(&merge); | 6191 r.Bind(&merge); |
6256 Node* phi = r.Phi(MachineRepresentation::kWord32, fa, fb); | 6192 Node* phi = r.Phi(MachineRepresentation::kWord32, fa, fb); |
6257 r.Return(phi); | 6193 r.Return(phi); |
6258 CHECK_EQ(1, r.Call(1)); | 6194 CHECK_EQ(1, r.Call(1)); |
6259 } | 6195 } |
6260 | 6196 |
6261 } // namespace compiler | 6197 } // namespace compiler |
6262 } // namespace internal | 6198 } // namespace internal |
6263 } // namespace v8 | 6199 } // namespace v8 |
OLD | NEW |