Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(212)

Side by Side Diff: test/cctest/compiler/test-code-assembler.cc

Issue 2072813003: [test] Move CodeAssembler tests to a separate file. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Minor cleanup Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « test/cctest/compiler/code-assembler-tester.h ('k') | test/cctest/test-code-stub-assembler.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright 2015 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 "src/compiler/code-assembler.h"
6 #include "src/isolate.h"
7 #include "test/cctest/compiler/code-assembler-tester.h"
8 #include "test/cctest/compiler/function-tester.h"
9
10 namespace v8 {
11 namespace internal {
12 namespace compiler {
13
14 typedef CodeAssemblerTesterImpl<CodeAssembler> CodeAssemblerTester;
15
16 namespace {
17
18 Node* SmiTag(CodeAssemblerTester& m, Node* value) {
19 int32_t constant_value;
20 if (m.ToInt32Constant(value, constant_value) &&
21 Smi::IsValid(constant_value)) {
22 return m.SmiConstant(Smi::FromInt(constant_value));
23 }
24 return m.WordShl(value, m.SmiShiftBitsConstant());
25 }
26
27 Node* UndefinedConstant(CodeAssemblerTester& m) {
28 return m.LoadRoot(Heap::kUndefinedValueRootIndex);
29 }
30
31 Node* LoadObjectField(CodeAssemblerTester& m, Node* object, int offset,
32 MachineType rep = MachineType::AnyTagged()) {
33 return m.Load(rep, object, m.IntPtrConstant(offset - kHeapObjectTag));
34 }
35
36 } // namespace
37
38 TEST(SimpleSmiReturn) {
39 Isolate* isolate(CcTest::InitIsolateOnce());
40 VoidDescriptor descriptor(isolate);
41 CodeAssemblerTester m(isolate, descriptor);
42 m.Return(SmiTag(m, m.Int32Constant(37)));
43 Handle<Code> code = m.GenerateCode();
44 FunctionTester ft(descriptor, code);
45 MaybeHandle<Object> result = ft.Call();
46 CHECK_EQ(37, Handle<Smi>::cast(result.ToHandleChecked())->value());
47 }
48
49 TEST(SimpleIntPtrReturn) {
50 Isolate* isolate(CcTest::InitIsolateOnce());
51 VoidDescriptor descriptor(isolate);
52 CodeAssemblerTester m(isolate, descriptor);
53 int test;
54 m.Return(m.IntPtrConstant(reinterpret_cast<intptr_t>(&test)));
55 Handle<Code> code = m.GenerateCode();
56 FunctionTester ft(descriptor, code);
57 MaybeHandle<Object> result = ft.Call();
58 CHECK_EQ(reinterpret_cast<intptr_t>(&test),
59 reinterpret_cast<intptr_t>(*result.ToHandleChecked()));
60 }
61
62 TEST(SimpleDoubleReturn) {
63 Isolate* isolate(CcTest::InitIsolateOnce());
64 VoidDescriptor descriptor(isolate);
65 CodeAssemblerTester m(isolate, descriptor);
66 m.Return(m.NumberConstant(0.5));
67 Handle<Code> code = m.GenerateCode();
68 FunctionTester ft(descriptor, code);
69 MaybeHandle<Object> result = ft.Call();
70 CHECK_EQ(0.5, Handle<HeapNumber>::cast(result.ToHandleChecked())->value());
71 }
72
73 TEST(SimpleCallRuntime1Arg) {
74 Isolate* isolate(CcTest::InitIsolateOnce());
75 VoidDescriptor descriptor(isolate);
76 CodeAssemblerTester m(isolate, descriptor);
77 Node* context = m.HeapConstant(Handle<Context>(isolate->native_context()));
78 Node* b = SmiTag(m, m.Int32Constant(0));
79 m.Return(m.CallRuntime(Runtime::kNumberToSmi, context, b));
80 Handle<Code> code = m.GenerateCode();
81 FunctionTester ft(descriptor, code);
82 MaybeHandle<Object> result = ft.Call();
83 CHECK_EQ(0, Handle<Smi>::cast(result.ToHandleChecked())->value());
84 }
85
86 TEST(SimpleTailCallRuntime1Arg) {
87 Isolate* isolate(CcTest::InitIsolateOnce());
88 VoidDescriptor descriptor(isolate);
89 CodeAssemblerTester m(isolate, descriptor);
90 Node* context = m.HeapConstant(Handle<Context>(isolate->native_context()));
91 Node* b = SmiTag(m, m.Int32Constant(0));
92 m.TailCallRuntime(Runtime::kNumberToSmi, context, b);
93 Handle<Code> code = m.GenerateCode();
94 FunctionTester ft(descriptor, code);
95 MaybeHandle<Object> result = ft.Call();
96 CHECK_EQ(0, Handle<Smi>::cast(result.ToHandleChecked())->value());
97 }
98
99 TEST(SimpleCallRuntime2Arg) {
100 Isolate* isolate(CcTest::InitIsolateOnce());
101 VoidDescriptor descriptor(isolate);
102 CodeAssemblerTester m(isolate, descriptor);
103 Node* context = m.HeapConstant(Handle<Context>(isolate->native_context()));
104 Node* a = SmiTag(m, m.Int32Constant(2));
105 Node* b = SmiTag(m, m.Int32Constant(4));
106 m.Return(m.CallRuntime(Runtime::kMathPow, context, a, b));
107 Handle<Code> code = m.GenerateCode();
108 FunctionTester ft(descriptor, code);
109 MaybeHandle<Object> result = ft.Call();
110 CHECK_EQ(16, Handle<Smi>::cast(result.ToHandleChecked())->value());
111 }
112
113 TEST(SimpleTailCallRuntime2Arg) {
114 Isolate* isolate(CcTest::InitIsolateOnce());
115 VoidDescriptor descriptor(isolate);
116 CodeAssemblerTester m(isolate, descriptor);
117 Node* context = m.HeapConstant(Handle<Context>(isolate->native_context()));
118 Node* a = SmiTag(m, m.Int32Constant(2));
119 Node* b = SmiTag(m, m.Int32Constant(4));
120 m.TailCallRuntime(Runtime::kMathPow, context, a, b);
121 Handle<Code> code = m.GenerateCode();
122 FunctionTester ft(descriptor, code);
123 MaybeHandle<Object> result = ft.Call();
124 CHECK_EQ(16, Handle<Smi>::cast(result.ToHandleChecked())->value());
125 }
126
127 TEST(VariableMerge1) {
128 Isolate* isolate(CcTest::InitIsolateOnce());
129 VoidDescriptor descriptor(isolate);
130 CodeAssemblerTester m(isolate, descriptor);
131 CodeStubAssembler::Variable var1(&m, MachineRepresentation::kTagged);
132 CodeStubAssembler::Label l1(&m), l2(&m), merge(&m);
133 Node* temp = m.Int32Constant(0);
134 var1.Bind(temp);
135 m.Branch(m.Int32Constant(1), &l1, &l2);
136 m.Bind(&l1);
137 CHECK_EQ(var1.value(), temp);
138 m.Goto(&merge);
139 m.Bind(&l2);
140 CHECK_EQ(var1.value(), temp);
141 m.Goto(&merge);
142 m.Bind(&merge);
143 CHECK_EQ(var1.value(), temp);
144 }
145
146 TEST(VariableMerge2) {
147 Isolate* isolate(CcTest::InitIsolateOnce());
148 VoidDescriptor descriptor(isolate);
149 CodeAssemblerTester m(isolate, descriptor);
150 CodeStubAssembler::Variable var1(&m, MachineRepresentation::kTagged);
151 CodeStubAssembler::Label l1(&m), l2(&m), merge(&m);
152 Node* temp = m.Int32Constant(0);
153 var1.Bind(temp);
154 m.Branch(m.Int32Constant(1), &l1, &l2);
155 m.Bind(&l1);
156 CHECK_EQ(var1.value(), temp);
157 m.Goto(&merge);
158 m.Bind(&l2);
159 Node* temp2 = m.Int32Constant(2);
160 var1.Bind(temp2);
161 CHECK_EQ(var1.value(), temp2);
162 m.Goto(&merge);
163 m.Bind(&merge);
164 CHECK_NE(var1.value(), temp);
165 }
166
167 TEST(VariableMerge3) {
168 Isolate* isolate(CcTest::InitIsolateOnce());
169 VoidDescriptor descriptor(isolate);
170 CodeAssemblerTester m(isolate, descriptor);
171 CodeStubAssembler::Variable var1(&m, MachineRepresentation::kTagged);
172 CodeStubAssembler::Variable var2(&m, MachineRepresentation::kTagged);
173 CodeStubAssembler::Label l1(&m), l2(&m), merge(&m);
174 Node* temp = m.Int32Constant(0);
175 var1.Bind(temp);
176 var2.Bind(temp);
177 m.Branch(m.Int32Constant(1), &l1, &l2);
178 m.Bind(&l1);
179 CHECK_EQ(var1.value(), temp);
180 m.Goto(&merge);
181 m.Bind(&l2);
182 Node* temp2 = m.Int32Constant(2);
183 var1.Bind(temp2);
184 CHECK_EQ(var1.value(), temp2);
185 m.Goto(&merge);
186 m.Bind(&merge);
187 CHECK_NE(var1.value(), temp);
188 CHECK_NE(var1.value(), temp2);
189 CHECK_EQ(var2.value(), temp);
190 }
191
192 TEST(VariableMergeBindFirst) {
193 Isolate* isolate(CcTest::InitIsolateOnce());
194 VoidDescriptor descriptor(isolate);
195 CodeAssemblerTester m(isolate, descriptor);
196 CodeStubAssembler::Variable var1(&m, MachineRepresentation::kTagged);
197 CodeStubAssembler::Label l1(&m), l2(&m), merge(&m, &var1), end(&m);
198 Node* temp = m.Int32Constant(0);
199 var1.Bind(temp);
200 m.Branch(m.Int32Constant(1), &l1, &l2);
201 m.Bind(&l1);
202 CHECK_EQ(var1.value(), temp);
203 m.Goto(&merge);
204 m.Bind(&merge);
205 CHECK(var1.value() != temp);
206 CHECK(var1.value() != nullptr);
207 m.Goto(&end);
208 m.Bind(&l2);
209 Node* temp2 = m.Int32Constant(2);
210 var1.Bind(temp2);
211 CHECK_EQ(var1.value(), temp2);
212 m.Goto(&merge);
213 m.Bind(&end);
214 CHECK(var1.value() != temp);
215 CHECK(var1.value() != nullptr);
216 }
217
218 TEST(VariableMergeSwitch) {
219 Isolate* isolate(CcTest::InitIsolateOnce());
220 VoidDescriptor descriptor(isolate);
221 CodeAssemblerTester m(isolate, descriptor);
222 CodeStubAssembler::Variable var1(&m, MachineRepresentation::kTagged);
223 CodeStubAssembler::Label l1(&m), l2(&m), default_label(&m);
224 CodeStubAssembler::Label* labels[] = {&l1, &l2};
225 int32_t values[] = {1, 2};
226 Node* temp = m.Int32Constant(0);
227 var1.Bind(temp);
228 m.Switch(m.Int32Constant(2), &default_label, values, labels, 2);
229 m.Bind(&l1);
230 DCHECK_EQ(temp, var1.value());
231 m.Return(temp);
232 m.Bind(&l2);
233 DCHECK_EQ(temp, var1.value());
234 m.Return(temp);
235 m.Bind(&default_label);
236 DCHECK_EQ(temp, var1.value());
237 m.Return(temp);
238 }
239
240 TEST(SplitEdgeBranchMerge) {
241 Isolate* isolate(CcTest::InitIsolateOnce());
242 VoidDescriptor descriptor(isolate);
243 CodeAssemblerTester m(isolate, descriptor);
244 CodeStubAssembler::Label l1(&m), merge(&m);
245 m.Branch(m.Int32Constant(1), &l1, &merge);
246 m.Bind(&l1);
247 m.Goto(&merge);
248 m.Bind(&merge);
249 USE(m.GenerateCode());
250 }
251
252 TEST(SplitEdgeSwitchMerge) {
253 Isolate* isolate(CcTest::InitIsolateOnce());
254 VoidDescriptor descriptor(isolate);
255 CodeAssemblerTester m(isolate, descriptor);
256 CodeStubAssembler::Label l1(&m), l2(&m), l3(&m), default_label(&m);
257 CodeStubAssembler::Label* labels[] = {&l1, &l2};
258 int32_t values[] = {1, 2};
259 m.Branch(m.Int32Constant(1), &l3, &l1);
260 m.Bind(&l3);
261 m.Switch(m.Int32Constant(2), &default_label, values, labels, 2);
262 m.Bind(&l1);
263 m.Goto(&l2);
264 m.Bind(&l2);
265 m.Goto(&default_label);
266 m.Bind(&default_label);
267 USE(m.GenerateCode());
268 }
269
270 TEST(TestToConstant) {
271 Isolate* isolate(CcTest::InitIsolateOnce());
272 VoidDescriptor descriptor(isolate);
273 CodeAssemblerTester m(isolate, descriptor);
274 int32_t value32;
275 int64_t value64;
276 Node* a = m.Int32Constant(5);
277 CHECK(m.ToInt32Constant(a, value32));
278 CHECK(m.ToInt64Constant(a, value64));
279
280 a = m.Int64Constant(static_cast<int64_t>(1) << 32);
281 CHECK(!m.ToInt32Constant(a, value32));
282 CHECK(m.ToInt64Constant(a, value64));
283
284 a = m.Int64Constant(13);
285 CHECK(m.ToInt32Constant(a, value32));
286 CHECK(m.ToInt64Constant(a, value64));
287
288 a = UndefinedConstant(m);
289 CHECK(!m.ToInt32Constant(a, value32));
290 CHECK(!m.ToInt64Constant(a, value64));
291
292 a = UndefinedConstant(m);
293 CHECK(!m.ToInt32Constant(a, value32));
294 CHECK(!m.ToInt64Constant(a, value64));
295 }
296
297 TEST(DeferredCodePhiHints) {
298 typedef compiler::Node Node;
299 typedef CodeStubAssembler::Label Label;
300 typedef CodeStubAssembler::Variable Variable;
301 Isolate* isolate(CcTest::InitIsolateOnce());
302 VoidDescriptor descriptor(isolate);
303 CodeAssemblerTester m(isolate, descriptor);
304 Label block1(&m, Label::kDeferred);
305 m.Goto(&block1);
306 m.Bind(&block1);
307 {
308 Variable var_object(&m, MachineRepresentation::kTagged);
309 Label loop(&m, &var_object);
310 var_object.Bind(m.IntPtrConstant(0));
311 m.Goto(&loop);
312 m.Bind(&loop);
313 {
314 Node* map = LoadObjectField(m, var_object.value(), JSObject::kMapOffset);
315 var_object.Bind(map);
316 m.Goto(&loop);
317 }
318 }
319 CHECK(!m.GenerateCode().is_null());
320 }
321
322 TEST(TestOutOfScopeVariable) {
323 typedef CodeStubAssembler::Label Label;
324 typedef CodeStubAssembler::Variable Variable;
325 Isolate* isolate(CcTest::InitIsolateOnce());
326 VoidDescriptor descriptor(isolate);
327 CodeAssemblerTester m(isolate, descriptor);
328 Label block1(&m);
329 Label block2(&m);
330 Label block3(&m);
331 Label block4(&m);
332 m.Branch(m.WordEqual(m.Parameter(0), m.IntPtrConstant(0)), &block1, &block4);
333 m.Bind(&block4);
334 {
335 Variable var_object(&m, MachineRepresentation::kTagged);
336 m.Branch(m.WordEqual(m.Parameter(0), m.IntPtrConstant(0)), &block2,
337 &block3);
338
339 m.Bind(&block2);
340 var_object.Bind(m.IntPtrConstant(55));
341 m.Goto(&block1);
342
343 m.Bind(&block3);
344 var_object.Bind(m.IntPtrConstant(66));
345 m.Goto(&block1);
346 }
347 m.Bind(&block1);
348 CHECK(!m.GenerateCode().is_null());
349 }
350
351 } // namespace compiler
352 } // namespace internal
353 } // namespace v8
OLDNEW
« no previous file with comments | « test/cctest/compiler/code-assembler-tester.h ('k') | test/cctest/test-code-stub-assembler.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698