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 "test/cctest/cctest.h" | 9 #include "test/cctest/cctest.h" |
9 #include "test/cctest/compiler/codegen-tester.h" | 10 #include "test/cctest/compiler/codegen-tester.h" |
10 #include "test/cctest/compiler/value-helper.h" | 11 #include "test/cctest/compiler/value-helper.h" |
11 | 12 |
12 #if V8_TURBOFAN_TARGET | 13 #if V8_TURBOFAN_TARGET |
13 | 14 |
| 15 using namespace v8::base; |
14 using namespace v8::internal; | 16 using namespace v8::internal; |
15 using namespace v8::internal::compiler; | 17 using namespace v8::internal::compiler; |
16 | 18 |
17 typedef RawMachineAssembler::Label MLabel; | 19 typedef RawMachineAssembler::Label MLabel; |
18 | 20 |
19 TEST(RunInt32Add) { | 21 TEST(RunInt32Add) { |
20 RawMachineAssemblerTester<int32_t> m; | 22 RawMachineAssemblerTester<int32_t> m; |
21 Node* add = m.Int32Add(m.Int32Constant(0), m.Int32Constant(1)); | 23 Node* add = m.Int32Add(m.Int32Constant(0), m.Int32Constant(1)); |
22 m.Return(add); | 24 m.Return(add); |
23 CHECK_EQ(1, m.Call()); | 25 CHECK_EQ(1, m.Call()); |
(...skipping 2251 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2275 FOR_INT32_SHIFTS(shift) { | 2277 FOR_INT32_SHIFTS(shift) { |
2276 int32_t expected = *i >> shift; | 2278 int32_t expected = *i >> shift; |
2277 CHECK_EQ(expected, bt.call(*i, shift)); | 2279 CHECK_EQ(expected, bt.call(*i, shift)); |
2278 } | 2280 } |
2279 } | 2281 } |
2280 CHECK_EQ(0xFFFF0000, bt.call(0x80000000, 15)); | 2282 CHECK_EQ(0xFFFF0000, bt.call(0x80000000, 15)); |
2281 } | 2283 } |
2282 } | 2284 } |
2283 | 2285 |
2284 | 2286 |
| 2287 TEST(RunWord32RorP) { |
| 2288 { |
| 2289 FOR_UINT32_SHIFTS(shift) { |
| 2290 RawMachineAssemblerTester<int32_t> m(kMachineWord32); |
| 2291 m.Return(m.Word32Ror(m.Parameter(0), m.Int32Constant(shift))); |
| 2292 FOR_UINT32_INPUTS(j) { |
| 2293 int32_t expected = bits::RotateRight32(*j, shift); |
| 2294 CHECK_EQ(expected, m.Call(*j)); |
| 2295 } |
| 2296 } |
| 2297 } |
| 2298 { |
| 2299 RawMachineAssemblerTester<int32_t> m; |
| 2300 Int32BinopTester bt(&m); |
| 2301 bt.AddReturn(m.Word32Ror(bt.param0, bt.param1)); |
| 2302 FOR_UINT32_INPUTS(i) { |
| 2303 FOR_UINT32_SHIFTS(shift) { |
| 2304 int32_t expected = bits::RotateRight32(*i, shift); |
| 2305 CHECK_EQ(expected, bt.call(*i, shift)); |
| 2306 } |
| 2307 } |
| 2308 } |
| 2309 } |
| 2310 |
| 2311 |
2285 TEST(RunWord32NotP) { | 2312 TEST(RunWord32NotP) { |
2286 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 2313 RawMachineAssemblerTester<int32_t> m(kMachineWord32); |
2287 m.Return(m.Word32Not(m.Parameter(0))); | 2314 m.Return(m.Word32Not(m.Parameter(0))); |
2288 FOR_UINT32_INPUTS(i) { | 2315 FOR_UINT32_INPUTS(i) { |
2289 int expected = ~(*i); | 2316 int expected = ~(*i); |
2290 CHECK_EQ(expected, m.Call(*i)); | 2317 CHECK_EQ(expected, m.Call(*i)); |
2291 } | 2318 } |
2292 } | 2319 } |
2293 | 2320 |
2294 | 2321 |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2432 CHECK_EQ(constant, m.Call(0)); | 2459 CHECK_EQ(constant, m.Call(0)); |
2433 } | 2460 } |
2434 } | 2461 } |
2435 } | 2462 } |
2436 | 2463 |
2437 | 2464 |
2438 TEST(RunDeadInt32Binops) { | 2465 TEST(RunDeadInt32Binops) { |
2439 RawMachineAssemblerTester<int32_t> m; | 2466 RawMachineAssemblerTester<int32_t> m; |
2440 | 2467 |
2441 Operator* ops[] = { | 2468 Operator* ops[] = { |
2442 m.machine()->Word32And(), m.machine()->Word32Or(), | 2469 m.machine()->Word32And(), m.machine()->Word32Or(), |
2443 m.machine()->Word32Xor(), m.machine()->Word32Shl(), | 2470 m.machine()->Word32Xor(), m.machine()->Word32Shl(), |
2444 m.machine()->Word32Shr(), m.machine()->Word32Sar(), | 2471 m.machine()->Word32Shr(), m.machine()->Word32Sar(), |
2445 m.machine()->Word32Equal(), m.machine()->Int32Add(), | 2472 m.machine()->Word32Ror(), m.machine()->Word32Equal(), |
2446 m.machine()->Int32Sub(), m.machine()->Int32Mul(), | 2473 m.machine()->Int32Add(), m.machine()->Int32Sub(), |
2447 m.machine()->Int32Div(), m.machine()->Int32UDiv(), | 2474 m.machine()->Int32Mul(), m.machine()->Int32Div(), |
2448 m.machine()->Int32Mod(), m.machine()->Int32UMod(), | 2475 m.machine()->Int32UDiv(), m.machine()->Int32Mod(), |
2449 m.machine()->Int32LessThan(), m.machine()->Int32LessThanOrEqual(), | 2476 m.machine()->Int32UMod(), m.machine()->Int32LessThan(), |
2450 m.machine()->Uint32LessThan(), m.machine()->Uint32LessThanOrEqual(), | 2477 m.machine()->Int32LessThanOrEqual(), m.machine()->Uint32LessThan(), |
2451 NULL}; | 2478 m.machine()->Uint32LessThanOrEqual(), NULL}; |
2452 | 2479 |
2453 for (int i = 0; ops[i] != NULL; i++) { | 2480 for (int i = 0; ops[i] != NULL; i++) { |
2454 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32); | 2481 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32); |
2455 int constant = 0x55555 + i; | 2482 int constant = 0x55555 + i; |
2456 m.NewNode(ops[i], m.Parameter(0), m.Parameter(1)); | 2483 m.NewNode(ops[i], m.Parameter(0), m.Parameter(1)); |
2457 m.Return(m.Int32Constant(constant)); | 2484 m.Return(m.Int32Constant(constant)); |
2458 | 2485 |
2459 CHECK_EQ(constant, m.Call(1, 1)); | 2486 CHECK_EQ(constant, m.Call(1, 1)); |
2460 } | 2487 } |
2461 } | 2488 } |
(...skipping 1220 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3682 } | 3709 } |
3683 m.Return(input); | 3710 m.Return(input); |
3684 CHECK_EQ(&inputs[kInputSize], m.Call()); | 3711 CHECK_EQ(&inputs[kInputSize], m.Call()); |
3685 for (int i = 0; i < kInputSize; i++) { | 3712 for (int i = 0; i < kInputSize; i++) { |
3686 CHECK_EQ(i, inputs[i]); | 3713 CHECK_EQ(i, inputs[i]); |
3687 CHECK_EQ(kInputSize - i - 1, outputs[i]); | 3714 CHECK_EQ(kInputSize - i - 1, outputs[i]); |
3688 } | 3715 } |
3689 } | 3716 } |
3690 | 3717 |
3691 | 3718 |
3692 static inline uint32_t rotr32(uint32_t i, uint32_t j) { | |
3693 return (i >> j) | (i << (32 - j)); | |
3694 } | |
3695 | |
3696 | |
3697 TEST(RunTestInt32RotateRightP) { | |
3698 { | |
3699 RawMachineAssemblerTester<int32_t> m; | |
3700 Int32BinopTester bt(&m); | |
3701 bt.AddReturn(m.Word32Or( | |
3702 m.Word32Shr(bt.param0, bt.param1), | |
3703 m.Word32Shl(bt.param0, m.Int32Sub(m.Int32Constant(32), bt.param1)))); | |
3704 bt.Run(ValueHelper::uint32_vector(), ValueHelper::ror_vector(), rotr32); | |
3705 } | |
3706 { | |
3707 RawMachineAssemblerTester<int32_t> m; | |
3708 Int32BinopTester bt(&m); | |
3709 bt.AddReturn(m.Word32Or( | |
3710 m.Word32Shl(bt.param0, m.Int32Sub(m.Int32Constant(32), bt.param1)), | |
3711 m.Word32Shr(bt.param0, bt.param1))); | |
3712 bt.Run(ValueHelper::uint32_vector(), ValueHelper::ror_vector(), rotr32); | |
3713 } | |
3714 } | |
3715 | |
3716 | |
3717 TEST(RunTestInt32RotateRightImm) { | |
3718 FOR_INPUTS(uint32_t, ror, i) { | |
3719 { | |
3720 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | |
3721 Node* value = m.Parameter(0); | |
3722 m.Return(m.Word32Or(m.Word32Shr(value, m.Int32Constant(*i)), | |
3723 m.Word32Shl(value, m.Int32Constant(32 - *i)))); | |
3724 m.Run(ValueHelper::uint32_vector(), | |
3725 std::bind2nd(std::ptr_fun(&rotr32), *i)); | |
3726 } | |
3727 { | |
3728 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | |
3729 Node* value = m.Parameter(0); | |
3730 m.Return(m.Word32Or(m.Word32Shl(value, m.Int32Constant(32 - *i)), | |
3731 m.Word32Shr(value, m.Int32Constant(*i)))); | |
3732 m.Run(ValueHelper::uint32_vector(), | |
3733 std::bind2nd(std::ptr_fun(&rotr32), *i)); | |
3734 } | |
3735 } | |
3736 } | |
3737 | |
3738 | |
3739 TEST(RunSpillLotsOfThings) { | 3719 TEST(RunSpillLotsOfThings) { |
3740 static const int kInputSize = 1000; | 3720 static const int kInputSize = 1000; |
3741 RawMachineAssemblerTester<void> m; | 3721 RawMachineAssemblerTester<void> m; |
3742 Node* accs[kInputSize]; | 3722 Node* accs[kInputSize]; |
3743 int32_t outputs[kInputSize]; | 3723 int32_t outputs[kInputSize]; |
3744 Node* one = m.Int32Constant(1); | 3724 Node* one = m.Int32Constant(1); |
3745 Node* acc = one; | 3725 Node* acc = one; |
3746 for (int i = 0; i < kInputSize; i++) { | 3726 for (int i = 0; i < kInputSize; i++) { |
3747 acc = m.Int32Add(acc, one); | 3727 acc = m.Int32Add(acc, one); |
3748 accs[i] = acc; | 3728 accs[i] = acc; |
(...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4037 FOR_UINT32_INPUTS(i) { | 4017 FOR_UINT32_INPUTS(i) { |
4038 FOR_UINT32_INPUTS(j) { | 4018 FOR_UINT32_INPUTS(j) { |
4039 int32_t expected; | 4019 int32_t expected; |
4040 if (ssub_overflow(*i, *j, &expected)) expected = constant; | 4020 if (ssub_overflow(*i, *j, &expected)) expected = constant; |
4041 CHECK_EQ(expected, bt.call(*i, *j)); | 4021 CHECK_EQ(expected, bt.call(*i, *j)); |
4042 } | 4022 } |
4043 } | 4023 } |
4044 } | 4024 } |
4045 | 4025 |
4046 #endif // V8_TURBOFAN_TARGET | 4026 #endif // V8_TURBOFAN_TARGET |
OLD | NEW |