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 <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" |
11 #include "src/codegen.h" | 11 #include "src/codegen.h" |
12 #include "test/cctest/cctest.h" | 12 #include "test/cctest/cctest.h" |
13 #include "test/cctest/compiler/codegen-tester.h" | 13 #include "test/cctest/compiler/codegen-tester.h" |
14 #include "test/cctest/compiler/value-helper.h" | 14 #include "test/cctest/compiler/value-helper.h" |
15 | 15 |
16 using namespace v8::base; | 16 using namespace v8::base; |
17 using namespace v8::internal; | 17 using namespace v8::internal; |
18 using namespace v8::internal::compiler; | 18 using namespace v8::internal::compiler; |
19 | 19 |
20 typedef RawMachineAssembler::Label MLabel; | 20 typedef RawMachineAssembler::Label MLabel; |
21 | 21 |
22 TEST(RunInt32Add) { | 22 TEST(RunInt32Add) { |
23 RawMachineAssemblerTester<int32_t> m; | 23 RawMachineAssemblerTester<int32_t> m; |
24 Node* add = m.Int32Add(m.Int32Constant(0), m.Int32Constant(1)); | 24 Node* add = m.Int32Add(m.Int32Constant(0), m.Int32Constant(1)); |
25 m.Return(add); | 25 m.Return(add); |
26 CHECK_EQ(1, m.Call()); | 26 CHECK_EQ(1, m.Call()); |
27 } | 27 } |
28 | 28 |
29 | 29 |
| 30 void TestWord32Ctz(int32_t value, int32_t expected) { |
| 31 RawMachineAssemblerTester<int32_t> m; |
| 32 if (m.machine()->Word32Ctz().IsSupported()) { |
| 33 Node* ctz = |
| 34 m.AddNode(m.machine()->Word32Ctz().op(), m.Int32Constant(value)); |
| 35 m.Return(ctz); |
| 36 CHECK_EQ(expected, m.Call()); |
| 37 } |
| 38 } |
| 39 |
| 40 |
| 41 TEST(RunInt32Ctz) { |
| 42 TestWord32Ctz(0x00000000, 32); |
| 43 TestWord32Ctz(0x80000000, 31); |
| 44 TestWord32Ctz(0x40000000, 30); |
| 45 TestWord32Ctz(0x20000000, 29); |
| 46 TestWord32Ctz(0x10000000, 28); |
| 47 TestWord32Ctz(0xa8000000, 27); |
| 48 TestWord32Ctz(0xf4000000, 26); |
| 49 TestWord32Ctz(0x62000000, 25); |
| 50 TestWord32Ctz(0x91000000, 24); |
| 51 TestWord32Ctz(0xcd800000, 23); |
| 52 TestWord32Ctz(0x09400000, 22); |
| 53 TestWord32Ctz(0xaf200000, 21); |
| 54 TestWord32Ctz(0xac100000, 20); |
| 55 TestWord32Ctz(0xe0b80000, 19); |
| 56 TestWord32Ctz(0x9ce40000, 18); |
| 57 TestWord32Ctz(0xc7920000, 17); |
| 58 TestWord32Ctz(0xb8f10000, 16); |
| 59 TestWord32Ctz(0x3b9f8000, 15); |
| 60 TestWord32Ctz(0xdb4c4000, 14); |
| 61 TestWord32Ctz(0xe9a32000, 13); |
| 62 TestWord32Ctz(0xfca61000, 12); |
| 63 TestWord32Ctz(0x6c8a7800, 11); |
| 64 TestWord32Ctz(0x8ce5a400, 10); |
| 65 TestWord32Ctz(0xcb7d0200, 9); |
| 66 TestWord32Ctz(0xcb4dc100, 8); |
| 67 TestWord32Ctz(0xdfbec580, 7); |
| 68 TestWord32Ctz(0x27a9db40, 6); |
| 69 TestWord32Ctz(0xde3bcb20, 5); |
| 70 TestWord32Ctz(0xd7e8a610, 4); |
| 71 TestWord32Ctz(0x9afdbc88, 3); |
| 72 TestWord32Ctz(0x9afdbc84, 2); |
| 73 TestWord32Ctz(0x9afdbc82, 1); |
| 74 TestWord32Ctz(0x9afdbc81, 0); |
| 75 } |
| 76 |
| 77 |
30 static Node* Int32Input(RawMachineAssemblerTester<int32_t>* m, int index) { | 78 static Node* Int32Input(RawMachineAssemblerTester<int32_t>* m, int index) { |
31 switch (index) { | 79 switch (index) { |
32 case 0: | 80 case 0: |
33 return m->Parameter(0); | 81 return m->Parameter(0); |
34 case 1: | 82 case 1: |
35 return m->Parameter(1); | 83 return m->Parameter(1); |
36 case 2: | 84 case 2: |
37 return m->Int32Constant(0); | 85 return m->Int32Constant(0); |
38 case 3: | 86 case 3: |
39 return m->Int32Constant(1); | 87 return m->Int32Constant(1); |
(...skipping 5389 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5429 c->CalleeSavedRegisters(), // callee saved | 5477 c->CalleeSavedRegisters(), // callee saved |
5430 c->CalleeSavedFPRegisters(), // callee saved FP | 5478 c->CalleeSavedFPRegisters(), // callee saved FP |
5431 CallDescriptor::kNoFlags, // flags | 5479 CallDescriptor::kNoFlags, // flags |
5432 "c-call-as-code"); | 5480 "c-call-as-code"); |
5433 Node* call = r.AddNode(r.common()->Call(desc), phi); | 5481 Node* call = r.AddNode(r.common()->Call(desc), phi); |
5434 r.Return(call); | 5482 r.Return(call); |
5435 | 5483 |
5436 CHECK_EQ(33, r.Call(1)); | 5484 CHECK_EQ(33, r.Call(1)); |
5437 CHECK_EQ(44, r.Call(0)); | 5485 CHECK_EQ(44, r.Call(0)); |
5438 } | 5486 } |
OLD | NEW |