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

Side by Side Diff: runtime/vm/assembler_dbc_test.cc

Issue 1927203002: Start to add assembler tests for DBC (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Add double strict equal tests Created 4 years, 7 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 | « no previous file | runtime/vm/unit_test.h » ('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 (c) 2016, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file.
4
5 #include "vm/globals.h"
6 #if defined(TARGET_ARCH_DBC)
7
8 #include "vm/assembler.h"
9 #include "vm/unit_test.h"
10
11 namespace dart {
12
13 #define __ assembler->
14
15 ASSEMBLER_TEST_GENERATE(Simple, assembler) {
16 __ PushConstant(Smi::Handle(Smi::New(42)));
17 __ ReturnTOS();
18 }
19
20
21 ASSEMBLER_TEST_RUN(Simple, test) {
22 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
23 }
24
25
26 // - AddTOS; SubTOS; MulTOS; BitOrTOS; BitAndTOS; EqualTOS; LessThanTOS;
27 // GreaterThanTOS;
28 //
29 // Smi fast-path for a corresponding method. Checks if SP[0] and SP[-1] are
30 // both smis and result of SP[0] <op> SP[-1] is a smi - if this is true
31 // then pops operands and pushes result on the stack and skips the next
32 // instruction (which implements a slow path fallback).
33 ASSEMBLER_TEST_GENERATE(AddTOS, assembler) {
34 __ PushConstant(Smi::Handle(Smi::New(-42)));
35 __ PushConstant(Smi::Handle(Smi::New(84)));
36 __ AddTOS();
37 // TODO(zra): Test fail over to the runtime call.
Ivan Posva 2016/04/29 05:57:53 You have this TODO here, but not in the other plac
zra 2016/04/29 16:08:57 On further thought, I think this is not the right
38 __ PushConstant(Smi::Handle(Smi::New(0))); // Should be skipped.
39 __ ReturnTOS();
40 }
41
42
43 ASSEMBLER_TEST_RUN(AddTOS, test) {
44 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
45 }
46
47
48 ASSEMBLER_TEST_GENERATE(SubTOS, assembler) {
49 __ PushConstant(Smi::Handle(Smi::New(30)));
50 __ PushConstant(Smi::Handle(Smi::New(-12)));
51 __ SubTOS();
52 __ PushConstant(Smi::Handle(Smi::New(0))); // Should be skipped.
53 __ ReturnTOS();
54 }
55
56
57 ASSEMBLER_TEST_RUN(SubTOS, test) {
58 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
59 }
60
61
62 ASSEMBLER_TEST_GENERATE(MulTOS, assembler) {
63 __ PushConstant(Smi::Handle(Smi::New(-6)));
64 __ PushConstant(Smi::Handle(Smi::New(-7)));
65 __ MulTOS();
66 __ PushConstant(Smi::Handle(Smi::New(0))); // Should be skipped.
67 __ ReturnTOS();
68 }
69
70
71 ASSEMBLER_TEST_RUN(MulTOS, test) {
72 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
73 }
74
75
76 ASSEMBLER_TEST_GENERATE(BitOrTOS, assembler) {
77 __ PushConstant(Smi::Handle(Smi::New(0x22)));
78 __ PushConstant(Smi::Handle(Smi::New(0x08)));
79 __ BitOrTOS();
80 __ PushConstant(Smi::Handle(Smi::New(0))); // Should be skipped.
81 __ ReturnTOS();
82 }
83
84
85 ASSEMBLER_TEST_RUN(BitOrTOS, test) {
86 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
87 }
88
89
90 ASSEMBLER_TEST_GENERATE(BitAndTOS, assembler) {
91 __ PushConstant(Smi::Handle(Smi::New(0x2a)));
92 __ PushConstant(Smi::Handle(Smi::New(0xaa)));
93 __ BitAndTOS();
94 __ PushConstant(Smi::Handle(Smi::New(0))); // Should be skipped.
95 __ ReturnTOS();
96 }
97
98
99 ASSEMBLER_TEST_RUN(BitAndTOS, test) {
100 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
101 }
102
103
104 ASSEMBLER_TEST_GENERATE(EqualTOSTrue, assembler) {
105 __ PushConstant(Smi::Handle(Smi::New(42)));
106 __ PushConstant(Smi::Handle(Smi::New(42)));
107 __ EqualTOS();
108 __ PushConstant(Bool::False()); // Should be skipped.
109 __ ReturnTOS();
110 }
111
112
113 ASSEMBLER_TEST_RUN(EqualTOSTrue, test) {
114 EXPECT(EXECUTE_TEST_CODE_BOOL(test->code()));
115 }
116
117
118 ASSEMBLER_TEST_GENERATE(EqualTOSFalse, assembler) {
119 __ PushConstant(Smi::Handle(Smi::New(42)));
120 __ PushConstant(Smi::Handle(Smi::New(-42)));
121 __ EqualTOS();
122 __ PushConstant(Bool::True()); // Should be skipped.
123 __ ReturnTOS();
124 }
125
126
127 ASSEMBLER_TEST_RUN(EqualTOSFalse, test) {
128 EXPECT(!EXECUTE_TEST_CODE_BOOL(test->code()));
129 }
130
131
132 ASSEMBLER_TEST_GENERATE(LessThanTOSTrue, assembler) {
133 __ PushConstant(Smi::Handle(Smi::New(-42)));
134 __ PushConstant(Smi::Handle(Smi::New(42)));
135 __ LessThanTOS();
136 __ PushConstant(Bool::False()); // Should be skipped.
137 __ ReturnTOS();
138 }
139
140
141 ASSEMBLER_TEST_RUN(LessThanTOSTrue, test) {
142 EXPECT(EXECUTE_TEST_CODE_BOOL(test->code()));
143 }
144
145
146 ASSEMBLER_TEST_GENERATE(LessThanTOSFalse, assembler) {
147 __ PushConstant(Smi::Handle(Smi::New(42)));
148 __ PushConstant(Smi::Handle(Smi::New(-42)));
149 __ LessThanTOS();
150 __ PushConstant(Bool::False()); // Should be skipped.
151 __ ReturnTOS();
152 }
153
154
155 ASSEMBLER_TEST_RUN(LessThanTOSFalse, test) {
156 EXPECT(!EXECUTE_TEST_CODE_BOOL(test->code()));
157 }
158
159
160 ASSEMBLER_TEST_GENERATE(GreaterThanTOSTrue, assembler) {
161 __ PushConstant(Smi::Handle(Smi::New(42)));
162 __ PushConstant(Smi::Handle(Smi::New(-42)));
163 __ GreaterThanTOS();
164 __ PushConstant(Bool::False()); // Should be skipped.
165 __ ReturnTOS();
166 }
167
168
169 ASSEMBLER_TEST_RUN(GreaterThanTOSTrue, test) {
170 EXPECT(EXECUTE_TEST_CODE_BOOL(test->code()));
171 }
172
173
174 ASSEMBLER_TEST_GENERATE(GreaterThanTOSFalse, assembler) {
175 __ PushConstant(Smi::Handle(Smi::New(-42)));
176 __ PushConstant(Smi::Handle(Smi::New(42)));
177 __ GreaterThanTOS();
178 __ PushConstant(Bool::False()); // Should be skipped.
179 __ ReturnTOS();
180 }
181
182
183 ASSEMBLER_TEST_RUN(GreaterThanTOSFalse, test) {
184 EXPECT(!EXECUTE_TEST_CODE_BOOL(test->code()));
185 }
186
187
188
189 // - IfNeStrictTOS; IfEqStrictTOS; IfNeStrictNumTOS; IfEqStrictNumTOS
190 //
191 // Skips the next instruction unless the given condition holds. 'Num'
192 // variants perform number check while non-Num variants just compare
193 // RawObject pointers.
194 //
195 // Used to implement conditional jump:
196 //
197 // IfNeStrictTOS
198 // Jump T ;; jump if not equal
199 ASSEMBLER_TEST_GENERATE(IfNeStrictTOSTaken, assembler) {
200 Label branch_taken;
201 const Array& array1 = Array::Handle(Array::New(1, Heap::kOld));
202 const Array& array2 = Array::Handle(Array::New(2, Heap::kOld));
203 __ PushConstant(array1);
204 __ PushConstant(array2);
205 __ IfNeStrictTOS();
206 __ Jump(&branch_taken);
207 __ PushConstant(Smi::Handle(Smi::New(0)));
208 __ ReturnTOS();
209 __ Bind(&branch_taken);
210 __ PushConstant(Smi::Handle(Smi::New(42)));
211 __ ReturnTOS();
212 }
213
214
215 ASSEMBLER_TEST_RUN(IfNeStrictTOSTaken, test) {
216 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
217 }
218
219
220 ASSEMBLER_TEST_GENERATE(IfNeStrictTOSNotTaken, assembler) {
221 Label branch_taken;
222 const Array& array1 = Array::Handle(Array::New(1, Heap::kOld));
223 __ PushConstant(array1);
224 __ PushConstant(array1);
225 __ IfNeStrictTOS();
226 __ Jump(&branch_taken);
227 __ PushConstant(Smi::Handle(Smi::New(42)));
228 __ ReturnTOS();
229 __ Bind(&branch_taken);
230 __ PushConstant(Smi::Handle(Smi::New(0)));
231 __ ReturnTOS();
232 }
233
234 ASSEMBLER_TEST_RUN(IfNeStrictTOSNotTaken, test) {
235 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
236 }
237
238
239 // TODO(zra): Also add tests that use Mint, Bignum.
240 ASSEMBLER_TEST_GENERATE(IfNeStrictNumTOSTaken, assembler) {
241 Label branch_taken;
242 __ PushConstant(Smi::Handle(Smi::New(-1)));
243 __ PushConstant(Smi::Handle(Smi::New(1)));
244 __ IfNeStrictNumTOS();
245 __ Jump(&branch_taken);
246 __ PushConstant(Smi::Handle(Smi::New(0)));
247 __ ReturnTOS();
248 __ Bind(&branch_taken);
249 __ PushConstant(Smi::Handle(Smi::New(42)));
250 __ ReturnTOS();
251 }
252
253
254 ASSEMBLER_TEST_RUN(IfNeStrictNumTOSTaken, test) {
255 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
256 }
257
258
259 ASSEMBLER_TEST_GENERATE(IfNeStrictNumTOSNotTaken, assembler) {
260 Label branch_taken;
261 __ PushConstant(Smi::Handle(Smi::New(1)));
262 __ PushConstant(Smi::Handle(Smi::New(1)));
263 __ IfNeStrictNumTOS();
264 __ Jump(&branch_taken);
265 __ PushConstant(Smi::Handle(Smi::New(42)));
266 __ ReturnTOS();
267 __ Bind(&branch_taken);
268 __ PushConstant(Smi::Handle(Smi::New(0)));
269 __ ReturnTOS();
270 }
271
272 ASSEMBLER_TEST_RUN(IfNeStrictNumTOSNotTaken, test) {
273 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
274 }
275
276
277 ASSEMBLER_TEST_GENERATE(IfNeStrictNumTOSTakenDouble, assembler) {
278 Label branch_taken;
279 __ PushConstant(Double::Handle(Double::New(-1.0, Heap::kOld)));
280 __ PushConstant(Double::Handle(Double::New(1.0, Heap::kOld)));
281 __ IfNeStrictNumTOS();
282 __ Jump(&branch_taken);
283 __ PushConstant(Smi::Handle(Smi::New(0)));
284 __ ReturnTOS();
285 __ Bind(&branch_taken);
286 __ PushConstant(Smi::Handle(Smi::New(42)));
287 __ ReturnTOS();
288 }
289
290
291 ASSEMBLER_TEST_RUN(IfNeStrictNumTOSTakenDouble, test) {
292 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
293 }
294
295
296 ASSEMBLER_TEST_GENERATE(IfNeStrictNumTOSNotTakenDouble, assembler) {
297 Label branch_taken;
298 __ PushConstant(Double::Handle(Double::New(1.0, Heap::kOld)));
299 __ PushConstant(Double::Handle(Double::New(1.0, Heap::kOld)));
300 __ IfNeStrictNumTOS();
301 __ Jump(&branch_taken);
302 __ PushConstant(Smi::Handle(Smi::New(42)));
303 __ ReturnTOS();
304 __ Bind(&branch_taken);
305 __ PushConstant(Smi::Handle(Smi::New(0)));
306 __ ReturnTOS();
307 }
308
309 ASSEMBLER_TEST_RUN(IfNeStrictNumTOSNotTakenDouble, test) {
310 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
311 }
312
313
314 ASSEMBLER_TEST_GENERATE(IfEqStrictTOSTaken, assembler) {
315 Label branch_taken;
316 const Array& array1 = Array::Handle(Array::New(1, Heap::kOld));
317 __ PushConstant(array1);
318 __ PushConstant(array1);
319 __ IfEqStrictTOS();
320 __ Jump(&branch_taken);
321 __ PushConstant(Smi::Handle(Smi::New(0)));
322 __ ReturnTOS();
323 __ Bind(&branch_taken);
324 __ PushConstant(Smi::Handle(Smi::New(42)));
325 __ ReturnTOS();
326 }
327
328
329 ASSEMBLER_TEST_RUN(IfEqStrictTOSTaken, test) {
330 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
331 }
332
333
334 ASSEMBLER_TEST_GENERATE(IfEqStrictTOSNotTaken, assembler) {
335 Label branch_taken;
336 const Array& array1 = Array::Handle(Array::New(1, Heap::kOld));
337 const Array& array2 = Array::Handle(Array::New(2, Heap::kOld));
338 __ PushConstant(array1);
339 __ PushConstant(array2);
340 __ IfEqStrictTOS();
341 __ Jump(&branch_taken);
342 __ PushConstant(Smi::Handle(Smi::New(42)));
343 __ ReturnTOS();
344 __ Bind(&branch_taken);
345 __ PushConstant(Smi::Handle(Smi::New(0)));
346 __ ReturnTOS();
347 }
348
349 ASSEMBLER_TEST_RUN(IfEqStrictTOSNotTaken, test) {
350 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
351 }
352
353
354 // TODO(zra): Also add tests that use Mint, Bignum.
355 ASSEMBLER_TEST_GENERATE(IfEqStrictNumTOSTaken, assembler) {
356 Label branch_taken;
357 __ PushConstant(Smi::Handle(Smi::New(1)));
358 __ PushConstant(Smi::Handle(Smi::New(1)));
359 __ IfEqStrictNumTOS();
360 __ Jump(&branch_taken);
361 __ PushConstant(Smi::Handle(Smi::New(0)));
362 __ ReturnTOS();
363 __ Bind(&branch_taken);
364 __ PushConstant(Smi::Handle(Smi::New(42)));
365 __ ReturnTOS();
366 }
367
368
369 ASSEMBLER_TEST_RUN(IfEqStrictNumTOSTaken, test) {
370 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
371 }
372
373
374 ASSEMBLER_TEST_GENERATE(IfEqStrictNumTOSNotTaken, assembler) {
375 Label branch_taken;
376 __ PushConstant(Smi::Handle(Smi::New(-1)));
377 __ PushConstant(Smi::Handle(Smi::New(1)));
378 __ IfEqStrictNumTOS();
379 __ Jump(&branch_taken);
380 __ PushConstant(Smi::Handle(Smi::New(42)));
381 __ ReturnTOS();
382 __ Bind(&branch_taken);
383 __ PushConstant(Smi::Handle(Smi::New(0)));
384 __ ReturnTOS();
385 }
386
387
388 ASSEMBLER_TEST_RUN(IfEqStrictNumTOSNotTaken, test) {
389 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
390 }
391
392
393 ASSEMBLER_TEST_GENERATE(IfEqStrictNumTOSTakenDouble, assembler) {
394 Label branch_taken;
395 __ PushConstant(Double::Handle(Double::New(1.0, Heap::kOld)));
396 __ PushConstant(Double::Handle(Double::New(1.0, Heap::kOld)));
397 __ IfEqStrictNumTOS();
398 __ Jump(&branch_taken);
399 __ PushConstant(Smi::Handle(Smi::New(0)));
400 __ ReturnTOS();
401 __ Bind(&branch_taken);
402 __ PushConstant(Smi::Handle(Smi::New(42)));
403 __ ReturnTOS();
404 }
405
406
407 ASSEMBLER_TEST_RUN(IfEqStrictNumTOSTakenDouble, test) {
408 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
409 }
410
411
412 ASSEMBLER_TEST_GENERATE(IfEqStrictNumTOSNotTakenDouble, assembler) {
413 Label branch_taken;
414 __ PushConstant(Double::Handle(Double::New(-1.0, Heap::kOld)));
415 __ PushConstant(Double::Handle(Double::New(1.0, Heap::kOld)));
416 __ IfEqStrictNumTOS();
417 __ Jump(&branch_taken);
418 __ PushConstant(Smi::Handle(Smi::New(42)));
419 __ ReturnTOS();
420 __ Bind(&branch_taken);
421 __ PushConstant(Smi::Handle(Smi::New(0)));
422 __ ReturnTOS();
423 }
424
425
426 ASSEMBLER_TEST_RUN(IfEqStrictNumTOSNotTakenDouble, test) {
427 EXPECT_EQ(42, EXECUTE_TEST_CODE_INTPTR(test->code()));
428 }
429
430 } // namespace dart
431
432 #endif // defined(TARGET_ARCH_DBC)
OLDNEW
« no previous file with comments | « no previous file | runtime/vm/unit_test.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698