OLD | NEW |
| (Empty) |
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 | |
3 // found in the LICENSE file. | |
4 | |
5 #include <list> | |
6 | |
7 #include "test/cctest/compiler/instruction-selector-tester.h" | |
8 | |
9 using namespace v8::internal; | |
10 using namespace v8::internal::compiler; | |
11 | |
12 namespace { | |
13 | |
14 struct DPI { | |
15 Operator* op; | |
16 ArchOpcode arch_opcode; | |
17 }; | |
18 | |
19 | |
20 // ARM64 Logical instructions. | |
21 class LogicalInstructions V8_FINAL : public std::list<DPI>, | |
22 private HandleAndZoneScope { | |
23 public: | |
24 LogicalInstructions() { | |
25 MachineOperatorBuilder machine(main_zone()); | |
26 DPI and32 = {machine.Word32And(), kArm64And32}; | |
27 push_back(and32); | |
28 DPI and64 = {machine.Word64And(), kArm64And}; | |
29 push_back(and64); | |
30 DPI or32 = {machine.Word32Or(), kArm64Or32}; | |
31 push_back(or32); | |
32 DPI or64 = {machine.Word64Or(), kArm64Or}; | |
33 push_back(or64); | |
34 DPI xor32 = {machine.Word32Xor(), kArm64Xor32}; | |
35 push_back(xor32); | |
36 DPI xor64 = {machine.Word64Xor(), kArm64Xor}; | |
37 push_back(xor64); | |
38 } | |
39 }; | |
40 | |
41 | |
42 // ARM64 Arithmetic instructions. | |
43 class AddSubInstructions V8_FINAL : public std::list<DPI>, | |
44 private HandleAndZoneScope { | |
45 public: | |
46 AddSubInstructions() { | |
47 MachineOperatorBuilder machine(main_zone()); | |
48 DPI add32 = {machine.Int32Add(), kArm64Add32}; | |
49 push_back(add32); | |
50 DPI add64 = {machine.Int64Add(), kArm64Add}; | |
51 push_back(add64); | |
52 DPI sub32 = {machine.Int32Sub(), kArm64Sub32}; | |
53 push_back(sub32); | |
54 DPI sub64 = {machine.Int64Sub(), kArm64Sub}; | |
55 push_back(sub64); | |
56 } | |
57 }; | |
58 | |
59 | |
60 // ARM64 Add/Sub immediates. | |
61 class AddSubImmediates V8_FINAL : public std::list<int32_t> { | |
62 public: | |
63 AddSubImmediates() { | |
64 for (int32_t imm12 = 0; imm12 < 4096; ++imm12) { | |
65 CHECK(Assembler::IsImmAddSub(imm12)); | |
66 CHECK(Assembler::IsImmAddSub(imm12 << 12)); | |
67 push_back(imm12); | |
68 push_back(imm12 << 12); | |
69 } | |
70 } | |
71 }; | |
72 | |
73 | |
74 // ARM64 Arithmetic instructions. | |
75 class MulDivInstructions V8_FINAL : public std::list<DPI>, | |
76 private HandleAndZoneScope { | |
77 public: | |
78 MulDivInstructions() { | |
79 MachineOperatorBuilder machine(main_zone()); | |
80 DPI mul32 = {machine.Int32Mul(), kArm64Mul32}; | |
81 push_back(mul32); | |
82 DPI mul64 = {machine.Int64Mul(), kArm64Mul}; | |
83 push_back(mul64); | |
84 DPI sdiv32 = {machine.Int32Div(), kArm64Idiv32}; | |
85 push_back(sdiv32); | |
86 DPI sdiv64 = {machine.Int64Div(), kArm64Idiv}; | |
87 push_back(sdiv64); | |
88 DPI udiv32 = {machine.Int32UDiv(), kArm64Udiv32}; | |
89 push_back(udiv32); | |
90 DPI udiv64 = {machine.Int64UDiv(), kArm64Udiv}; | |
91 push_back(udiv64); | |
92 } | |
93 }; | |
94 | |
95 } // namespace | |
96 | |
97 | |
98 TEST(InstructionSelectorLogicalP) { | |
99 LogicalInstructions instructions; | |
100 for (LogicalInstructions::const_iterator i = instructions.begin(); | |
101 i != instructions.end(); ++i) { | |
102 DPI dpi = *i; | |
103 InstructionSelectorTester m; | |
104 m.Return(m.NewNode(dpi.op, m.Parameter(0), m.Parameter(1))); | |
105 m.SelectInstructions(); | |
106 CHECK_EQ(1, m.code.size()); | |
107 CHECK_EQ(dpi.arch_opcode, m.code[0]->arch_opcode()); | |
108 } | |
109 } | |
110 | |
111 | |
112 TEST(InstructionSelectorAddSubP) { | |
113 AddSubInstructions instructions; | |
114 for (AddSubInstructions::const_iterator i = instructions.begin(); | |
115 i != instructions.end(); ++i) { | |
116 DPI dpi = *i; | |
117 InstructionSelectorTester m; | |
118 m.Return(m.NewNode(dpi.op, m.Parameter(0), m.Parameter(1))); | |
119 m.SelectInstructions(); | |
120 CHECK_EQ(1, m.code.size()); | |
121 CHECK_EQ(dpi.arch_opcode, m.code[0]->arch_opcode()); | |
122 } | |
123 } | |
124 | |
125 | |
126 TEST(InstructionSelectorAddSubImm) { | |
127 AddSubInstructions instructions; | |
128 AddSubImmediates immediates; | |
129 for (AddSubInstructions::const_iterator i = instructions.begin(); | |
130 i != instructions.end(); ++i) { | |
131 DPI dpi = *i; | |
132 for (AddSubImmediates::const_iterator j = immediates.begin(); | |
133 j != immediates.end(); ++j) { | |
134 int32_t imm = *j; | |
135 InstructionSelectorTester m; | |
136 m.Return(m.NewNode(dpi.op, m.Parameter(0), m.Int32Constant(imm))); | |
137 m.SelectInstructions(); | |
138 CHECK_EQ(1, m.code.size()); | |
139 CHECK_EQ(dpi.arch_opcode, m.code[0]->arch_opcode()); | |
140 CHECK(m.code[0]->InputAt(1)->IsImmediate()); | |
141 } | |
142 } | |
143 } | |
144 | |
145 | |
146 TEST(InstructionSelectorMulDivP) { | |
147 MulDivInstructions instructions; | |
148 for (MulDivInstructions::const_iterator i = instructions.begin(); | |
149 i != instructions.end(); ++i) { | |
150 DPI dpi = *i; | |
151 InstructionSelectorTester m; | |
152 m.Return(m.NewNode(dpi.op, m.Parameter(0), m.Parameter(1))); | |
153 m.SelectInstructions(); | |
154 CHECK_EQ(1, m.code.size()); | |
155 CHECK_EQ(dpi.arch_opcode, m.code[0]->arch_opcode()); | |
156 } | |
157 } | |
OLD | NEW |