| 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 <functional> | 5 #include <functional> |
| 6 #include <limits> | 6 #include <limits> |
| 7 | 7 |
| 8 #include "src/base/bits.h" | 8 #include "src/base/bits.h" |
| 9 #include "src/compiler/generic-node-inl.h" | 9 #include "src/compiler/generic-node-inl.h" |
| 10 #include "test/cctest/cctest.h" | 10 #include "test/cctest/cctest.h" |
| (...skipping 3549 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3560 Node* i6 = m.Int32Add(i3, i4); | 3560 Node* i6 = m.Int32Add(i3, i4); |
| 3561 | 3561 |
| 3562 Node* i7 = m.Int32Add(i5, i6); | 3562 Node* i7 = m.Int32Add(i5, i6); |
| 3563 | 3563 |
| 3564 m.Return(i7); | 3564 m.Return(i7); |
| 3565 | 3565 |
| 3566 CHECK_EQ(116, m.Call()); | 3566 CHECK_EQ(116, m.Call()); |
| 3567 } | 3567 } |
| 3568 | 3568 |
| 3569 | 3569 |
| 3570 #if MACHINE_ASSEMBLER_SUPPORTS_CALL_C | |
| 3571 | |
| 3572 static int Seven() { return 7; } | |
| 3573 static int UnaryMinus(int a) { return -a; } | |
| 3574 static int APlusTwoB(int a, int b) { return a + 2 * b; } | |
| 3575 | |
| 3576 | |
| 3577 TEST(RunCallSeven) { | |
| 3578 for (int i = 0; i < 2; i++) { | |
| 3579 bool call_direct = i == 0; | |
| 3580 void* function_address = | |
| 3581 reinterpret_cast<void*>(reinterpret_cast<intptr_t>(&Seven)); | |
| 3582 | |
| 3583 RawMachineAssemblerTester<int32_t> m; | |
| 3584 Node** args = NULL; | |
| 3585 MachineType* arg_types = NULL; | |
| 3586 Node* function = call_direct | |
| 3587 ? m.PointerConstant(function_address) | |
| 3588 : m.LoadFromPointer(&function_address, kMachPtr); | |
| 3589 m.Return(m.CallC(function, kMachInt32, arg_types, args, 0)); | |
| 3590 | |
| 3591 CHECK_EQ(7, m.Call()); | |
| 3592 } | |
| 3593 } | |
| 3594 | |
| 3595 | |
| 3596 TEST(RunCallUnaryMinus) { | |
| 3597 for (int i = 0; i < 2; i++) { | |
| 3598 bool call_direct = i == 0; | |
| 3599 void* function_address = | |
| 3600 reinterpret_cast<void*>(reinterpret_cast<intptr_t>(&UnaryMinus)); | |
| 3601 | |
| 3602 RawMachineAssemblerTester<int32_t> m(kMachInt32); | |
| 3603 Node* args[] = {m.Parameter(0)}; | |
| 3604 MachineType arg_types[] = {kMachInt32}; | |
| 3605 Node* function = call_direct | |
| 3606 ? m.PointerConstant(function_address) | |
| 3607 : m.LoadFromPointer(&function_address, kMachPtr); | |
| 3608 m.Return(m.CallC(function, kMachInt32, arg_types, args, 1)); | |
| 3609 | |
| 3610 FOR_INT32_INPUTS(i) { | |
| 3611 int a = *i; | |
| 3612 CHECK_EQ(-a, m.Call(a)); | |
| 3613 } | |
| 3614 } | |
| 3615 } | |
| 3616 | |
| 3617 | |
| 3618 TEST(RunCallAPlusTwoB) { | |
| 3619 for (int i = 0; i < 2; i++) { | |
| 3620 bool call_direct = i == 0; | |
| 3621 void* function_address = | |
| 3622 reinterpret_cast<void*>(reinterpret_cast<intptr_t>(&APlusTwoB)); | |
| 3623 | |
| 3624 RawMachineAssemblerTester<int32_t> m(kMachInt32, kMachInt32); | |
| 3625 Node* args[] = {m.Parameter(0), m.Parameter(1)}; | |
| 3626 MachineType arg_types[] = {kMachInt32, kMachInt32}; | |
| 3627 Node* function = call_direct | |
| 3628 ? m.PointerConstant(function_address) | |
| 3629 : m.LoadFromPointer(&function_address, kMachPtr); | |
| 3630 m.Return(m.CallC(function, kMachInt32, arg_types, args, 2)); | |
| 3631 | |
| 3632 FOR_INT32_INPUTS(i) { | |
| 3633 FOR_INT32_INPUTS(j) { | |
| 3634 int a = *i; | |
| 3635 int b = *j; | |
| 3636 int result = m.Call(a, b); | |
| 3637 CHECK_EQ(a + 2 * b, result); | |
| 3638 } | |
| 3639 } | |
| 3640 } | |
| 3641 } | |
| 3642 | |
| 3643 #endif // MACHINE_ASSEMBLER_SUPPORTS_CALL_C | |
| 3644 | |
| 3645 | |
| 3646 static const int kFloat64CompareHelperTestCases = 15; | 3570 static const int kFloat64CompareHelperTestCases = 15; |
| 3647 static const int kFloat64CompareHelperNodeType = 4; | 3571 static const int kFloat64CompareHelperNodeType = 4; |
| 3648 | 3572 |
| 3649 static int Float64CompareHelper(RawMachineAssemblerTester<int32_t>* m, | 3573 static int Float64CompareHelper(RawMachineAssemblerTester<int32_t>* m, |
| 3650 int test_case, int node_type, double x, | 3574 int test_case, int node_type, double x, |
| 3651 double y) { | 3575 double y) { |
| 3652 static double buffer[2]; | 3576 static double buffer[2]; |
| 3653 buffer[0] = x; | 3577 buffer[0] = x; |
| 3654 buffer[1] = y; | 3578 buffer[1] = y; |
| 3655 CHECK(0 <= test_case && test_case < kFloat64CompareHelperTestCases); | 3579 CHECK(0 <= test_case && test_case < kFloat64CompareHelperTestCases); |
| (...skipping 367 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4023 | 3947 |
| 4024 m.Bind(&end); | 3948 m.Bind(&end); |
| 4025 Node* phi = m.Phi(kMachAnyTagged, true_node, false_node); | 3949 Node* phi = m.Phi(kMachAnyTagged, true_node, false_node); |
| 4026 m.Return(phi); | 3950 m.Return(phi); |
| 4027 | 3951 |
| 4028 CHECK_EQ(*false_val, m.Call(0)); | 3952 CHECK_EQ(*false_val, m.Call(0)); |
| 4029 CHECK_EQ(*true_val, m.Call(1)); | 3953 CHECK_EQ(*true_val, m.Call(1)); |
| 4030 } | 3954 } |
| 4031 | 3955 |
| 4032 | 3956 |
| 4033 #if MACHINE_ASSEMBLER_SUPPORTS_CALL_C | |
| 4034 | |
| 4035 TEST(RunSpillLotsOfThingsWithCall) { | |
| 4036 static const int kInputSize = 1000; | |
| 4037 RawMachineAssemblerTester<void> m; | |
| 4038 Node* accs[kInputSize]; | |
| 4039 int32_t outputs[kInputSize]; | |
| 4040 Node* one = m.Int32Constant(1); | |
| 4041 Node* acc = one; | |
| 4042 for (int i = 0; i < kInputSize; i++) { | |
| 4043 acc = m.Int32Add(acc, one); | |
| 4044 accs[i] = acc; | |
| 4045 } | |
| 4046 // If the spill slot computation is wrong, it might load from the c frame | |
| 4047 { | |
| 4048 void* func = reinterpret_cast<void*>(reinterpret_cast<intptr_t>(&Seven)); | |
| 4049 Node** args = NULL; | |
| 4050 MachineType* arg_types = NULL; | |
| 4051 m.CallC(m.PointerConstant(func), kMachInt32, arg_types, args, 0); | |
| 4052 } | |
| 4053 for (int i = 0; i < kInputSize; i++) { | |
| 4054 m.StoreToPointer(&outputs[i], kMachInt32, accs[i]); | |
| 4055 } | |
| 4056 m.Return(one); | |
| 4057 m.Call(); | |
| 4058 for (int i = 0; i < kInputSize; i++) { | |
| 4059 CHECK_EQ(outputs[i], i + 2); | |
| 4060 } | |
| 4061 } | |
| 4062 | |
| 4063 #endif // MACHINE_ASSEMBLER_SUPPORTS_CALL_C | |
| 4064 | |
| 4065 | |
| 4066 TEST(RunInt32AddWithOverflowP) { | 3957 TEST(RunInt32AddWithOverflowP) { |
| 4067 int32_t actual_val = -1; | 3958 int32_t actual_val = -1; |
| 4068 RawMachineAssemblerTester<int32_t> m; | 3959 RawMachineAssemblerTester<int32_t> m; |
| 4069 Int32BinopTester bt(&m); | 3960 Int32BinopTester bt(&m); |
| 4070 Node* add = m.Int32AddWithOverflow(bt.param0, bt.param1); | 3961 Node* add = m.Int32AddWithOverflow(bt.param0, bt.param1); |
| 4071 Node* val = m.Projection(0, add); | 3962 Node* val = m.Projection(0, add); |
| 4072 Node* ovf = m.Projection(1, add); | 3963 Node* ovf = m.Projection(1, add); |
| 4073 m.StoreToPointer(&actual_val, kMachInt32, val); | 3964 m.StoreToPointer(&actual_val, kMachInt32, val); |
| 4074 bt.AddReturn(ovf); | 3965 bt.AddReturn(ovf); |
| 4075 FOR_INT32_INPUTS(i) { | 3966 FOR_INT32_INPUTS(i) { |
| (...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4345 RawMachineAssemblerTester<int32_t> m; | 4236 RawMachineAssemblerTester<int32_t> m; |
| 4346 m.Return(m.TruncateFloat64ToInt32(m.LoadFromPointer(&input, kMachFloat64))); | 4237 m.Return(m.TruncateFloat64ToInt32(m.LoadFromPointer(&input, kMachFloat64))); |
| 4347 for (size_t i = 0; i < arraysize(kValues); ++i) { | 4238 for (size_t i = 0; i < arraysize(kValues); ++i) { |
| 4348 input = kValues[i].from; | 4239 input = kValues[i].from; |
| 4349 uint64_t expected = static_cast<int64_t>(kValues[i].raw); | 4240 uint64_t expected = static_cast<int64_t>(kValues[i].raw); |
| 4350 CHECK_EQ(static_cast<int>(expected), m.Call()); | 4241 CHECK_EQ(static_cast<int>(expected), m.Call()); |
| 4351 } | 4242 } |
| 4352 } | 4243 } |
| 4353 | 4244 |
| 4354 #endif // V8_TURBOFAN_TARGET | 4245 #endif // V8_TURBOFAN_TARGET |
| OLD | NEW |