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 "test/cctest/cctest.h" | 8 #include "test/cctest/cctest.h" |
9 #include "test/cctest/compiler/codegen-tester.h" | 9 #include "test/cctest/compiler/codegen-tester.h" |
10 #include "test/cctest/compiler/value-helper.h" | 10 #include "test/cctest/compiler/value-helper.h" |
11 | 11 |
12 #if V8_TURBOFAN_TARGET | 12 #if V8_TURBOFAN_TARGET |
13 | 13 |
| 14 #define CHECK_UINT32_EQ(x, y) \ |
| 15 CHECK_EQ(static_cast<int32_t>(x), static_cast<int32_t>(y)) |
| 16 |
14 using namespace v8::internal; | 17 using namespace v8::internal; |
15 using namespace v8::internal::compiler; | 18 using namespace v8::internal::compiler; |
16 | 19 |
17 typedef RawMachineAssembler::Label MLabel; | 20 typedef RawMachineAssembler::Label MLabel; |
18 | 21 |
19 TEST(RunInt32Add) { | 22 TEST(RunInt32Add) { |
20 RawMachineAssemblerTester<int32_t> m; | 23 RawMachineAssemblerTester<int32_t> m; |
21 Node* add = m.Int32Add(m.Int32Constant(0), m.Int32Constant(1)); | 24 Node* add = m.Int32Add(m.Int32Constant(0), m.Int32Constant(1)); |
22 m.Return(add); | 25 m.Return(add); |
23 CHECK_EQ(1, m.Call()); | 26 CHECK_EQ(1, m.Call()); |
(...skipping 10 matching lines...) Expand all Loading... |
34 return m->Int32Constant(0); | 37 return m->Int32Constant(0); |
35 case 3: | 38 case 3: |
36 return m->Int32Constant(1); | 39 return m->Int32Constant(1); |
37 case 4: | 40 case 4: |
38 return m->Int32Constant(-1); | 41 return m->Int32Constant(-1); |
39 case 5: | 42 case 5: |
40 return m->Int32Constant(0xff); | 43 return m->Int32Constant(0xff); |
41 case 6: | 44 case 6: |
42 return m->Int32Constant(0x01234567); | 45 return m->Int32Constant(0x01234567); |
43 case 7: | 46 case 7: |
44 return m->Load(kMachineWord32, m->PointerConstant(NULL)); | 47 return m->Load(kMachInt32, m->PointerConstant(NULL)); |
45 default: | 48 default: |
46 return NULL; | 49 return NULL; |
47 } | 50 } |
48 } | 51 } |
49 | 52 |
50 | 53 |
51 TEST(CodeGenInt32Binop) { | 54 TEST(CodeGenInt32Binop) { |
52 RawMachineAssemblerTester<void> m; | 55 RawMachineAssemblerTester<void> m; |
53 | 56 |
54 Operator* ops[] = { | 57 Operator* ops[] = { |
55 m.machine()->Word32And(), m.machine()->Word32Or(), | 58 m.machine()->Word32And(), m.machine()->Word32Or(), |
56 m.machine()->Word32Xor(), m.machine()->Word32Shl(), | 59 m.machine()->Word32Xor(), m.machine()->Word32Shl(), |
57 m.machine()->Word32Shr(), m.machine()->Word32Sar(), | 60 m.machine()->Word32Shr(), m.machine()->Word32Sar(), |
58 m.machine()->Word32Equal(), m.machine()->Int32Add(), | 61 m.machine()->Word32Equal(), m.machine()->Int32Add(), |
59 m.machine()->Int32Sub(), m.machine()->Int32Mul(), | 62 m.machine()->Int32Sub(), m.machine()->Int32Mul(), |
60 m.machine()->Int32Div(), m.machine()->Int32UDiv(), | 63 m.machine()->Int32Div(), m.machine()->Int32UDiv(), |
61 m.machine()->Int32Mod(), m.machine()->Int32UMod(), | 64 m.machine()->Int32Mod(), m.machine()->Int32UMod(), |
62 m.machine()->Int32LessThan(), m.machine()->Int32LessThanOrEqual(), | 65 m.machine()->Int32LessThan(), m.machine()->Int32LessThanOrEqual(), |
63 m.machine()->Uint32LessThan(), m.machine()->Uint32LessThanOrEqual(), | 66 m.machine()->Uint32LessThan(), m.machine()->Uint32LessThanOrEqual(), |
64 NULL}; | 67 NULL}; |
65 | 68 |
66 for (int i = 0; ops[i] != NULL; i++) { | 69 for (int i = 0; ops[i] != NULL; i++) { |
67 for (int j = 0; j < 8; j++) { | 70 for (int j = 0; j < 8; j++) { |
68 for (int k = 0; k < 8; k++) { | 71 for (int k = 0; k < 8; k++) { |
69 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32); | 72 RawMachineAssemblerTester<int32_t> m(kMachInt32, kMachInt32); |
70 Node* a = Int32Input(&m, j); | 73 Node* a = Int32Input(&m, j); |
71 Node* b = Int32Input(&m, k); | 74 Node* b = Int32Input(&m, k); |
72 m.Return(m.NewNode(ops[i], a, b)); | 75 m.Return(m.NewNode(ops[i], a, b)); |
73 m.GenerateCode(); | 76 m.GenerateCode(); |
74 } | 77 } |
75 } | 78 } |
76 } | 79 } |
77 } | 80 } |
78 | 81 |
79 | 82 |
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
211 m->Bind(&blockb); | 214 m->Bind(&blockb); |
212 m->Goto(end); | 215 m->Goto(end); |
213 | 216 |
214 m->Bind(end); | 217 m->Bind(end); |
215 Node* phi = m->Phi(true_node, false_node); | 218 Node* phi = m->Phi(true_node, false_node); |
216 m->Return(phi); | 219 m->Return(phi); |
217 } | 220 } |
218 | 221 |
219 | 222 |
220 TEST(RunDiamondPhiConst) { | 223 TEST(RunDiamondPhiConst) { |
221 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 224 RawMachineAssemblerTester<int32_t> m(kMachInt32); |
222 int false_val = 0xFF666; | 225 int false_val = 0xFF666; |
223 int true_val = 0x00DDD; | 226 int true_val = 0x00DDD; |
224 Node* true_node = m.Int32Constant(true_val); | 227 Node* true_node = m.Int32Constant(true_val); |
225 Node* false_node = m.Int32Constant(false_val); | 228 Node* false_node = m.Int32Constant(false_val); |
226 BuildDiamondPhi(&m, m.Parameter(0), true_node, false_node); | 229 BuildDiamondPhi(&m, m.Parameter(0), true_node, false_node); |
227 CHECK_EQ(false_val, m.Call(0)); | 230 CHECK_EQ(false_val, m.Call(0)); |
228 CHECK_EQ(true_val, m.Call(1)); | 231 CHECK_EQ(true_val, m.Call(1)); |
229 } | 232 } |
230 | 233 |
231 | 234 |
232 TEST(RunDiamondPhiNumber) { | 235 TEST(RunDiamondPhiNumber) { |
233 RawMachineAssemblerTester<Object*> m(kMachineWord32); | 236 RawMachineAssemblerTester<Object*> m(kMachInt32); |
234 double false_val = -11.1; | 237 double false_val = -11.1; |
235 double true_val = 200.1; | 238 double true_val = 200.1; |
236 Node* true_node = m.NumberConstant(true_val); | 239 Node* true_node = m.NumberConstant(true_val); |
237 Node* false_node = m.NumberConstant(false_val); | 240 Node* false_node = m.NumberConstant(false_val); |
238 BuildDiamondPhi(&m, m.Parameter(0), true_node, false_node); | 241 BuildDiamondPhi(&m, m.Parameter(0), true_node, false_node); |
239 m.CheckNumber(false_val, m.Call(0)); | 242 m.CheckNumber(false_val, m.Call(0)); |
240 m.CheckNumber(true_val, m.Call(1)); | 243 m.CheckNumber(true_val, m.Call(1)); |
241 } | 244 } |
242 | 245 |
243 | 246 |
244 TEST(RunDiamondPhiString) { | 247 TEST(RunDiamondPhiString) { |
245 RawMachineAssemblerTester<Object*> m(kMachineWord32); | 248 RawMachineAssemblerTester<Object*> m(kMachInt32); |
246 const char* false_val = "false"; | 249 const char* false_val = "false"; |
247 const char* true_val = "true"; | 250 const char* true_val = "true"; |
248 Node* true_node = m.StringConstant(true_val); | 251 Node* true_node = m.StringConstant(true_val); |
249 Node* false_node = m.StringConstant(false_val); | 252 Node* false_node = m.StringConstant(false_val); |
250 BuildDiamondPhi(&m, m.Parameter(0), true_node, false_node); | 253 BuildDiamondPhi(&m, m.Parameter(0), true_node, false_node); |
251 m.CheckString(false_val, m.Call(0)); | 254 m.CheckString(false_val, m.Call(0)); |
252 m.CheckString(true_val, m.Call(1)); | 255 m.CheckString(true_val, m.Call(1)); |
253 } | 256 } |
254 | 257 |
255 | 258 |
256 TEST(RunDiamondPhiParam) { | 259 TEST(RunDiamondPhiParam) { |
257 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, | 260 RawMachineAssemblerTester<int32_t> m(kMachInt32, kMachInt32, kMachInt32); |
258 kMachineWord32); | |
259 BuildDiamondPhi(&m, m.Parameter(0), m.Parameter(1), m.Parameter(2)); | 261 BuildDiamondPhi(&m, m.Parameter(0), m.Parameter(1), m.Parameter(2)); |
260 int32_t c1 = 0x260cb75a; | 262 int32_t c1 = 0x260cb75a; |
261 int32_t c2 = 0xcd3e9c8b; | 263 int32_t c2 = 0xcd3e9c8b; |
262 int result = m.Call(0, c1, c2); | 264 int result = m.Call(0, c1, c2); |
263 CHECK_EQ(c2, result); | 265 CHECK_EQ(c2, result); |
264 result = m.Call(1, c1, c2); | 266 result = m.Call(1, c1, c2); |
265 CHECK_EQ(c1, result); | 267 CHECK_EQ(c1, result); |
266 } | 268 } |
267 | 269 |
268 | 270 |
(...skipping 17 matching lines...) Expand all Loading... |
286 m.Bind(&body); | 288 m.Bind(&body); |
287 m.Goto(&header); | 289 m.Goto(&header); |
288 m.Bind(end); | 290 m.Bind(end); |
289 m.Return(phi); | 291 m.Return(phi); |
290 | 292 |
291 CHECK_EQ(false_val, m.Call()); | 293 CHECK_EQ(false_val, m.Call()); |
292 } | 294 } |
293 | 295 |
294 | 296 |
295 TEST(RunLoopPhiParam) { | 297 TEST(RunLoopPhiParam) { |
296 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, | 298 RawMachineAssemblerTester<int32_t> m(kMachInt32, kMachInt32, kMachInt32); |
297 kMachineWord32); | |
298 | 299 |
299 MLabel blocka, blockb; | 300 MLabel blocka, blockb; |
300 MLabel* end = m.Exit(); | 301 MLabel* end = m.Exit(); |
301 | 302 |
302 m.Goto(&blocka); | 303 m.Goto(&blocka); |
303 | 304 |
304 m.Bind(&blocka); | 305 m.Bind(&blocka); |
305 Node* phi = m.Phi(m.Parameter(1), m.Parameter(2)); | 306 Node* phi = m.Phi(m.Parameter(1), m.Parameter(2)); |
306 Node* cond = m.Phi(m.Parameter(0), m.Int32Constant(0)); | 307 Node* cond = m.Phi(m.Parameter(0), m.Int32Constant(0)); |
307 m.Branch(cond, &blockb, end); | 308 m.Branch(cond, &blockb, end); |
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
485 m.Return(m.ChangeFloat64ToInt32(phi)); | 486 m.Return(m.ChangeFloat64ToInt32(phi)); |
486 | 487 |
487 CHECK_EQ(10, m.Call()); | 488 CHECK_EQ(10, m.Call()); |
488 } | 489 } |
489 | 490 |
490 | 491 |
491 TEST(RunLoadInt32) { | 492 TEST(RunLoadInt32) { |
492 RawMachineAssemblerTester<int32_t> m; | 493 RawMachineAssemblerTester<int32_t> m; |
493 | 494 |
494 int32_t p1 = 0; // loads directly from this location. | 495 int32_t p1 = 0; // loads directly from this location. |
495 m.Return(m.LoadFromPointer(&p1, kMachineWord32)); | 496 m.Return(m.LoadFromPointer(&p1, kMachInt32)); |
496 | 497 |
497 FOR_INT32_INPUTS(i) { | 498 FOR_INT32_INPUTS(i) { |
498 p1 = *i; | 499 p1 = *i; |
499 CHECK_EQ(p1, m.Call()); | 500 CHECK_EQ(p1, m.Call()); |
500 } | 501 } |
501 } | 502 } |
502 | 503 |
503 | 504 |
504 TEST(RunLoadInt32Offset) { | 505 TEST(RunLoadInt32Offset) { |
505 int32_t p1 = 0; // loads directly from this location. | 506 int32_t p1 = 0; // loads directly from this location. |
506 | 507 |
507 int32_t offsets[] = {-2000000, -100, -101, 1, 3, | 508 int32_t offsets[] = {-2000000, -100, -101, 1, 3, |
508 7, 120, 2000, 2000000000, 0xff}; | 509 7, 120, 2000, 2000000000, 0xff}; |
509 | 510 |
510 for (size_t i = 0; i < ARRAY_SIZE(offsets); i++) { | 511 for (size_t i = 0; i < ARRAY_SIZE(offsets); i++) { |
511 RawMachineAssemblerTester<int32_t> m; | 512 RawMachineAssemblerTester<int32_t> m; |
512 int32_t offset = offsets[i]; | 513 int32_t offset = offsets[i]; |
513 byte* pointer = reinterpret_cast<byte*>(&p1) - offset; | 514 byte* pointer = reinterpret_cast<byte*>(&p1) - offset; |
514 // generate load [#base + #index] | 515 // generate load [#base + #index] |
515 m.Return(m.LoadFromPointer(pointer, kMachineWord32, offset)); | 516 m.Return(m.LoadFromPointer(pointer, kMachInt32, offset)); |
516 | 517 |
517 FOR_INT32_INPUTS(j) { | 518 FOR_INT32_INPUTS(j) { |
518 p1 = *j; | 519 p1 = *j; |
519 CHECK_EQ(p1, m.Call()); | 520 CHECK_EQ(p1, m.Call()); |
520 } | 521 } |
521 } | 522 } |
522 } | 523 } |
523 | 524 |
524 | 525 |
525 TEST(RunLoadStoreFloat64Offset) { | 526 TEST(RunLoadStoreFloat64Offset) { |
526 double p1 = 0; // loads directly from this location. | 527 double p1 = 0; // loads directly from this location. |
527 double p2 = 0; // and stores directly into this location. | 528 double p2 = 0; // and stores directly into this location. |
528 | 529 |
529 FOR_INT32_INPUTS(i) { | 530 FOR_INT32_INPUTS(i) { |
530 int32_t magic = 0x2342aabb + *i * 3; | 531 int32_t magic = 0x2342aabb + *i * 3; |
531 RawMachineAssemblerTester<int32_t> m; | 532 RawMachineAssemblerTester<int32_t> m; |
532 int32_t offset = *i; | 533 int32_t offset = *i; |
533 byte* from = reinterpret_cast<byte*>(&p1) - offset; | 534 byte* from = reinterpret_cast<byte*>(&p1) - offset; |
534 byte* to = reinterpret_cast<byte*>(&p2) - offset; | 535 byte* to = reinterpret_cast<byte*>(&p2) - offset; |
535 // generate load [#base + #index] | 536 // generate load [#base + #index] |
536 Node* load = m.Load(kMachineFloat64, m.PointerConstant(from), | 537 Node* load = |
537 m.Int32Constant(offset)); | 538 m.Load(kMachFloat64, m.PointerConstant(from), m.Int32Constant(offset)); |
538 m.Store(kMachineFloat64, m.PointerConstant(to), m.Int32Constant(offset), | 539 m.Store(kMachFloat64, m.PointerConstant(to), m.Int32Constant(offset), load); |
539 load); | |
540 m.Return(m.Int32Constant(magic)); | 540 m.Return(m.Int32Constant(magic)); |
541 | 541 |
542 FOR_FLOAT64_INPUTS(j) { | 542 FOR_FLOAT64_INPUTS(j) { |
543 p1 = *j; | 543 p1 = *j; |
544 p2 = *j - 5; | 544 p2 = *j - 5; |
545 CHECK_EQ(magic, m.Call()); | 545 CHECK_EQ(magic, m.Call()); |
546 CHECK_EQ(p1, p2); | 546 CHECK_EQ(p1, p2); |
547 } | 547 } |
548 } | 548 } |
549 } | 549 } |
(...skipping 10 matching lines...) Expand all Loading... |
560 // Use uint32_t because signed overflow is UB in C. | 560 // Use uint32_t because signed overflow is UB in C. |
561 int expected = static_cast<int32_t>(*i + *j); | 561 int expected = static_cast<int32_t>(*i + *j); |
562 CHECK_EQ(expected, bt.call(*i, *j)); | 562 CHECK_EQ(expected, bt.call(*i, *j)); |
563 } | 563 } |
564 } | 564 } |
565 } | 565 } |
566 | 566 |
567 | 567 |
568 TEST(RunInt32AddAndWord32SarP) { | 568 TEST(RunInt32AddAndWord32SarP) { |
569 { | 569 { |
570 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, | 570 RawMachineAssemblerTester<int32_t> m(kMachUint32, kMachInt32, kMachUint32); |
571 kMachineWord32); | |
572 m.Return(m.Int32Add(m.Parameter(0), | 571 m.Return(m.Int32Add(m.Parameter(0), |
573 m.Word32Sar(m.Parameter(1), m.Parameter(2)))); | 572 m.Word32Sar(m.Parameter(1), m.Parameter(2)))); |
574 FOR_UINT32_INPUTS(i) { | 573 FOR_UINT32_INPUTS(i) { |
575 FOR_INT32_INPUTS(j) { | 574 FOR_INT32_INPUTS(j) { |
576 FOR_UINT32_SHIFTS(shift) { | 575 FOR_UINT32_SHIFTS(shift) { |
577 // Use uint32_t because signed overflow is UB in C. | 576 // Use uint32_t because signed overflow is UB in C. |
578 int32_t expected = *i + (*j >> shift); | 577 int32_t expected = *i + (*j >> shift); |
579 CHECK_EQ(expected, m.Call(*i, *j, shift)); | 578 CHECK_EQ(expected, m.Call(*i, *j, shift)); |
580 } | 579 } |
581 } | 580 } |
582 } | 581 } |
583 } | 582 } |
584 { | 583 { |
585 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, | 584 RawMachineAssemblerTester<int32_t> m(kMachInt32, kMachUint32, kMachUint32); |
586 kMachineWord32); | |
587 m.Return(m.Int32Add(m.Word32Sar(m.Parameter(0), m.Parameter(1)), | 585 m.Return(m.Int32Add(m.Word32Sar(m.Parameter(0), m.Parameter(1)), |
588 m.Parameter(2))); | 586 m.Parameter(2))); |
589 FOR_INT32_INPUTS(i) { | 587 FOR_INT32_INPUTS(i) { |
590 FOR_UINT32_SHIFTS(shift) { | 588 FOR_UINT32_SHIFTS(shift) { |
591 FOR_UINT32_INPUTS(k) { | 589 FOR_UINT32_INPUTS(k) { |
592 // Use uint32_t because signed overflow is UB in C. | 590 // Use uint32_t because signed overflow is UB in C. |
593 int32_t expected = (*i >> shift) + *k; | 591 int32_t expected = (*i >> shift) + *k; |
594 CHECK_EQ(expected, m.Call(*i, shift, *k)); | 592 CHECK_EQ(expected, m.Call(*i, shift, *k)); |
595 } | 593 } |
596 } | 594 } |
597 } | 595 } |
598 } | 596 } |
599 } | 597 } |
600 | 598 |
601 | 599 |
602 TEST(RunInt32AddAndWord32ShlP) { | 600 TEST(RunInt32AddAndWord32ShlP) { |
603 { | 601 { |
604 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, | 602 RawMachineAssemblerTester<int32_t> m(kMachUint32, kMachInt32, kMachUint32); |
605 kMachineWord32); | |
606 m.Return(m.Int32Add(m.Parameter(0), | 603 m.Return(m.Int32Add(m.Parameter(0), |
607 m.Word32Shl(m.Parameter(1), m.Parameter(2)))); | 604 m.Word32Shl(m.Parameter(1), m.Parameter(2)))); |
608 FOR_UINT32_INPUTS(i) { | 605 FOR_UINT32_INPUTS(i) { |
609 FOR_INT32_INPUTS(j) { | 606 FOR_INT32_INPUTS(j) { |
610 FOR_UINT32_SHIFTS(shift) { | 607 FOR_UINT32_SHIFTS(shift) { |
611 // Use uint32_t because signed overflow is UB in C. | 608 // Use uint32_t because signed overflow is UB in C. |
612 int32_t expected = *i + (*j << shift); | 609 int32_t expected = *i + (*j << shift); |
613 CHECK_EQ(expected, m.Call(*i, *j, shift)); | 610 CHECK_EQ(expected, m.Call(*i, *j, shift)); |
614 } | 611 } |
615 } | 612 } |
616 } | 613 } |
617 } | 614 } |
618 { | 615 { |
619 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, | 616 RawMachineAssemblerTester<int32_t> m(kMachInt32, kMachUint32, kMachUint32); |
620 kMachineWord32); | |
621 m.Return(m.Int32Add(m.Word32Shl(m.Parameter(0), m.Parameter(1)), | 617 m.Return(m.Int32Add(m.Word32Shl(m.Parameter(0), m.Parameter(1)), |
622 m.Parameter(2))); | 618 m.Parameter(2))); |
623 FOR_INT32_INPUTS(i) { | 619 FOR_INT32_INPUTS(i) { |
624 FOR_UINT32_SHIFTS(shift) { | 620 FOR_UINT32_SHIFTS(shift) { |
625 FOR_UINT32_INPUTS(k) { | 621 FOR_UINT32_INPUTS(k) { |
626 // Use uint32_t because signed overflow is UB in C. | 622 // Use uint32_t because signed overflow is UB in C. |
627 int32_t expected = (*i << shift) + *k; | 623 int32_t expected = (*i << shift) + *k; |
628 CHECK_EQ(expected, m.Call(*i, shift, *k)); | 624 CHECK_EQ(expected, m.Call(*i, shift, *k)); |
629 } | 625 } |
630 } | 626 } |
631 } | 627 } |
632 } | 628 } |
633 } | 629 } |
634 | 630 |
635 | 631 |
636 TEST(RunInt32AddAndWord32ShrP) { | 632 TEST(RunInt32AddAndWord32ShrP) { |
637 { | 633 { |
638 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, | 634 RawMachineAssemblerTester<int32_t> m(kMachUint32, kMachUint32, kMachUint32); |
639 kMachineWord32); | |
640 m.Return(m.Int32Add(m.Parameter(0), | 635 m.Return(m.Int32Add(m.Parameter(0), |
641 m.Word32Shr(m.Parameter(1), m.Parameter(2)))); | 636 m.Word32Shr(m.Parameter(1), m.Parameter(2)))); |
642 FOR_UINT32_INPUTS(i) { | 637 FOR_UINT32_INPUTS(i) { |
643 FOR_UINT32_INPUTS(j) { | 638 FOR_UINT32_INPUTS(j) { |
644 FOR_UINT32_SHIFTS(shift) { | 639 FOR_UINT32_SHIFTS(shift) { |
645 // Use uint32_t because signed overflow is UB in C. | 640 // Use uint32_t because signed overflow is UB in C. |
646 int32_t expected = *i + (*j >> shift); | 641 int32_t expected = *i + (*j >> shift); |
647 CHECK_EQ(expected, m.Call(*i, *j, shift)); | 642 CHECK_EQ(expected, m.Call(*i, *j, shift)); |
648 } | 643 } |
649 } | 644 } |
650 } | 645 } |
651 } | 646 } |
652 { | 647 { |
653 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, | 648 RawMachineAssemblerTester<int32_t> m(kMachUint32, kMachUint32, kMachUint32); |
654 kMachineWord32); | |
655 m.Return(m.Int32Add(m.Word32Shr(m.Parameter(0), m.Parameter(1)), | 649 m.Return(m.Int32Add(m.Word32Shr(m.Parameter(0), m.Parameter(1)), |
656 m.Parameter(2))); | 650 m.Parameter(2))); |
657 FOR_UINT32_INPUTS(i) { | 651 FOR_UINT32_INPUTS(i) { |
658 FOR_UINT32_SHIFTS(shift) { | 652 FOR_UINT32_SHIFTS(shift) { |
659 FOR_UINT32_INPUTS(k) { | 653 FOR_UINT32_INPUTS(k) { |
660 // Use uint32_t because signed overflow is UB in C. | 654 // Use uint32_t because signed overflow is UB in C. |
661 int32_t expected = (*i >> shift) + *k; | 655 int32_t expected = (*i >> shift) + *k; |
662 CHECK_EQ(expected, m.Call(*i, shift, *k)); | 656 CHECK_EQ(expected, m.Call(*i, shift, *k)); |
663 } | 657 } |
664 } | 658 } |
665 } | 659 } |
666 } | 660 } |
667 } | 661 } |
668 | 662 |
669 | 663 |
670 TEST(RunInt32AddInBranch) { | 664 TEST(RunInt32AddInBranch) { |
671 static const int32_t constant = 987654321; | 665 static const int32_t constant = 987654321; |
672 { | 666 { |
673 RawMachineAssemblerTester<int32_t> m; | 667 RawMachineAssemblerTester<int32_t> m; |
674 Int32BinopTester bt(&m); | 668 Uint32BinopTester bt(&m); |
675 MLabel blocka, blockb; | 669 MLabel blocka, blockb; |
676 m.Branch( | 670 m.Branch( |
677 m.Word32Equal(m.Int32Add(bt.param0, bt.param1), m.Int32Constant(0)), | 671 m.Word32Equal(m.Int32Add(bt.param0, bt.param1), m.Int32Constant(0)), |
678 &blocka, &blockb); | 672 &blocka, &blockb); |
679 m.Bind(&blocka); | 673 m.Bind(&blocka); |
680 bt.AddReturn(m.Int32Constant(constant)); | 674 bt.AddReturn(m.Int32Constant(constant)); |
681 m.Bind(&blockb); | 675 m.Bind(&blockb); |
682 bt.AddReturn(m.Int32Constant(0 - constant)); | 676 bt.AddReturn(m.Int32Constant(0 - constant)); |
683 FOR_UINT32_INPUTS(i) { | 677 FOR_UINT32_INPUTS(i) { |
684 FOR_UINT32_INPUTS(j) { | 678 FOR_UINT32_INPUTS(j) { |
685 int32_t expected = (*i + *j) == 0 ? constant : 0 - constant; | 679 int32_t expected = (*i + *j) == 0 ? constant : 0 - constant; |
686 CHECK_EQ(expected, bt.call(*i, *j)); | 680 CHECK_EQ(expected, bt.call(*i, *j)); |
687 } | 681 } |
688 } | 682 } |
689 } | 683 } |
690 { | 684 { |
691 RawMachineAssemblerTester<int32_t> m; | 685 RawMachineAssemblerTester<int32_t> m; |
692 Int32BinopTester bt(&m); | 686 Uint32BinopTester bt(&m); |
693 MLabel blocka, blockb; | 687 MLabel blocka, blockb; |
694 m.Branch( | 688 m.Branch( |
695 m.Word32NotEqual(m.Int32Add(bt.param0, bt.param1), m.Int32Constant(0)), | 689 m.Word32NotEqual(m.Int32Add(bt.param0, bt.param1), m.Int32Constant(0)), |
696 &blocka, &blockb); | 690 &blocka, &blockb); |
697 m.Bind(&blocka); | 691 m.Bind(&blocka); |
698 bt.AddReturn(m.Int32Constant(constant)); | 692 bt.AddReturn(m.Int32Constant(constant)); |
699 m.Bind(&blockb); | 693 m.Bind(&blockb); |
700 bt.AddReturn(m.Int32Constant(0 - constant)); | 694 bt.AddReturn(m.Int32Constant(0 - constant)); |
701 FOR_UINT32_INPUTS(i) { | 695 FOR_UINT32_INPUTS(i) { |
702 FOR_UINT32_INPUTS(j) { | 696 FOR_UINT32_INPUTS(j) { |
703 int32_t expected = (*i + *j) != 0 ? constant : 0 - constant; | 697 int32_t expected = (*i + *j) != 0 ? constant : 0 - constant; |
704 CHECK_EQ(expected, bt.call(*i, *j)); | 698 CHECK_EQ(expected, bt.call(*i, *j)); |
705 } | 699 } |
706 } | 700 } |
707 } | 701 } |
708 { | 702 { |
709 FOR_UINT32_INPUTS(i) { | 703 FOR_UINT32_INPUTS(i) { |
710 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 704 RawMachineAssemblerTester<uint32_t> m(kMachUint32); |
711 MLabel blocka, blockb; | 705 MLabel blocka, blockb; |
712 m.Branch(m.Word32Equal(m.Int32Add(m.Int32Constant(*i), m.Parameter(0)), | 706 m.Branch(m.Word32Equal(m.Int32Add(m.Int32Constant(*i), m.Parameter(0)), |
713 m.Int32Constant(0)), | 707 m.Int32Constant(0)), |
714 &blocka, &blockb); | 708 &blocka, &blockb); |
715 m.Bind(&blocka); | 709 m.Bind(&blocka); |
716 m.Return(m.Int32Constant(constant)); | 710 m.Return(m.Int32Constant(constant)); |
717 m.Bind(&blockb); | 711 m.Bind(&blockb); |
718 m.Return(m.Int32Constant(0 - constant)); | 712 m.Return(m.Int32Constant(0 - constant)); |
719 FOR_UINT32_INPUTS(j) { | 713 FOR_UINT32_INPUTS(j) { |
720 int32_t expected = (*i + *j) == 0 ? constant : 0 - constant; | 714 uint32_t expected = (*i + *j) == 0 ? constant : 0 - constant; |
721 CHECK_EQ(expected, m.Call(*j)); | 715 CHECK_UINT32_EQ(expected, m.Call(*j)); |
722 } | 716 } |
723 } | 717 } |
724 } | 718 } |
725 { | 719 { |
726 FOR_UINT32_INPUTS(i) { | 720 FOR_UINT32_INPUTS(i) { |
727 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 721 RawMachineAssemblerTester<uint32_t> m(kMachUint32); |
728 MLabel blocka, blockb; | 722 MLabel blocka, blockb; |
729 m.Branch(m.Word32NotEqual(m.Int32Add(m.Int32Constant(*i), m.Parameter(0)), | 723 m.Branch(m.Word32NotEqual(m.Int32Add(m.Int32Constant(*i), m.Parameter(0)), |
730 m.Int32Constant(0)), | 724 m.Int32Constant(0)), |
731 &blocka, &blockb); | 725 &blocka, &blockb); |
732 m.Bind(&blocka); | 726 m.Bind(&blocka); |
733 m.Return(m.Int32Constant(constant)); | 727 m.Return(m.Int32Constant(constant)); |
734 m.Bind(&blockb); | 728 m.Bind(&blockb); |
735 m.Return(m.Int32Constant(0 - constant)); | 729 m.Return(m.Int32Constant(0 - constant)); |
736 FOR_UINT32_INPUTS(j) { | 730 FOR_UINT32_INPUTS(j) { |
737 int32_t expected = (*i + *j) != 0 ? constant : 0 - constant; | 731 uint32_t expected = (*i + *j) != 0 ? constant : 0 - constant; |
738 CHECK_EQ(expected, m.Call(*j)); | 732 CHECK_UINT32_EQ(expected, m.Call(*j)); |
739 } | 733 } |
740 } | 734 } |
741 } | 735 } |
742 { | 736 { |
743 RawMachineAssemblerTester<void> m; | 737 RawMachineAssemblerTester<void> m; |
744 Operator* shops[] = {m.machine()->Word32Sar(), m.machine()->Word32Shl(), | 738 Operator* shops[] = {m.machine()->Word32Sar(), m.machine()->Word32Shl(), |
745 m.machine()->Word32Shr()}; | 739 m.machine()->Word32Shr()}; |
746 for (size_t n = 0; n < ARRAY_SIZE(shops); n++) { | 740 for (size_t n = 0; n < ARRAY_SIZE(shops); n++) { |
747 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, | 741 RawMachineAssemblerTester<int32_t> m(kMachUint32, kMachInt32, |
748 kMachineWord32); | 742 kMachUint32); |
749 MLabel blocka, blockb; | 743 MLabel blocka, blockb; |
750 m.Branch(m.Word32Equal(m.Int32Add(m.Parameter(0), | 744 m.Branch(m.Word32Equal(m.Int32Add(m.Parameter(0), |
751 m.NewNode(shops[n], m.Parameter(1), | 745 m.NewNode(shops[n], m.Parameter(1), |
752 m.Parameter(2))), | 746 m.Parameter(2))), |
753 m.Int32Constant(0)), | 747 m.Int32Constant(0)), |
754 &blocka, &blockb); | 748 &blocka, &blockb); |
755 m.Bind(&blocka); | 749 m.Bind(&blocka); |
756 m.Return(m.Int32Constant(constant)); | 750 m.Return(m.Int32Constant(constant)); |
757 m.Bind(&blockb); | 751 m.Bind(&blockb); |
758 m.Return(m.Int32Constant(0 - constant)); | 752 m.Return(m.Int32Constant(0 - constant)); |
(...skipping 20 matching lines...) Expand all Loading... |
779 } | 773 } |
780 } | 774 } |
781 } | 775 } |
782 } | 776 } |
783 } | 777 } |
784 | 778 |
785 | 779 |
786 TEST(RunInt32AddInComparison) { | 780 TEST(RunInt32AddInComparison) { |
787 { | 781 { |
788 RawMachineAssemblerTester<int32_t> m; | 782 RawMachineAssemblerTester<int32_t> m; |
789 Int32BinopTester bt(&m); | 783 Uint32BinopTester bt(&m); |
790 bt.AddReturn( | 784 bt.AddReturn( |
791 m.Word32Equal(m.Int32Add(bt.param0, bt.param1), m.Int32Constant(0))); | 785 m.Word32Equal(m.Int32Add(bt.param0, bt.param1), m.Int32Constant(0))); |
792 FOR_UINT32_INPUTS(i) { | 786 FOR_UINT32_INPUTS(i) { |
793 FOR_UINT32_INPUTS(j) { | 787 FOR_UINT32_INPUTS(j) { |
794 int32_t expected = (*i + *j) == 0; | 788 uint32_t expected = (*i + *j) == 0; |
795 CHECK_EQ(expected, bt.call(*i, *j)); | 789 CHECK_UINT32_EQ(expected, bt.call(*i, *j)); |
796 } | 790 } |
797 } | 791 } |
798 } | 792 } |
799 { | 793 { |
800 RawMachineAssemblerTester<int32_t> m; | 794 RawMachineAssemblerTester<int32_t> m; |
801 Int32BinopTester bt(&m); | 795 Uint32BinopTester bt(&m); |
802 bt.AddReturn( | 796 bt.AddReturn( |
803 m.Word32Equal(m.Int32Constant(0), m.Int32Add(bt.param0, bt.param1))); | 797 m.Word32Equal(m.Int32Constant(0), m.Int32Add(bt.param0, bt.param1))); |
804 FOR_UINT32_INPUTS(i) { | 798 FOR_UINT32_INPUTS(i) { |
805 FOR_UINT32_INPUTS(j) { | 799 FOR_UINT32_INPUTS(j) { |
806 int32_t expected = (*i + *j) == 0; | 800 uint32_t expected = (*i + *j) == 0; |
807 CHECK_EQ(expected, bt.call(*i, *j)); | 801 CHECK_UINT32_EQ(expected, bt.call(*i, *j)); |
808 } | 802 } |
809 } | 803 } |
810 } | 804 } |
811 { | 805 { |
812 FOR_UINT32_INPUTS(i) { | 806 FOR_UINT32_INPUTS(i) { |
813 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 807 RawMachineAssemblerTester<uint32_t> m(kMachUint32); |
814 m.Return(m.Word32Equal(m.Int32Add(m.Int32Constant(*i), m.Parameter(0)), | 808 m.Return(m.Word32Equal(m.Int32Add(m.Int32Constant(*i), m.Parameter(0)), |
815 m.Int32Constant(0))); | 809 m.Int32Constant(0))); |
816 FOR_UINT32_INPUTS(j) { | 810 FOR_UINT32_INPUTS(j) { |
817 int32_t expected = (*i + *j) == 0; | 811 uint32_t expected = (*i + *j) == 0; |
818 CHECK_EQ(expected, m.Call(*j)); | 812 CHECK_UINT32_EQ(expected, m.Call(*j)); |
819 } | 813 } |
820 } | 814 } |
821 } | 815 } |
822 { | 816 { |
823 FOR_UINT32_INPUTS(i) { | 817 FOR_UINT32_INPUTS(i) { |
824 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 818 RawMachineAssemblerTester<uint32_t> m(kMachUint32); |
825 m.Return(m.Word32Equal(m.Int32Add(m.Parameter(0), m.Int32Constant(*i)), | 819 m.Return(m.Word32Equal(m.Int32Add(m.Parameter(0), m.Int32Constant(*i)), |
826 m.Int32Constant(0))); | 820 m.Int32Constant(0))); |
827 FOR_UINT32_INPUTS(j) { | 821 FOR_UINT32_INPUTS(j) { |
828 int32_t expected = (*j + *i) == 0; | 822 uint32_t expected = (*j + *i) == 0; |
829 CHECK_EQ(expected, m.Call(*j)); | 823 CHECK_UINT32_EQ(expected, m.Call(*j)); |
830 } | 824 } |
831 } | 825 } |
832 } | 826 } |
833 { | 827 { |
834 RawMachineAssemblerTester<void> m; | 828 RawMachineAssemblerTester<void> m; |
835 Operator* shops[] = {m.machine()->Word32Sar(), m.machine()->Word32Shl(), | 829 Operator* shops[] = {m.machine()->Word32Sar(), m.machine()->Word32Shl(), |
836 m.machine()->Word32Shr()}; | 830 m.machine()->Word32Shr()}; |
837 for (size_t n = 0; n < ARRAY_SIZE(shops); n++) { | 831 for (size_t n = 0; n < ARRAY_SIZE(shops); n++) { |
838 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, | 832 RawMachineAssemblerTester<int32_t> m(kMachUint32, kMachInt32, |
839 kMachineWord32); | 833 kMachUint32); |
840 m.Return(m.Word32Equal( | 834 m.Return(m.Word32Equal( |
841 m.Int32Add(m.Parameter(0), | 835 m.Int32Add(m.Parameter(0), |
842 m.NewNode(shops[n], m.Parameter(1), m.Parameter(2))), | 836 m.NewNode(shops[n], m.Parameter(1), m.Parameter(2))), |
843 m.Int32Constant(0))); | 837 m.Int32Constant(0))); |
844 FOR_UINT32_INPUTS(i) { | 838 FOR_UINT32_INPUTS(i) { |
845 FOR_INT32_INPUTS(j) { | 839 FOR_INT32_INPUTS(j) { |
846 FOR_UINT32_SHIFTS(shift) { | 840 FOR_UINT32_SHIFTS(shift) { |
847 int32_t right; | 841 int32_t right; |
848 switch (shops[n]->opcode()) { | 842 switch (shops[n]->opcode()) { |
849 default: | 843 default: |
(...skipping 13 matching lines...) Expand all Loading... |
863 } | 857 } |
864 } | 858 } |
865 } | 859 } |
866 } | 860 } |
867 } | 861 } |
868 } | 862 } |
869 | 863 |
870 | 864 |
871 TEST(RunInt32SubP) { | 865 TEST(RunInt32SubP) { |
872 RawMachineAssemblerTester<int32_t> m; | 866 RawMachineAssemblerTester<int32_t> m; |
873 Int32BinopTester bt(&m); | 867 Uint32BinopTester bt(&m); |
874 | 868 |
875 m.Return(m.Int32Sub(bt.param0, bt.param1)); | 869 m.Return(m.Int32Sub(bt.param0, bt.param1)); |
876 | 870 |
877 FOR_UINT32_INPUTS(i) { | 871 FOR_UINT32_INPUTS(i) { |
878 FOR_UINT32_INPUTS(j) { | 872 FOR_UINT32_INPUTS(j) { |
879 // Use uint32_t because signed overflow is UB in C. | 873 uint32_t expected = static_cast<int32_t>(*i - *j); |
880 int expected = static_cast<int32_t>(*i - *j); | 874 CHECK_UINT32_EQ(expected, bt.call(*i, *j)); |
881 CHECK_EQ(expected, bt.call(*i, *j)); | |
882 } | 875 } |
883 } | 876 } |
884 } | 877 } |
885 | 878 |
886 | 879 |
887 TEST(RunInt32SubImm) { | 880 TEST(RunInt32SubImm) { |
888 { | 881 { |
889 FOR_UINT32_INPUTS(i) { | 882 FOR_UINT32_INPUTS(i) { |
890 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 883 RawMachineAssemblerTester<uint32_t> m(kMachUint32); |
891 m.Return(m.Int32Sub(m.Int32Constant(*i), m.Parameter(0))); | 884 m.Return(m.Int32Sub(m.Int32Constant(*i), m.Parameter(0))); |
892 FOR_UINT32_INPUTS(j) { | 885 FOR_UINT32_INPUTS(j) { |
893 // Use uint32_t because signed overflow is UB in C. | 886 uint32_t expected = *i - *j; |
894 int32_t expected = static_cast<int32_t>(*i - *j); | 887 CHECK_UINT32_EQ(expected, m.Call(*j)); |
895 CHECK_EQ(expected, m.Call(*j)); | |
896 } | 888 } |
897 } | 889 } |
898 } | 890 } |
899 { | 891 { |
900 FOR_UINT32_INPUTS(i) { | 892 FOR_UINT32_INPUTS(i) { |
901 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 893 RawMachineAssemblerTester<uint32_t> m(kMachUint32); |
902 m.Return(m.Int32Sub(m.Parameter(0), m.Int32Constant(*i))); | 894 m.Return(m.Int32Sub(m.Parameter(0), m.Int32Constant(*i))); |
903 FOR_UINT32_INPUTS(j) { | 895 FOR_UINT32_INPUTS(j) { |
904 // Use uint32_t because signed overflow is UB in C. | 896 uint32_t expected = *j - *i; |
905 int32_t expected = static_cast<int32_t>(*j - *i); | 897 CHECK_UINT32_EQ(expected, m.Call(*j)); |
906 CHECK_EQ(expected, m.Call(*j)); | |
907 } | 898 } |
908 } | 899 } |
909 } | 900 } |
910 } | 901 } |
911 | 902 |
912 | 903 |
913 TEST(RunInt32SubAndWord32SarP) { | 904 TEST(RunInt32SubAndWord32SarP) { |
914 { | 905 { |
915 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, | 906 RawMachineAssemblerTester<int32_t> m(kMachUint32, kMachInt32, kMachUint32); |
916 kMachineWord32); | |
917 m.Return(m.Int32Sub(m.Parameter(0), | 907 m.Return(m.Int32Sub(m.Parameter(0), |
918 m.Word32Sar(m.Parameter(1), m.Parameter(2)))); | 908 m.Word32Sar(m.Parameter(1), m.Parameter(2)))); |
919 FOR_UINT32_INPUTS(i) { | 909 FOR_UINT32_INPUTS(i) { |
920 FOR_INT32_INPUTS(j) { | 910 FOR_INT32_INPUTS(j) { |
921 FOR_UINT32_SHIFTS(shift) { | 911 FOR_UINT32_SHIFTS(shift) { |
922 // Use uint32_t because signed overflow is UB in C. | |
923 int32_t expected = *i - (*j >> shift); | 912 int32_t expected = *i - (*j >> shift); |
924 CHECK_EQ(expected, m.Call(*i, *j, shift)); | 913 CHECK_EQ(expected, m.Call(*i, *j, shift)); |
925 } | 914 } |
926 } | 915 } |
927 } | 916 } |
928 } | 917 } |
929 { | 918 { |
930 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, | 919 RawMachineAssemblerTester<int32_t> m(kMachInt32, kMachUint32, kMachUint32); |
931 kMachineWord32); | |
932 m.Return(m.Int32Sub(m.Word32Sar(m.Parameter(0), m.Parameter(1)), | 920 m.Return(m.Int32Sub(m.Word32Sar(m.Parameter(0), m.Parameter(1)), |
933 m.Parameter(2))); | 921 m.Parameter(2))); |
934 FOR_INT32_INPUTS(i) { | 922 FOR_INT32_INPUTS(i) { |
935 FOR_UINT32_SHIFTS(shift) { | 923 FOR_UINT32_SHIFTS(shift) { |
936 FOR_UINT32_INPUTS(k) { | 924 FOR_UINT32_INPUTS(k) { |
937 // Use uint32_t because signed overflow is UB in C. | |
938 int32_t expected = (*i >> shift) - *k; | 925 int32_t expected = (*i >> shift) - *k; |
939 CHECK_EQ(expected, m.Call(*i, shift, *k)); | 926 CHECK_EQ(expected, m.Call(*i, shift, *k)); |
940 } | 927 } |
941 } | 928 } |
942 } | 929 } |
943 } | 930 } |
944 } | 931 } |
945 | 932 |
946 | 933 |
947 TEST(RunInt32SubAndWord32ShlP) { | 934 TEST(RunInt32SubAndWord32ShlP) { |
948 { | 935 { |
949 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, | 936 RawMachineAssemblerTester<int32_t> m(kMachUint32, kMachInt32, kMachUint32); |
950 kMachineWord32); | |
951 m.Return(m.Int32Sub(m.Parameter(0), | 937 m.Return(m.Int32Sub(m.Parameter(0), |
952 m.Word32Shl(m.Parameter(1), m.Parameter(2)))); | 938 m.Word32Shl(m.Parameter(1), m.Parameter(2)))); |
953 FOR_UINT32_INPUTS(i) { | 939 FOR_UINT32_INPUTS(i) { |
954 FOR_INT32_INPUTS(j) { | 940 FOR_INT32_INPUTS(j) { |
955 FOR_UINT32_SHIFTS(shift) { | 941 FOR_UINT32_SHIFTS(shift) { |
956 // Use uint32_t because signed overflow is UB in C. | |
957 int32_t expected = *i - (*j << shift); | 942 int32_t expected = *i - (*j << shift); |
958 CHECK_EQ(expected, m.Call(*i, *j, shift)); | 943 CHECK_EQ(expected, m.Call(*i, *j, shift)); |
959 } | 944 } |
960 } | 945 } |
961 } | 946 } |
962 } | 947 } |
963 { | 948 { |
964 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, | 949 RawMachineAssemblerTester<int32_t> m(kMachInt32, kMachUint32, kMachUint32); |
965 kMachineWord32); | |
966 m.Return(m.Int32Sub(m.Word32Shl(m.Parameter(0), m.Parameter(1)), | 950 m.Return(m.Int32Sub(m.Word32Shl(m.Parameter(0), m.Parameter(1)), |
967 m.Parameter(2))); | 951 m.Parameter(2))); |
968 FOR_INT32_INPUTS(i) { | 952 FOR_INT32_INPUTS(i) { |
969 FOR_UINT32_SHIFTS(shift) { | 953 FOR_UINT32_SHIFTS(shift) { |
970 FOR_UINT32_INPUTS(k) { | 954 FOR_UINT32_INPUTS(k) { |
971 // Use uint32_t because signed overflow is UB in C. | 955 // Use uint32_t because signed overflow is UB in C. |
972 int32_t expected = (*i << shift) - *k; | 956 int32_t expected = (*i << shift) - *k; |
973 CHECK_EQ(expected, m.Call(*i, shift, *k)); | 957 CHECK_EQ(expected, m.Call(*i, shift, *k)); |
974 } | 958 } |
975 } | 959 } |
976 } | 960 } |
977 } | 961 } |
978 } | 962 } |
979 | 963 |
980 | 964 |
981 TEST(RunInt32SubAndWord32ShrP) { | 965 TEST(RunInt32SubAndWord32ShrP) { |
982 { | 966 { |
983 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, | 967 RawMachineAssemblerTester<uint32_t> m(kMachUint32, kMachUint32, |
984 kMachineWord32); | 968 kMachUint32); |
985 m.Return(m.Int32Sub(m.Parameter(0), | 969 m.Return(m.Int32Sub(m.Parameter(0), |
986 m.Word32Shr(m.Parameter(1), m.Parameter(2)))); | 970 m.Word32Shr(m.Parameter(1), m.Parameter(2)))); |
987 FOR_UINT32_INPUTS(i) { | 971 FOR_UINT32_INPUTS(i) { |
988 FOR_UINT32_INPUTS(j) { | 972 FOR_UINT32_INPUTS(j) { |
989 FOR_UINT32_SHIFTS(shift) { | 973 FOR_UINT32_SHIFTS(shift) { |
990 // Use uint32_t because signed overflow is UB in C. | 974 // Use uint32_t because signed overflow is UB in C. |
991 int32_t expected = *i - (*j >> shift); | 975 int32_t expected = *i - (*j >> shift); |
992 CHECK_EQ(expected, m.Call(*i, *j, shift)); | 976 CHECK_UINT32_EQ(expected, m.Call(*i, *j, shift)); |
993 } | 977 } |
994 } | 978 } |
995 } | 979 } |
996 } | 980 } |
997 { | 981 { |
998 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, | 982 RawMachineAssemblerTester<uint32_t> m(kMachUint32, kMachUint32, |
999 kMachineWord32); | 983 kMachUint32); |
1000 m.Return(m.Int32Sub(m.Word32Shr(m.Parameter(0), m.Parameter(1)), | 984 m.Return(m.Int32Sub(m.Word32Shr(m.Parameter(0), m.Parameter(1)), |
1001 m.Parameter(2))); | 985 m.Parameter(2))); |
1002 FOR_UINT32_INPUTS(i) { | 986 FOR_UINT32_INPUTS(i) { |
1003 FOR_UINT32_SHIFTS(shift) { | 987 FOR_UINT32_SHIFTS(shift) { |
1004 FOR_UINT32_INPUTS(k) { | 988 FOR_UINT32_INPUTS(k) { |
1005 // Use uint32_t because signed overflow is UB in C. | 989 // Use uint32_t because signed overflow is UB in C. |
1006 int32_t expected = (*i >> shift) - *k; | 990 int32_t expected = (*i >> shift) - *k; |
1007 CHECK_EQ(expected, m.Call(*i, shift, *k)); | 991 CHECK_EQ(expected, m.Call(*i, shift, *k)); |
1008 } | 992 } |
1009 } | 993 } |
1010 } | 994 } |
1011 } | 995 } |
1012 } | 996 } |
1013 | 997 |
1014 | 998 |
1015 TEST(RunInt32SubInBranch) { | 999 TEST(RunInt32SubInBranch) { |
1016 static const int constant = 987654321; | 1000 static const int constant = 987654321; |
1017 { | 1001 { |
1018 RawMachineAssemblerTester<int32_t> m; | 1002 RawMachineAssemblerTester<int32_t> m; |
1019 Int32BinopTester bt(&m); | 1003 Uint32BinopTester bt(&m); |
1020 MLabel blocka, blockb; | 1004 MLabel blocka, blockb; |
1021 m.Branch( | 1005 m.Branch( |
1022 m.Word32Equal(m.Int32Sub(bt.param0, bt.param1), m.Int32Constant(0)), | 1006 m.Word32Equal(m.Int32Sub(bt.param0, bt.param1), m.Int32Constant(0)), |
1023 &blocka, &blockb); | 1007 &blocka, &blockb); |
1024 m.Bind(&blocka); | 1008 m.Bind(&blocka); |
1025 bt.AddReturn(m.Int32Constant(constant)); | 1009 bt.AddReturn(m.Int32Constant(constant)); |
1026 m.Bind(&blockb); | 1010 m.Bind(&blockb); |
1027 bt.AddReturn(m.Int32Constant(0 - constant)); | 1011 bt.AddReturn(m.Int32Constant(0 - constant)); |
1028 FOR_UINT32_INPUTS(i) { | 1012 FOR_UINT32_INPUTS(i) { |
1029 FOR_UINT32_INPUTS(j) { | 1013 FOR_UINT32_INPUTS(j) { |
1030 int32_t expected = (*i - *j) == 0 ? constant : 0 - constant; | 1014 int32_t expected = (*i - *j) == 0 ? constant : 0 - constant; |
1031 CHECK_EQ(expected, bt.call(*i, *j)); | 1015 CHECK_EQ(expected, bt.call(*i, *j)); |
1032 } | 1016 } |
1033 } | 1017 } |
1034 } | 1018 } |
1035 { | 1019 { |
1036 RawMachineAssemblerTester<int32_t> m; | 1020 RawMachineAssemblerTester<int32_t> m; |
1037 Int32BinopTester bt(&m); | 1021 Uint32BinopTester bt(&m); |
1038 MLabel blocka, blockb; | 1022 MLabel blocka, blockb; |
1039 m.Branch( | 1023 m.Branch( |
1040 m.Word32NotEqual(m.Int32Sub(bt.param0, bt.param1), m.Int32Constant(0)), | 1024 m.Word32NotEqual(m.Int32Sub(bt.param0, bt.param1), m.Int32Constant(0)), |
1041 &blocka, &blockb); | 1025 &blocka, &blockb); |
1042 m.Bind(&blocka); | 1026 m.Bind(&blocka); |
1043 bt.AddReturn(m.Int32Constant(constant)); | 1027 bt.AddReturn(m.Int32Constant(constant)); |
1044 m.Bind(&blockb); | 1028 m.Bind(&blockb); |
1045 bt.AddReturn(m.Int32Constant(0 - constant)); | 1029 bt.AddReturn(m.Int32Constant(0 - constant)); |
1046 FOR_UINT32_INPUTS(i) { | 1030 FOR_UINT32_INPUTS(i) { |
1047 FOR_UINT32_INPUTS(j) { | 1031 FOR_UINT32_INPUTS(j) { |
1048 int32_t expected = (*i - *j) != 0 ? constant : 0 - constant; | 1032 int32_t expected = (*i - *j) != 0 ? constant : 0 - constant; |
1049 CHECK_EQ(expected, bt.call(*i, *j)); | 1033 CHECK_EQ(expected, bt.call(*i, *j)); |
1050 } | 1034 } |
1051 } | 1035 } |
1052 } | 1036 } |
1053 { | 1037 { |
1054 FOR_UINT32_INPUTS(i) { | 1038 FOR_UINT32_INPUTS(i) { |
1055 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 1039 RawMachineAssemblerTester<uint32_t> m(kMachUint32); |
1056 MLabel blocka, blockb; | 1040 MLabel blocka, blockb; |
1057 m.Branch(m.Word32Equal(m.Int32Sub(m.Int32Constant(*i), m.Parameter(0)), | 1041 m.Branch(m.Word32Equal(m.Int32Sub(m.Int32Constant(*i), m.Parameter(0)), |
1058 m.Int32Constant(0)), | 1042 m.Int32Constant(0)), |
1059 &blocka, &blockb); | 1043 &blocka, &blockb); |
1060 m.Bind(&blocka); | 1044 m.Bind(&blocka); |
1061 m.Return(m.Int32Constant(constant)); | 1045 m.Return(m.Int32Constant(constant)); |
1062 m.Bind(&blockb); | 1046 m.Bind(&blockb); |
1063 m.Return(m.Int32Constant(0 - constant)); | 1047 m.Return(m.Int32Constant(0 - constant)); |
1064 FOR_UINT32_INPUTS(j) { | 1048 FOR_UINT32_INPUTS(j) { |
1065 int32_t expected = (*i - *j) == 0 ? constant : 0 - constant; | 1049 int32_t expected = (*i - *j) == 0 ? constant : 0 - constant; |
1066 CHECK_EQ(expected, m.Call(*j)); | 1050 CHECK_EQ(expected, m.Call(*j)); |
1067 } | 1051 } |
1068 } | 1052 } |
1069 } | 1053 } |
1070 { | 1054 { |
1071 FOR_UINT32_INPUTS(i) { | 1055 FOR_UINT32_INPUTS(i) { |
1072 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 1056 RawMachineAssemblerTester<int32_t> m(kMachUint32); |
1073 MLabel blocka, blockb; | 1057 MLabel blocka, blockb; |
1074 m.Branch(m.Word32NotEqual(m.Int32Sub(m.Int32Constant(*i), m.Parameter(0)), | 1058 m.Branch(m.Word32NotEqual(m.Int32Sub(m.Int32Constant(*i), m.Parameter(0)), |
1075 m.Int32Constant(0)), | 1059 m.Int32Constant(0)), |
1076 &blocka, &blockb); | 1060 &blocka, &blockb); |
1077 m.Bind(&blocka); | 1061 m.Bind(&blocka); |
1078 m.Return(m.Int32Constant(constant)); | 1062 m.Return(m.Int32Constant(constant)); |
1079 m.Bind(&blockb); | 1063 m.Bind(&blockb); |
1080 m.Return(m.Int32Constant(0 - constant)); | 1064 m.Return(m.Int32Constant(0 - constant)); |
1081 FOR_UINT32_INPUTS(j) { | 1065 FOR_UINT32_INPUTS(j) { |
1082 int32_t expected = (*i - *j) != 0 ? constant : 0 - constant; | 1066 int32_t expected = (*i - *j) != 0 ? constant : 0 - constant; |
1083 CHECK_EQ(expected, m.Call(*j)); | 1067 CHECK_EQ(expected, m.Call(*j)); |
1084 } | 1068 } |
1085 } | 1069 } |
1086 } | 1070 } |
1087 { | 1071 { |
1088 RawMachineAssemblerTester<void> m; | 1072 RawMachineAssemblerTester<void> m; |
1089 Operator* shops[] = {m.machine()->Word32Sar(), m.machine()->Word32Shl(), | 1073 Operator* shops[] = {m.machine()->Word32Sar(), m.machine()->Word32Shl(), |
1090 m.machine()->Word32Shr()}; | 1074 m.machine()->Word32Shr()}; |
1091 for (size_t n = 0; n < ARRAY_SIZE(shops); n++) { | 1075 for (size_t n = 0; n < ARRAY_SIZE(shops); n++) { |
1092 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, | 1076 RawMachineAssemblerTester<int32_t> m(kMachUint32, kMachInt32, |
1093 kMachineWord32); | 1077 kMachUint32); |
1094 MLabel blocka, blockb; | 1078 MLabel blocka, blockb; |
1095 m.Branch(m.Word32Equal(m.Int32Sub(m.Parameter(0), | 1079 m.Branch(m.Word32Equal(m.Int32Sub(m.Parameter(0), |
1096 m.NewNode(shops[n], m.Parameter(1), | 1080 m.NewNode(shops[n], m.Parameter(1), |
1097 m.Parameter(2))), | 1081 m.Parameter(2))), |
1098 m.Int32Constant(0)), | 1082 m.Int32Constant(0)), |
1099 &blocka, &blockb); | 1083 &blocka, &blockb); |
1100 m.Bind(&blocka); | 1084 m.Bind(&blocka); |
1101 m.Return(m.Int32Constant(constant)); | 1085 m.Return(m.Int32Constant(constant)); |
1102 m.Bind(&blockb); | 1086 m.Bind(&blockb); |
1103 m.Return(m.Int32Constant(0 - constant)); | 1087 m.Return(m.Int32Constant(0 - constant)); |
(...skipping 20 matching lines...) Expand all Loading... |
1124 } | 1108 } |
1125 } | 1109 } |
1126 } | 1110 } |
1127 } | 1111 } |
1128 } | 1112 } |
1129 | 1113 |
1130 | 1114 |
1131 TEST(RunInt32SubInComparison) { | 1115 TEST(RunInt32SubInComparison) { |
1132 { | 1116 { |
1133 RawMachineAssemblerTester<int32_t> m; | 1117 RawMachineAssemblerTester<int32_t> m; |
1134 Int32BinopTester bt(&m); | 1118 Uint32BinopTester bt(&m); |
1135 bt.AddReturn( | 1119 bt.AddReturn( |
1136 m.Word32Equal(m.Int32Sub(bt.param0, bt.param1), m.Int32Constant(0))); | 1120 m.Word32Equal(m.Int32Sub(bt.param0, bt.param1), m.Int32Constant(0))); |
1137 FOR_UINT32_INPUTS(i) { | 1121 FOR_UINT32_INPUTS(i) { |
1138 FOR_UINT32_INPUTS(j) { | 1122 FOR_UINT32_INPUTS(j) { |
1139 int32_t expected = (*i - *j) == 0; | 1123 uint32_t expected = (*i - *j) == 0; |
1140 CHECK_EQ(expected, bt.call(*i, *j)); | 1124 CHECK_UINT32_EQ(expected, bt.call(*i, *j)); |
1141 } | 1125 } |
1142 } | 1126 } |
1143 } | 1127 } |
1144 { | 1128 { |
1145 RawMachineAssemblerTester<int32_t> m; | 1129 RawMachineAssemblerTester<int32_t> m; |
1146 Int32BinopTester bt(&m); | 1130 Uint32BinopTester bt(&m); |
1147 bt.AddReturn( | 1131 bt.AddReturn( |
1148 m.Word32Equal(m.Int32Constant(0), m.Int32Sub(bt.param0, bt.param1))); | 1132 m.Word32Equal(m.Int32Constant(0), m.Int32Sub(bt.param0, bt.param1))); |
1149 FOR_UINT32_INPUTS(i) { | 1133 FOR_UINT32_INPUTS(i) { |
1150 FOR_UINT32_INPUTS(j) { | 1134 FOR_UINT32_INPUTS(j) { |
1151 int32_t expected = (*i - *j) == 0; | 1135 uint32_t expected = (*i - *j) == 0; |
1152 CHECK_EQ(expected, bt.call(*i, *j)); | 1136 CHECK_UINT32_EQ(expected, bt.call(*i, *j)); |
1153 } | 1137 } |
1154 } | 1138 } |
1155 } | 1139 } |
1156 { | 1140 { |
1157 FOR_UINT32_INPUTS(i) { | 1141 FOR_UINT32_INPUTS(i) { |
1158 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 1142 RawMachineAssemblerTester<uint32_t> m(kMachUint32); |
1159 m.Return(m.Word32Equal(m.Int32Sub(m.Int32Constant(*i), m.Parameter(0)), | 1143 m.Return(m.Word32Equal(m.Int32Sub(m.Int32Constant(*i), m.Parameter(0)), |
1160 m.Int32Constant(0))); | 1144 m.Int32Constant(0))); |
1161 FOR_UINT32_INPUTS(j) { | 1145 FOR_UINT32_INPUTS(j) { |
1162 int32_t expected = (*i - *j) == 0; | 1146 uint32_t expected = (*i - *j) == 0; |
1163 CHECK_EQ(expected, m.Call(*j)); | 1147 CHECK_UINT32_EQ(expected, m.Call(*j)); |
1164 } | 1148 } |
1165 } | 1149 } |
1166 } | 1150 } |
1167 { | 1151 { |
1168 FOR_UINT32_INPUTS(i) { | 1152 FOR_UINT32_INPUTS(i) { |
1169 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 1153 RawMachineAssemblerTester<uint32_t> m(kMachUint32); |
1170 m.Return(m.Word32Equal(m.Int32Sub(m.Parameter(0), m.Int32Constant(*i)), | 1154 m.Return(m.Word32Equal(m.Int32Sub(m.Parameter(0), m.Int32Constant(*i)), |
1171 m.Int32Constant(0))); | 1155 m.Int32Constant(0))); |
1172 FOR_UINT32_INPUTS(j) { | 1156 FOR_UINT32_INPUTS(j) { |
1173 int32_t expected = (*j - *i) == 0; | 1157 uint32_t expected = (*j - *i) == 0; |
1174 CHECK_EQ(expected, m.Call(*j)); | 1158 CHECK_UINT32_EQ(expected, m.Call(*j)); |
1175 } | 1159 } |
1176 } | 1160 } |
1177 } | 1161 } |
1178 { | 1162 { |
1179 RawMachineAssemblerTester<void> m; | 1163 RawMachineAssemblerTester<void> m; |
1180 Operator* shops[] = {m.machine()->Word32Sar(), m.machine()->Word32Shl(), | 1164 Operator* shops[] = {m.machine()->Word32Sar(), m.machine()->Word32Shl(), |
1181 m.machine()->Word32Shr()}; | 1165 m.machine()->Word32Shr()}; |
1182 for (size_t n = 0; n < ARRAY_SIZE(shops); n++) { | 1166 for (size_t n = 0; n < ARRAY_SIZE(shops); n++) { |
1183 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, | 1167 RawMachineAssemblerTester<int32_t> m(kMachUint32, kMachInt32, |
1184 kMachineWord32); | 1168 kMachUint32); |
1185 m.Return(m.Word32Equal( | 1169 m.Return(m.Word32Equal( |
1186 m.Int32Sub(m.Parameter(0), | 1170 m.Int32Sub(m.Parameter(0), |
1187 m.NewNode(shops[n], m.Parameter(1), m.Parameter(2))), | 1171 m.NewNode(shops[n], m.Parameter(1), m.Parameter(2))), |
1188 m.Int32Constant(0))); | 1172 m.Int32Constant(0))); |
1189 FOR_UINT32_INPUTS(i) { | 1173 FOR_UINT32_INPUTS(i) { |
1190 FOR_INT32_INPUTS(j) { | 1174 FOR_INT32_INPUTS(j) { |
1191 FOR_UINT32_SHIFTS(shift) { | 1175 FOR_UINT32_SHIFTS(shift) { |
1192 int32_t right; | 1176 int32_t right; |
1193 switch (shops[n]->opcode()) { | 1177 switch (shops[n]->opcode()) { |
1194 default: | 1178 default: |
(...skipping 25 matching lines...) Expand all Loading... |
1220 bt.AddReturn(m.Int32Mul(bt.param0, bt.param1)); | 1204 bt.AddReturn(m.Int32Mul(bt.param0, bt.param1)); |
1221 FOR_INT32_INPUTS(i) { | 1205 FOR_INT32_INPUTS(i) { |
1222 FOR_INT32_INPUTS(j) { | 1206 FOR_INT32_INPUTS(j) { |
1223 int expected = static_cast<int32_t>(*i * *j); | 1207 int expected = static_cast<int32_t>(*i * *j); |
1224 CHECK_EQ(expected, bt.call(*i, *j)); | 1208 CHECK_EQ(expected, bt.call(*i, *j)); |
1225 } | 1209 } |
1226 } | 1210 } |
1227 } | 1211 } |
1228 { | 1212 { |
1229 RawMachineAssemblerTester<int32_t> m; | 1213 RawMachineAssemblerTester<int32_t> m; |
1230 Int32BinopTester bt(&m); | 1214 Uint32BinopTester bt(&m); |
1231 bt.AddReturn(m.Int32Mul(bt.param0, bt.param1)); | 1215 bt.AddReturn(m.Int32Mul(bt.param0, bt.param1)); |
1232 FOR_UINT32_INPUTS(i) { | 1216 FOR_UINT32_INPUTS(i) { |
1233 FOR_UINT32_INPUTS(j) { | 1217 FOR_UINT32_INPUTS(j) { |
1234 int expected = static_cast<int32_t>(*i * *j); | 1218 uint32_t expected = *i * *j; |
1235 CHECK_EQ(expected, bt.call(*i, *j)); | 1219 CHECK_UINT32_EQ(expected, bt.call(*i, *j)); |
1236 } | 1220 } |
1237 } | 1221 } |
1238 } | 1222 } |
1239 } | 1223 } |
1240 | 1224 |
1241 | 1225 |
1242 TEST(RunInt32MulImm) { | 1226 TEST(RunInt32MulImm) { |
1243 { | 1227 { |
1244 FOR_UINT32_INPUTS(i) { | 1228 FOR_UINT32_INPUTS(i) { |
1245 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 1229 RawMachineAssemblerTester<uint32_t> m(kMachUint32); |
1246 m.Return(m.Int32Mul(m.Int32Constant(*i), m.Parameter(0))); | 1230 m.Return(m.Int32Mul(m.Int32Constant(*i), m.Parameter(0))); |
1247 FOR_UINT32_INPUTS(j) { | 1231 FOR_UINT32_INPUTS(j) { |
1248 int32_t expected = static_cast<int32_t>(*i * *j); | 1232 uint32_t expected = *i * *j; |
1249 CHECK_EQ(expected, m.Call(*j)); | 1233 CHECK_UINT32_EQ(expected, m.Call(*j)); |
1250 } | 1234 } |
1251 } | 1235 } |
1252 } | 1236 } |
1253 { | 1237 { |
1254 FOR_UINT32_INPUTS(i) { | 1238 FOR_UINT32_INPUTS(i) { |
1255 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 1239 RawMachineAssemblerTester<uint32_t> m(kMachUint32); |
1256 m.Return(m.Int32Mul(m.Parameter(0), m.Int32Constant(*i))); | 1240 m.Return(m.Int32Mul(m.Parameter(0), m.Int32Constant(*i))); |
1257 FOR_UINT32_INPUTS(j) { | 1241 FOR_UINT32_INPUTS(j) { |
1258 int32_t expected = static_cast<int32_t>(*j * *i); | 1242 uint32_t expected = *j * *i; |
1259 CHECK_EQ(expected, m.Call(*j)); | 1243 CHECK_UINT32_EQ(expected, m.Call(*j)); |
1260 } | 1244 } |
1261 } | 1245 } |
1262 } | 1246 } |
1263 } | 1247 } |
1264 | 1248 |
1265 | 1249 |
1266 TEST(RunInt32MulAndInt32AddP) { | 1250 TEST(RunInt32MulAndInt32AddP) { |
1267 { | 1251 { |
1268 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, | 1252 RawMachineAssemblerTester<int32_t> m(kMachInt32, kMachInt32, kMachInt32); |
1269 kMachineWord32); | |
1270 m.Return( | 1253 m.Return( |
1271 m.Int32Add(m.Parameter(0), m.Int32Mul(m.Parameter(1), m.Parameter(2)))); | 1254 m.Int32Add(m.Parameter(0), m.Int32Mul(m.Parameter(1), m.Parameter(2)))); |
1272 FOR_INT32_INPUTS(i) { | 1255 FOR_INT32_INPUTS(i) { |
1273 FOR_INT32_INPUTS(j) { | 1256 FOR_INT32_INPUTS(j) { |
1274 FOR_INT32_INPUTS(k) { | 1257 FOR_INT32_INPUTS(k) { |
1275 int32_t p0 = *i; | 1258 int32_t p0 = *i; |
1276 int32_t p1 = *j; | 1259 int32_t p1 = *j; |
1277 int32_t p2 = *k; | 1260 int32_t p2 = *k; |
1278 int expected = p0 + static_cast<int32_t>(p1 * p2); | 1261 int expected = p0 + static_cast<int32_t>(p1 * p2); |
1279 CHECK_EQ(expected, m.Call(p0, p1, p2)); | 1262 CHECK_EQ(expected, m.Call(p0, p1, p2)); |
1280 } | 1263 } |
1281 } | 1264 } |
1282 } | 1265 } |
1283 } | 1266 } |
1284 { | 1267 { |
1285 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, | 1268 RawMachineAssemblerTester<int32_t> m(kMachInt32, kMachInt32, kMachInt32); |
1286 kMachineWord32); | |
1287 m.Return( | 1269 m.Return( |
1288 m.Int32Add(m.Int32Mul(m.Parameter(0), m.Parameter(1)), m.Parameter(2))); | 1270 m.Int32Add(m.Int32Mul(m.Parameter(0), m.Parameter(1)), m.Parameter(2))); |
1289 FOR_INT32_INPUTS(i) { | 1271 FOR_INT32_INPUTS(i) { |
1290 FOR_INT32_INPUTS(j) { | 1272 FOR_INT32_INPUTS(j) { |
1291 FOR_INT32_INPUTS(k) { | 1273 FOR_INT32_INPUTS(k) { |
1292 int32_t p0 = *i; | 1274 int32_t p0 = *i; |
1293 int32_t p1 = *j; | 1275 int32_t p1 = *j; |
1294 int32_t p2 = *k; | 1276 int32_t p2 = *k; |
1295 int expected = static_cast<int32_t>(p0 * p1) + p2; | 1277 int expected = static_cast<int32_t>(p0 * p1) + p2; |
1296 CHECK_EQ(expected, m.Call(p0, p1, p2)); | 1278 CHECK_EQ(expected, m.Call(p0, p1, p2)); |
(...skipping 15 matching lines...) Expand all Loading... |
1312 CHECK_EQ(expected, bt.call(p0, p1)); | 1294 CHECK_EQ(expected, bt.call(p0, p1)); |
1313 } | 1295 } |
1314 } | 1296 } |
1315 } | 1297 } |
1316 } | 1298 } |
1317 } | 1299 } |
1318 | 1300 |
1319 | 1301 |
1320 TEST(RunInt32MulAndInt32SubP) { | 1302 TEST(RunInt32MulAndInt32SubP) { |
1321 { | 1303 { |
1322 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, | 1304 RawMachineAssemblerTester<int32_t> m(kMachUint32, kMachInt32, kMachInt32); |
1323 kMachineWord32); | |
1324 m.Return( | 1305 m.Return( |
1325 m.Int32Sub(m.Parameter(0), m.Int32Mul(m.Parameter(1), m.Parameter(2)))); | 1306 m.Int32Sub(m.Parameter(0), m.Int32Mul(m.Parameter(1), m.Parameter(2)))); |
1326 FOR_UINT32_INPUTS(i) { | 1307 FOR_UINT32_INPUTS(i) { |
1327 FOR_INT32_INPUTS(j) { | 1308 FOR_INT32_INPUTS(j) { |
1328 FOR_INT32_INPUTS(k) { | 1309 FOR_INT32_INPUTS(k) { |
1329 uint32_t p0 = *i; | 1310 uint32_t p0 = *i; |
1330 int32_t p1 = *j; | 1311 int32_t p1 = *j; |
1331 int32_t p2 = *k; | 1312 int32_t p2 = *k; |
1332 // Use uint32_t because signed overflow is UB in C. | 1313 // Use uint32_t because signed overflow is UB in C. |
1333 int expected = p0 - static_cast<uint32_t>(p1 * p2); | 1314 int expected = p0 - static_cast<uint32_t>(p1 * p2); |
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1525 CHECK_EQ(expected, bt.call(*i, *j)); | 1506 CHECK_EQ(expected, bt.call(*i, *j)); |
1526 } | 1507 } |
1527 } | 1508 } |
1528 } | 1509 } |
1529 } | 1510 } |
1530 | 1511 |
1531 | 1512 |
1532 TEST(RunWord32AndAndWord32ShlP) { | 1513 TEST(RunWord32AndAndWord32ShlP) { |
1533 { | 1514 { |
1534 RawMachineAssemblerTester<int32_t> m; | 1515 RawMachineAssemblerTester<int32_t> m; |
1535 Int32BinopTester bt(&m); | 1516 Uint32BinopTester bt(&m); |
1536 bt.AddReturn( | 1517 bt.AddReturn( |
1537 m.Word32Shl(bt.param0, m.Word32And(bt.param1, m.Int32Constant(0x1f)))); | 1518 m.Word32Shl(bt.param0, m.Word32And(bt.param1, m.Int32Constant(0x1f)))); |
1538 FOR_UINT32_INPUTS(i) { | 1519 FOR_UINT32_INPUTS(i) { |
1539 FOR_UINT32_INPUTS(j) { | 1520 FOR_UINT32_INPUTS(j) { |
1540 uint32_t expected = *i << (*j & 0x1f); | 1521 uint32_t expected = *i << (*j & 0x1f); |
1541 CHECK_EQ(expected, bt.call(*i, *j)); | 1522 CHECK_UINT32_EQ(expected, bt.call(*i, *j)); |
1542 } | 1523 } |
1543 } | 1524 } |
1544 } | 1525 } |
1545 { | 1526 { |
1546 RawMachineAssemblerTester<int32_t> m; | 1527 RawMachineAssemblerTester<int32_t> m; |
1547 Int32BinopTester bt(&m); | 1528 Uint32BinopTester bt(&m); |
1548 bt.AddReturn( | 1529 bt.AddReturn( |
1549 m.Word32Shl(bt.param0, m.Word32And(m.Int32Constant(0x1f), bt.param1))); | 1530 m.Word32Shl(bt.param0, m.Word32And(m.Int32Constant(0x1f), bt.param1))); |
1550 FOR_UINT32_INPUTS(i) { | 1531 FOR_UINT32_INPUTS(i) { |
1551 FOR_UINT32_INPUTS(j) { | 1532 FOR_UINT32_INPUTS(j) { |
1552 uint32_t expected = *i << (0x1f & *j); | 1533 uint32_t expected = *i << (0x1f & *j); |
1553 CHECK_EQ(expected, bt.call(*i, *j)); | 1534 CHECK_UINT32_EQ(expected, bt.call(*i, *j)); |
1554 } | 1535 } |
1555 } | 1536 } |
1556 } | 1537 } |
1557 } | 1538 } |
1558 | 1539 |
1559 | 1540 |
1560 TEST(RunWord32AndAndWord32ShrP) { | 1541 TEST(RunWord32AndAndWord32ShrP) { |
1561 { | 1542 { |
1562 RawMachineAssemblerTester<int32_t> m; | 1543 RawMachineAssemblerTester<int32_t> m; |
1563 Int32BinopTester bt(&m); | 1544 Uint32BinopTester bt(&m); |
1564 bt.AddReturn( | 1545 bt.AddReturn( |
1565 m.Word32Shr(bt.param0, m.Word32And(bt.param1, m.Int32Constant(0x1f)))); | 1546 m.Word32Shr(bt.param0, m.Word32And(bt.param1, m.Int32Constant(0x1f)))); |
1566 FOR_UINT32_INPUTS(i) { | 1547 FOR_UINT32_INPUTS(i) { |
1567 FOR_UINT32_INPUTS(j) { | 1548 FOR_UINT32_INPUTS(j) { |
1568 uint32_t expected = *i >> (*j & 0x1f); | 1549 uint32_t expected = *i >> (*j & 0x1f); |
1569 CHECK_EQ(expected, bt.call(*i, *j)); | 1550 CHECK_UINT32_EQ(expected, bt.call(*i, *j)); |
1570 } | 1551 } |
1571 } | 1552 } |
1572 } | 1553 } |
1573 { | 1554 { |
1574 RawMachineAssemblerTester<int32_t> m; | 1555 RawMachineAssemblerTester<int32_t> m; |
1575 Int32BinopTester bt(&m); | 1556 Uint32BinopTester bt(&m); |
1576 bt.AddReturn( | 1557 bt.AddReturn( |
1577 m.Word32Shr(bt.param0, m.Word32And(m.Int32Constant(0x1f), bt.param1))); | 1558 m.Word32Shr(bt.param0, m.Word32And(m.Int32Constant(0x1f), bt.param1))); |
1578 FOR_UINT32_INPUTS(i) { | 1559 FOR_UINT32_INPUTS(i) { |
1579 FOR_UINT32_INPUTS(j) { | 1560 FOR_UINT32_INPUTS(j) { |
1580 uint32_t expected = *i >> (0x1f & *j); | 1561 uint32_t expected = *i >> (0x1f & *j); |
1581 CHECK_EQ(expected, bt.call(*i, *j)); | 1562 CHECK_UINT32_EQ(expected, bt.call(*i, *j)); |
1582 } | 1563 } |
1583 } | 1564 } |
1584 } | 1565 } |
1585 } | 1566 } |
1586 | 1567 |
1587 | 1568 |
1588 TEST(RunWord32AndAndWord32SarP) { | 1569 TEST(RunWord32AndAndWord32SarP) { |
1589 { | 1570 { |
1590 RawMachineAssemblerTester<int32_t> m; | 1571 RawMachineAssemblerTester<int32_t> m; |
1591 Int32BinopTester bt(&m); | 1572 Int32BinopTester bt(&m); |
1592 bt.AddReturn( | 1573 bt.AddReturn( |
1593 m.Word32Sar(bt.param0, m.Word32And(bt.param1, m.Int32Constant(0x1f)))); | 1574 m.Word32Sar(bt.param0, m.Word32And(bt.param1, m.Int32Constant(0x1f)))); |
1594 FOR_INT32_INPUTS(i) { | 1575 FOR_INT32_INPUTS(i) { |
1595 FOR_UINT32_INPUTS(j) { | 1576 FOR_INT32_INPUTS(j) { |
1596 uint32_t expected = *i >> (*j & 0x1f); | 1577 int32_t expected = *i >> (*j & 0x1f); |
1597 CHECK_EQ(expected, bt.call(*i, *j)); | 1578 CHECK_EQ(expected, bt.call(*i, *j)); |
1598 } | 1579 } |
1599 } | 1580 } |
1600 } | 1581 } |
1601 { | 1582 { |
1602 RawMachineAssemblerTester<int32_t> m; | 1583 RawMachineAssemblerTester<int32_t> m; |
1603 Int32BinopTester bt(&m); | 1584 Int32BinopTester bt(&m); |
1604 bt.AddReturn( | 1585 bt.AddReturn( |
1605 m.Word32Sar(bt.param0, m.Word32And(m.Int32Constant(0x1f), bt.param1))); | 1586 m.Word32Sar(bt.param0, m.Word32And(m.Int32Constant(0x1f), bt.param1))); |
1606 FOR_INT32_INPUTS(i) { | 1587 FOR_INT32_INPUTS(i) { |
1607 FOR_UINT32_INPUTS(j) { | 1588 FOR_INT32_INPUTS(j) { |
1608 uint32_t expected = *i >> (0x1f & *j); | 1589 uint32_t expected = *i >> (0x1f & *j); |
1609 CHECK_EQ(expected, bt.call(*i, *j)); | 1590 CHECK_EQ(expected, bt.call(*i, *j)); |
1610 } | 1591 } |
1611 } | 1592 } |
1612 } | 1593 } |
1613 } | 1594 } |
1614 | 1595 |
1615 | 1596 |
1616 TEST(RunWord32AndImm) { | 1597 TEST(RunWord32AndImm) { |
1617 { | 1598 { |
1618 FOR_UINT32_INPUTS(i) { | 1599 FOR_UINT32_INPUTS(i) { |
1619 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 1600 RawMachineAssemblerTester<uint32_t> m(kMachUint32); |
1620 m.Return(m.Word32And(m.Int32Constant(*i), m.Parameter(0))); | 1601 m.Return(m.Word32And(m.Int32Constant(*i), m.Parameter(0))); |
1621 FOR_UINT32_INPUTS(j) { | 1602 FOR_UINT32_INPUTS(j) { |
1622 uint32_t expected = *i & *j; | 1603 uint32_t expected = *i & *j; |
1623 CHECK_EQ(expected, m.Call(*j)); | 1604 CHECK_UINT32_EQ(expected, m.Call(*j)); |
1624 } | 1605 } |
1625 } | 1606 } |
1626 } | 1607 } |
1627 { | 1608 { |
1628 FOR_UINT32_INPUTS(i) { | 1609 FOR_UINT32_INPUTS(i) { |
1629 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 1610 RawMachineAssemblerTester<uint32_t> m(kMachUint32); |
1630 m.Return(m.Word32And(m.Int32Constant(*i), m.Word32Not(m.Parameter(0)))); | 1611 m.Return(m.Word32And(m.Int32Constant(*i), m.Word32Not(m.Parameter(0)))); |
1631 FOR_UINT32_INPUTS(j) { | 1612 FOR_UINT32_INPUTS(j) { |
1632 uint32_t expected = *i & ~(*j); | 1613 uint32_t expected = *i & ~(*j); |
1633 CHECK_EQ(expected, m.Call(*j)); | 1614 CHECK_UINT32_EQ(expected, m.Call(*j)); |
1634 } | 1615 } |
1635 } | 1616 } |
1636 } | 1617 } |
1637 } | 1618 } |
1638 | 1619 |
1639 | 1620 |
1640 TEST(RunWord32AndInBranch) { | 1621 TEST(RunWord32AndInBranch) { |
1641 static const int constant = 987654321; | 1622 static const int constant = 987654321; |
1642 { | 1623 { |
1643 RawMachineAssemblerTester<int32_t> m; | 1624 RawMachineAssemblerTester<int32_t> m; |
1644 Int32BinopTester bt(&m); | 1625 Uint32BinopTester bt(&m); |
1645 MLabel blocka, blockb; | 1626 MLabel blocka, blockb; |
1646 m.Branch( | 1627 m.Branch( |
1647 m.Word32Equal(m.Word32And(bt.param0, bt.param1), m.Int32Constant(0)), | 1628 m.Word32Equal(m.Word32And(bt.param0, bt.param1), m.Int32Constant(0)), |
1648 &blocka, &blockb); | 1629 &blocka, &blockb); |
1649 m.Bind(&blocka); | 1630 m.Bind(&blocka); |
1650 bt.AddReturn(m.Int32Constant(constant)); | 1631 bt.AddReturn(m.Int32Constant(constant)); |
1651 m.Bind(&blockb); | 1632 m.Bind(&blockb); |
1652 bt.AddReturn(m.Int32Constant(0 - constant)); | 1633 bt.AddReturn(m.Int32Constant(0 - constant)); |
1653 FOR_UINT32_INPUTS(i) { | 1634 FOR_UINT32_INPUTS(i) { |
1654 FOR_UINT32_INPUTS(j) { | 1635 FOR_UINT32_INPUTS(j) { |
1655 int32_t expected = (*i & *j) == 0 ? constant : 0 - constant; | 1636 int32_t expected = (*i & *j) == 0 ? constant : 0 - constant; |
1656 CHECK_EQ(expected, bt.call(*i, *j)); | 1637 CHECK_EQ(expected, bt.call(*i, *j)); |
1657 } | 1638 } |
1658 } | 1639 } |
1659 } | 1640 } |
1660 { | 1641 { |
1661 RawMachineAssemblerTester<int32_t> m; | 1642 RawMachineAssemblerTester<int32_t> m; |
1662 Int32BinopTester bt(&m); | 1643 Uint32BinopTester bt(&m); |
1663 MLabel blocka, blockb; | 1644 MLabel blocka, blockb; |
1664 m.Branch( | 1645 m.Branch( |
1665 m.Word32NotEqual(m.Word32And(bt.param0, bt.param1), m.Int32Constant(0)), | 1646 m.Word32NotEqual(m.Word32And(bt.param0, bt.param1), m.Int32Constant(0)), |
1666 &blocka, &blockb); | 1647 &blocka, &blockb); |
1667 m.Bind(&blocka); | 1648 m.Bind(&blocka); |
1668 bt.AddReturn(m.Int32Constant(constant)); | 1649 bt.AddReturn(m.Int32Constant(constant)); |
1669 m.Bind(&blockb); | 1650 m.Bind(&blockb); |
1670 bt.AddReturn(m.Int32Constant(0 - constant)); | 1651 bt.AddReturn(m.Int32Constant(0 - constant)); |
1671 FOR_UINT32_INPUTS(i) { | 1652 FOR_UINT32_INPUTS(i) { |
1672 FOR_UINT32_INPUTS(j) { | 1653 FOR_UINT32_INPUTS(j) { |
1673 int32_t expected = (*i & *j) != 0 ? constant : 0 - constant; | 1654 int32_t expected = (*i & *j) != 0 ? constant : 0 - constant; |
1674 CHECK_EQ(expected, bt.call(*i, *j)); | 1655 CHECK_EQ(expected, bt.call(*i, *j)); |
1675 } | 1656 } |
1676 } | 1657 } |
1677 } | 1658 } |
1678 { | 1659 { |
1679 FOR_UINT32_INPUTS(i) { | 1660 FOR_UINT32_INPUTS(i) { |
1680 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 1661 RawMachineAssemblerTester<int32_t> m(kMachUint32); |
1681 MLabel blocka, blockb; | 1662 MLabel blocka, blockb; |
1682 m.Branch(m.Word32Equal(m.Word32And(m.Int32Constant(*i), m.Parameter(0)), | 1663 m.Branch(m.Word32Equal(m.Word32And(m.Int32Constant(*i), m.Parameter(0)), |
1683 m.Int32Constant(0)), | 1664 m.Int32Constant(0)), |
1684 &blocka, &blockb); | 1665 &blocka, &blockb); |
1685 m.Bind(&blocka); | 1666 m.Bind(&blocka); |
1686 m.Return(m.Int32Constant(constant)); | 1667 m.Return(m.Int32Constant(constant)); |
1687 m.Bind(&blockb); | 1668 m.Bind(&blockb); |
1688 m.Return(m.Int32Constant(0 - constant)); | 1669 m.Return(m.Int32Constant(0 - constant)); |
1689 FOR_UINT32_INPUTS(j) { | 1670 FOR_UINT32_INPUTS(j) { |
1690 int32_t expected = (*i & *j) == 0 ? constant : 0 - constant; | 1671 int32_t expected = (*i & *j) == 0 ? constant : 0 - constant; |
1691 CHECK_EQ(expected, m.Call(*j)); | 1672 CHECK_EQ(expected, m.Call(*j)); |
1692 } | 1673 } |
1693 } | 1674 } |
1694 } | 1675 } |
1695 { | 1676 { |
1696 FOR_UINT32_INPUTS(i) { | 1677 FOR_UINT32_INPUTS(i) { |
1697 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 1678 RawMachineAssemblerTester<int32_t> m(kMachUint32); |
1698 MLabel blocka, blockb; | 1679 MLabel blocka, blockb; |
1699 m.Branch( | 1680 m.Branch( |
1700 m.Word32NotEqual(m.Word32And(m.Int32Constant(*i), m.Parameter(0)), | 1681 m.Word32NotEqual(m.Word32And(m.Int32Constant(*i), m.Parameter(0)), |
1701 m.Int32Constant(0)), | 1682 m.Int32Constant(0)), |
1702 &blocka, &blockb); | 1683 &blocka, &blockb); |
1703 m.Bind(&blocka); | 1684 m.Bind(&blocka); |
1704 m.Return(m.Int32Constant(constant)); | 1685 m.Return(m.Int32Constant(constant)); |
1705 m.Bind(&blockb); | 1686 m.Bind(&blockb); |
1706 m.Return(m.Int32Constant(0 - constant)); | 1687 m.Return(m.Int32Constant(0 - constant)); |
1707 FOR_UINT32_INPUTS(j) { | 1688 FOR_UINT32_INPUTS(j) { |
1708 int32_t expected = (*i & *j) != 0 ? constant : 0 - constant; | 1689 int32_t expected = (*i & *j) != 0 ? constant : 0 - constant; |
1709 CHECK_EQ(expected, m.Call(*j)); | 1690 CHECK_EQ(expected, m.Call(*j)); |
1710 } | 1691 } |
1711 } | 1692 } |
1712 } | 1693 } |
1713 { | 1694 { |
1714 RawMachineAssemblerTester<void> m; | 1695 RawMachineAssemblerTester<void> m; |
1715 Operator* shops[] = {m.machine()->Word32Sar(), m.machine()->Word32Shl(), | 1696 Operator* shops[] = {m.machine()->Word32Sar(), m.machine()->Word32Shl(), |
1716 m.machine()->Word32Shr()}; | 1697 m.machine()->Word32Shr()}; |
1717 for (size_t n = 0; n < ARRAY_SIZE(shops); n++) { | 1698 for (size_t n = 0; n < ARRAY_SIZE(shops); n++) { |
1718 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, | 1699 RawMachineAssemblerTester<int32_t> m(kMachUint32, kMachInt32, |
1719 kMachineWord32); | 1700 kMachUint32); |
1720 MLabel blocka, blockb; | 1701 MLabel blocka, blockb; |
1721 m.Branch(m.Word32Equal(m.Word32And(m.Parameter(0), | 1702 m.Branch(m.Word32Equal(m.Word32And(m.Parameter(0), |
1722 m.NewNode(shops[n], m.Parameter(1), | 1703 m.NewNode(shops[n], m.Parameter(1), |
1723 m.Parameter(2))), | 1704 m.Parameter(2))), |
1724 m.Int32Constant(0)), | 1705 m.Int32Constant(0)), |
1725 &blocka, &blockb); | 1706 &blocka, &blockb); |
1726 m.Bind(&blocka); | 1707 m.Bind(&blocka); |
1727 m.Return(m.Int32Constant(constant)); | 1708 m.Return(m.Int32Constant(constant)); |
1728 m.Bind(&blockb); | 1709 m.Bind(&blockb); |
1729 m.Return(m.Int32Constant(0 - constant)); | 1710 m.Return(m.Int32Constant(0 - constant)); |
(...skipping 20 matching lines...) Expand all Loading... |
1750 } | 1731 } |
1751 } | 1732 } |
1752 } | 1733 } |
1753 } | 1734 } |
1754 } | 1735 } |
1755 | 1736 |
1756 | 1737 |
1757 TEST(RunWord32AndInComparison) { | 1738 TEST(RunWord32AndInComparison) { |
1758 { | 1739 { |
1759 RawMachineAssemblerTester<int32_t> m; | 1740 RawMachineAssemblerTester<int32_t> m; |
1760 Int32BinopTester bt(&m); | 1741 Uint32BinopTester bt(&m); |
1761 bt.AddReturn( | 1742 bt.AddReturn( |
1762 m.Word32Equal(m.Word32And(bt.param0, bt.param1), m.Int32Constant(0))); | 1743 m.Word32Equal(m.Word32And(bt.param0, bt.param1), m.Int32Constant(0))); |
1763 FOR_UINT32_INPUTS(i) { | 1744 FOR_UINT32_INPUTS(i) { |
1764 FOR_UINT32_INPUTS(j) { | 1745 FOR_UINT32_INPUTS(j) { |
1765 int32_t expected = (*i & *j) == 0; | 1746 uint32_t expected = (*i & *j) == 0; |
1766 CHECK_EQ(expected, bt.call(*i, *j)); | 1747 CHECK_UINT32_EQ(expected, bt.call(*i, *j)); |
1767 } | 1748 } |
1768 } | 1749 } |
1769 } | 1750 } |
1770 { | 1751 { |
1771 RawMachineAssemblerTester<int32_t> m; | 1752 RawMachineAssemblerTester<int32_t> m; |
1772 Int32BinopTester bt(&m); | 1753 Uint32BinopTester bt(&m); |
1773 bt.AddReturn( | 1754 bt.AddReturn( |
1774 m.Word32Equal(m.Int32Constant(0), m.Word32And(bt.param0, bt.param1))); | 1755 m.Word32Equal(m.Int32Constant(0), m.Word32And(bt.param0, bt.param1))); |
1775 FOR_UINT32_INPUTS(i) { | 1756 FOR_UINT32_INPUTS(i) { |
1776 FOR_UINT32_INPUTS(j) { | 1757 FOR_UINT32_INPUTS(j) { |
1777 int32_t expected = (*i & *j) == 0; | 1758 uint32_t expected = (*i & *j) == 0; |
1778 CHECK_EQ(expected, bt.call(*i, *j)); | 1759 CHECK_UINT32_EQ(expected, bt.call(*i, *j)); |
1779 } | 1760 } |
1780 } | 1761 } |
1781 } | 1762 } |
1782 { | 1763 { |
1783 FOR_UINT32_INPUTS(i) { | 1764 FOR_UINT32_INPUTS(i) { |
1784 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 1765 RawMachineAssemblerTester<uint32_t> m(kMachUint32); |
1785 m.Return(m.Word32Equal(m.Word32And(m.Int32Constant(*i), m.Parameter(0)), | 1766 m.Return(m.Word32Equal(m.Word32And(m.Int32Constant(*i), m.Parameter(0)), |
1786 m.Int32Constant(0))); | 1767 m.Int32Constant(0))); |
1787 FOR_UINT32_INPUTS(j) { | 1768 FOR_UINT32_INPUTS(j) { |
1788 int32_t expected = (*i & *j) == 0; | 1769 uint32_t expected = (*i & *j) == 0; |
1789 CHECK_EQ(expected, m.Call(*j)); | 1770 CHECK_UINT32_EQ(expected, m.Call(*j)); |
1790 } | 1771 } |
1791 } | 1772 } |
1792 } | 1773 } |
1793 { | 1774 { |
1794 FOR_UINT32_INPUTS(i) { | 1775 FOR_UINT32_INPUTS(i) { |
1795 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 1776 RawMachineAssemblerTester<uint32_t> m(kMachUint32); |
1796 m.Return(m.Word32Equal(m.Word32And(m.Parameter(0), m.Int32Constant(*i)), | 1777 m.Return(m.Word32Equal(m.Word32And(m.Parameter(0), m.Int32Constant(*i)), |
1797 m.Int32Constant(0))); | 1778 m.Int32Constant(0))); |
1798 FOR_UINT32_INPUTS(j) { | 1779 FOR_UINT32_INPUTS(j) { |
1799 int32_t expected = (*j & *i) == 0; | 1780 uint32_t expected = (*j & *i) == 0; |
1800 CHECK_EQ(expected, m.Call(*j)); | 1781 CHECK_UINT32_EQ(expected, m.Call(*j)); |
1801 } | 1782 } |
1802 } | 1783 } |
1803 } | 1784 } |
1804 } | 1785 } |
1805 | 1786 |
1806 | 1787 |
1807 TEST(RunWord32OrP) { | 1788 TEST(RunWord32OrP) { |
1808 { | 1789 { |
1809 RawMachineAssemblerTester<int32_t> m; | 1790 RawMachineAssemblerTester<int32_t> m; |
1810 Int32BinopTester bt(&m); | 1791 Uint32BinopTester bt(&m); |
1811 bt.AddReturn(m.Word32Or(bt.param0, bt.param1)); | 1792 bt.AddReturn(m.Word32Or(bt.param0, bt.param1)); |
1812 FOR_UINT32_INPUTS(i) { | 1793 FOR_UINT32_INPUTS(i) { |
1813 FOR_UINT32_INPUTS(j) { | 1794 FOR_UINT32_INPUTS(j) { |
1814 uint32_t expected = *i | *j; | 1795 uint32_t expected = *i | *j; |
1815 CHECK_EQ(expected, bt.call(*i, *j)); | 1796 CHECK_UINT32_EQ(expected, bt.call(*i, *j)); |
1816 } | 1797 } |
1817 } | 1798 } |
1818 } | 1799 } |
1819 { | 1800 { |
1820 RawMachineAssemblerTester<int32_t> m; | 1801 RawMachineAssemblerTester<int32_t> m; |
1821 Int32BinopTester bt(&m); | 1802 Uint32BinopTester bt(&m); |
1822 bt.AddReturn(m.Word32Or(bt.param0, m.Word32Not(bt.param1))); | 1803 bt.AddReturn(m.Word32Or(bt.param0, m.Word32Not(bt.param1))); |
1823 FOR_UINT32_INPUTS(i) { | 1804 FOR_UINT32_INPUTS(i) { |
1824 FOR_UINT32_INPUTS(j) { | 1805 FOR_UINT32_INPUTS(j) { |
1825 uint32_t expected = *i | ~(*j); | 1806 uint32_t expected = *i | ~(*j); |
1826 CHECK_EQ(expected, bt.call(*i, *j)); | 1807 CHECK_UINT32_EQ(expected, bt.call(*i, *j)); |
1827 } | 1808 } |
1828 } | 1809 } |
1829 } | 1810 } |
1830 { | 1811 { |
1831 RawMachineAssemblerTester<int32_t> m; | 1812 RawMachineAssemblerTester<int32_t> m; |
1832 Int32BinopTester bt(&m); | 1813 Uint32BinopTester bt(&m); |
1833 bt.AddReturn(m.Word32Or(m.Word32Not(bt.param0), bt.param1)); | 1814 bt.AddReturn(m.Word32Or(m.Word32Not(bt.param0), bt.param1)); |
1834 FOR_UINT32_INPUTS(i) { | 1815 FOR_UINT32_INPUTS(i) { |
1835 FOR_UINT32_INPUTS(j) { | 1816 FOR_UINT32_INPUTS(j) { |
1836 uint32_t expected = ~(*i) | *j; | 1817 uint32_t expected = ~(*i) | *j; |
1837 CHECK_EQ(expected, bt.call(*i, *j)); | 1818 CHECK_UINT32_EQ(expected, bt.call(*i, *j)); |
1838 } | 1819 } |
1839 } | 1820 } |
1840 } | 1821 } |
1841 } | 1822 } |
1842 | 1823 |
1843 | 1824 |
1844 TEST(RunWord32OrImm) { | 1825 TEST(RunWord32OrImm) { |
1845 { | 1826 { |
1846 FOR_UINT32_INPUTS(i) { | 1827 FOR_UINT32_INPUTS(i) { |
1847 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 1828 RawMachineAssemblerTester<uint32_t> m(kMachUint32); |
1848 m.Return(m.Word32Or(m.Int32Constant(*i), m.Parameter(0))); | 1829 m.Return(m.Word32Or(m.Int32Constant(*i), m.Parameter(0))); |
1849 FOR_UINT32_INPUTS(j) { | 1830 FOR_UINT32_INPUTS(j) { |
1850 uint32_t expected = *i | *j; | 1831 uint32_t expected = *i | *j; |
1851 CHECK_EQ(expected, m.Call(*j)); | 1832 CHECK_UINT32_EQ(expected, m.Call(*j)); |
1852 } | 1833 } |
1853 } | 1834 } |
1854 } | 1835 } |
1855 { | 1836 { |
1856 FOR_UINT32_INPUTS(i) { | 1837 FOR_UINT32_INPUTS(i) { |
1857 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 1838 RawMachineAssemblerTester<uint32_t> m(kMachUint32); |
1858 m.Return(m.Word32Or(m.Int32Constant(*i), m.Word32Not(m.Parameter(0)))); | 1839 m.Return(m.Word32Or(m.Int32Constant(*i), m.Word32Not(m.Parameter(0)))); |
1859 FOR_UINT32_INPUTS(j) { | 1840 FOR_UINT32_INPUTS(j) { |
1860 uint32_t expected = *i | ~(*j); | 1841 uint32_t expected = *i | ~(*j); |
1861 CHECK_EQ(expected, m.Call(*j)); | 1842 CHECK_UINT32_EQ(expected, m.Call(*j)); |
1862 } | 1843 } |
1863 } | 1844 } |
1864 } | 1845 } |
1865 } | 1846 } |
1866 | 1847 |
1867 | 1848 |
1868 TEST(RunWord32OrInBranch) { | 1849 TEST(RunWord32OrInBranch) { |
1869 static const int constant = 987654321; | 1850 static const int constant = 987654321; |
1870 { | 1851 { |
1871 RawMachineAssemblerTester<int32_t> m; | 1852 RawMachineAssemblerTester<int32_t> m; |
1872 Int32BinopTester bt(&m); | 1853 Int32BinopTester bt(&m); |
1873 MLabel blocka, blockb; | 1854 MLabel blocka, blockb; |
1874 m.Branch( | 1855 m.Branch( |
1875 m.Word32Equal(m.Word32Or(bt.param0, bt.param1), m.Int32Constant(0)), | 1856 m.Word32Equal(m.Word32Or(bt.param0, bt.param1), m.Int32Constant(0)), |
1876 &blocka, &blockb); | 1857 &blocka, &blockb); |
1877 m.Bind(&blocka); | 1858 m.Bind(&blocka); |
1878 bt.AddReturn(m.Int32Constant(constant)); | 1859 bt.AddReturn(m.Int32Constant(constant)); |
1879 m.Bind(&blockb); | 1860 m.Bind(&blockb); |
1880 bt.AddReturn(m.Int32Constant(0 - constant)); | 1861 bt.AddReturn(m.Int32Constant(0 - constant)); |
1881 FOR_UINT32_INPUTS(i) { | 1862 FOR_INT32_INPUTS(i) { |
1882 FOR_UINT32_INPUTS(j) { | 1863 FOR_INT32_INPUTS(j) { |
1883 int32_t expected = (*i | *j) == 0 ? constant : 0 - constant; | 1864 int32_t expected = (*i | *j) == 0 ? constant : 0 - constant; |
1884 CHECK_EQ(expected, bt.call(*i, *j)); | 1865 CHECK_EQ(expected, bt.call(*i, *j)); |
1885 } | 1866 } |
1886 } | 1867 } |
1887 } | 1868 } |
1888 { | 1869 { |
1889 RawMachineAssemblerTester<int32_t> m; | 1870 RawMachineAssemblerTester<int32_t> m; |
1890 Int32BinopTester bt(&m); | 1871 Int32BinopTester bt(&m); |
1891 MLabel blocka, blockb; | 1872 MLabel blocka, blockb; |
1892 m.Branch( | 1873 m.Branch( |
1893 m.Word32NotEqual(m.Word32Or(bt.param0, bt.param1), m.Int32Constant(0)), | 1874 m.Word32NotEqual(m.Word32Or(bt.param0, bt.param1), m.Int32Constant(0)), |
1894 &blocka, &blockb); | 1875 &blocka, &blockb); |
1895 m.Bind(&blocka); | 1876 m.Bind(&blocka); |
1896 bt.AddReturn(m.Int32Constant(constant)); | 1877 bt.AddReturn(m.Int32Constant(constant)); |
1897 m.Bind(&blockb); | 1878 m.Bind(&blockb); |
1898 bt.AddReturn(m.Int32Constant(0 - constant)); | 1879 bt.AddReturn(m.Int32Constant(0 - constant)); |
1899 FOR_UINT32_INPUTS(i) { | 1880 FOR_INT32_INPUTS(i) { |
1900 FOR_UINT32_INPUTS(j) { | 1881 FOR_INT32_INPUTS(j) { |
1901 int32_t expected = (*i | *j) != 0 ? constant : 0 - constant; | 1882 int32_t expected = (*i | *j) != 0 ? constant : 0 - constant; |
1902 CHECK_EQ(expected, bt.call(*i, *j)); | 1883 CHECK_EQ(expected, bt.call(*i, *j)); |
1903 } | 1884 } |
1904 } | 1885 } |
1905 } | 1886 } |
1906 { | 1887 { |
1907 FOR_UINT32_INPUTS(i) { | 1888 FOR_INT32_INPUTS(i) { |
1908 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 1889 RawMachineAssemblerTester<int32_t> m(kMachInt32); |
1909 MLabel blocka, blockb; | 1890 MLabel blocka, blockb; |
1910 m.Branch(m.Word32Equal(m.Word32Or(m.Int32Constant(*i), m.Parameter(0)), | 1891 m.Branch(m.Word32Equal(m.Word32Or(m.Int32Constant(*i), m.Parameter(0)), |
1911 m.Int32Constant(0)), | 1892 m.Int32Constant(0)), |
1912 &blocka, &blockb); | 1893 &blocka, &blockb); |
1913 m.Bind(&blocka); | 1894 m.Bind(&blocka); |
1914 m.Return(m.Int32Constant(constant)); | 1895 m.Return(m.Int32Constant(constant)); |
1915 m.Bind(&blockb); | 1896 m.Bind(&blockb); |
1916 m.Return(m.Int32Constant(0 - constant)); | 1897 m.Return(m.Int32Constant(0 - constant)); |
1917 FOR_UINT32_INPUTS(j) { | 1898 FOR_INT32_INPUTS(j) { |
1918 int32_t expected = (*i | *j) == 0 ? constant : 0 - constant; | 1899 int32_t expected = (*i | *j) == 0 ? constant : 0 - constant; |
1919 CHECK_EQ(expected, m.Call(*j)); | 1900 CHECK_EQ(expected, m.Call(*j)); |
1920 } | 1901 } |
1921 } | 1902 } |
1922 } | 1903 } |
1923 { | 1904 { |
1924 FOR_UINT32_INPUTS(i) { | 1905 FOR_INT32_INPUTS(i) { |
1925 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 1906 RawMachineAssemblerTester<int32_t> m(kMachInt32); |
1926 MLabel blocka, blockb; | 1907 MLabel blocka, blockb; |
1927 m.Branch(m.Word32NotEqual(m.Word32Or(m.Int32Constant(*i), m.Parameter(0)), | 1908 m.Branch(m.Word32NotEqual(m.Word32Or(m.Int32Constant(*i), m.Parameter(0)), |
1928 m.Int32Constant(0)), | 1909 m.Int32Constant(0)), |
1929 &blocka, &blockb); | 1910 &blocka, &blockb); |
1930 m.Bind(&blocka); | 1911 m.Bind(&blocka); |
1931 m.Return(m.Int32Constant(constant)); | 1912 m.Return(m.Int32Constant(constant)); |
1932 m.Bind(&blockb); | 1913 m.Bind(&blockb); |
1933 m.Return(m.Int32Constant(0 - constant)); | 1914 m.Return(m.Int32Constant(0 - constant)); |
1934 FOR_UINT32_INPUTS(j) { | 1915 FOR_INT32_INPUTS(j) { |
1935 int32_t expected = (*i | *j) != 0 ? constant : 0 - constant; | 1916 int32_t expected = (*i | *j) != 0 ? constant : 0 - constant; |
1936 CHECK_EQ(expected, m.Call(*j)); | 1917 CHECK_EQ(expected, m.Call(*j)); |
1937 } | 1918 } |
1938 } | 1919 } |
1939 } | 1920 } |
1940 { | 1921 { |
1941 RawMachineAssemblerTester<void> m; | 1922 RawMachineAssemblerTester<void> m; |
1942 Operator* shops[] = {m.machine()->Word32Sar(), m.machine()->Word32Shl(), | 1923 Operator* shops[] = {m.machine()->Word32Sar(), m.machine()->Word32Shl(), |
1943 m.machine()->Word32Shr()}; | 1924 m.machine()->Word32Shr()}; |
1944 for (size_t n = 0; n < ARRAY_SIZE(shops); n++) { | 1925 for (size_t n = 0; n < ARRAY_SIZE(shops); n++) { |
1945 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, | 1926 RawMachineAssemblerTester<int32_t> m(kMachUint32, kMachInt32, |
1946 kMachineWord32); | 1927 kMachUint32); |
1947 MLabel blocka, blockb; | 1928 MLabel blocka, blockb; |
1948 m.Branch(m.Word32Equal(m.Word32Or(m.Parameter(0), | 1929 m.Branch(m.Word32Equal(m.Word32Or(m.Parameter(0), |
1949 m.NewNode(shops[n], m.Parameter(1), | 1930 m.NewNode(shops[n], m.Parameter(1), |
1950 m.Parameter(2))), | 1931 m.Parameter(2))), |
1951 m.Int32Constant(0)), | 1932 m.Int32Constant(0)), |
1952 &blocka, &blockb); | 1933 &blocka, &blockb); |
1953 m.Bind(&blocka); | 1934 m.Bind(&blocka); |
1954 m.Return(m.Int32Constant(constant)); | 1935 m.Return(m.Int32Constant(constant)); |
1955 m.Bind(&blockb); | 1936 m.Bind(&blockb); |
1956 m.Return(m.Int32Constant(0 - constant)); | 1937 m.Return(m.Int32Constant(0 - constant)); |
(...skipping 20 matching lines...) Expand all Loading... |
1977 } | 1958 } |
1978 } | 1959 } |
1979 } | 1960 } |
1980 } | 1961 } |
1981 } | 1962 } |
1982 | 1963 |
1983 | 1964 |
1984 TEST(RunWord32OrInComparison) { | 1965 TEST(RunWord32OrInComparison) { |
1985 { | 1966 { |
1986 RawMachineAssemblerTester<int32_t> m; | 1967 RawMachineAssemblerTester<int32_t> m; |
1987 Int32BinopTester bt(&m); | 1968 Uint32BinopTester bt(&m); |
1988 bt.AddReturn( | 1969 bt.AddReturn( |
1989 m.Word32Equal(m.Word32Or(bt.param0, bt.param1), m.Int32Constant(0))); | 1970 m.Word32Equal(m.Word32Or(bt.param0, bt.param1), m.Int32Constant(0))); |
1990 FOR_UINT32_INPUTS(i) { | 1971 FOR_UINT32_INPUTS(i) { |
1991 FOR_UINT32_INPUTS(j) { | 1972 FOR_UINT32_INPUTS(j) { |
1992 int32_t expected = (*i | *j) == 0; | 1973 int32_t expected = (*i | *j) == 0; |
1993 CHECK_EQ(expected, bt.call(*i, *j)); | 1974 CHECK_EQ(expected, bt.call(*i, *j)); |
1994 } | 1975 } |
1995 } | 1976 } |
1996 } | 1977 } |
1997 { | 1978 { |
1998 RawMachineAssemblerTester<int32_t> m; | 1979 RawMachineAssemblerTester<int32_t> m; |
1999 Int32BinopTester bt(&m); | 1980 Uint32BinopTester bt(&m); |
2000 bt.AddReturn( | 1981 bt.AddReturn( |
2001 m.Word32Equal(m.Int32Constant(0), m.Word32Or(bt.param0, bt.param1))); | 1982 m.Word32Equal(m.Int32Constant(0), m.Word32Or(bt.param0, bt.param1))); |
2002 FOR_UINT32_INPUTS(i) { | 1983 FOR_UINT32_INPUTS(i) { |
2003 FOR_UINT32_INPUTS(j) { | 1984 FOR_UINT32_INPUTS(j) { |
2004 int32_t expected = (*i | *j) == 0; | 1985 int32_t expected = (*i | *j) == 0; |
2005 CHECK_EQ(expected, bt.call(*i, *j)); | 1986 CHECK_EQ(expected, bt.call(*i, *j)); |
2006 } | 1987 } |
2007 } | 1988 } |
2008 } | 1989 } |
2009 { | 1990 { |
2010 FOR_UINT32_INPUTS(i) { | 1991 FOR_UINT32_INPUTS(i) { |
2011 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 1992 RawMachineAssemblerTester<uint32_t> m(kMachUint32); |
2012 m.Return(m.Word32Equal(m.Word32Or(m.Int32Constant(*i), m.Parameter(0)), | 1993 m.Return(m.Word32Equal(m.Word32Or(m.Int32Constant(*i), m.Parameter(0)), |
2013 m.Int32Constant(0))); | 1994 m.Int32Constant(0))); |
2014 FOR_UINT32_INPUTS(j) { | 1995 FOR_UINT32_INPUTS(j) { |
2015 int32_t expected = (*i | *j) == 0; | 1996 uint32_t expected = (*i | *j) == 0; |
2016 CHECK_EQ(expected, m.Call(*j)); | 1997 CHECK_UINT32_EQ(expected, m.Call(*j)); |
2017 } | 1998 } |
2018 } | 1999 } |
2019 } | 2000 } |
2020 { | 2001 { |
2021 FOR_UINT32_INPUTS(i) { | 2002 FOR_UINT32_INPUTS(i) { |
2022 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 2003 RawMachineAssemblerTester<uint32_t> m(kMachUint32); |
2023 m.Return(m.Word32Equal(m.Word32Or(m.Parameter(0), m.Int32Constant(*i)), | 2004 m.Return(m.Word32Equal(m.Word32Or(m.Parameter(0), m.Int32Constant(*i)), |
2024 m.Int32Constant(0))); | 2005 m.Int32Constant(0))); |
2025 FOR_UINT32_INPUTS(j) { | 2006 FOR_UINT32_INPUTS(j) { |
2026 int32_t expected = (*j | *i) == 0; | 2007 uint32_t expected = (*j | *i) == 0; |
2027 CHECK_EQ(expected, m.Call(*j)); | 2008 CHECK_UINT32_EQ(expected, m.Call(*j)); |
2028 } | 2009 } |
2029 } | 2010 } |
2030 } | 2011 } |
2031 } | 2012 } |
2032 | 2013 |
2033 | 2014 |
2034 TEST(RunWord32XorP) { | 2015 TEST(RunWord32XorP) { |
2035 { | 2016 { |
2036 FOR_UINT32_INPUTS(i) { | 2017 FOR_UINT32_INPUTS(i) { |
2037 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 2018 RawMachineAssemblerTester<int32_t> m(kMachUint32); |
2038 m.Return(m.Word32Xor(m.Int32Constant(*i), m.Parameter(0))); | 2019 m.Return(m.Word32Xor(m.Int32Constant(*i), m.Parameter(0))); |
2039 FOR_UINT32_INPUTS(j) { | 2020 FOR_UINT32_INPUTS(j) { |
2040 uint32_t expected = *i ^ *j; | 2021 uint32_t expected = *i ^ *j; |
2041 CHECK_EQ(expected, m.Call(*j)); | 2022 CHECK_UINT32_EQ(expected, m.Call(*j)); |
2042 } | 2023 } |
2043 } | 2024 } |
2044 } | 2025 } |
2045 { | 2026 { |
2046 RawMachineAssemblerTester<int32_t> m; | 2027 RawMachineAssemblerTester<int32_t> m; |
2047 Int32BinopTester bt(&m); | 2028 Uint32BinopTester bt(&m); |
2048 bt.AddReturn(m.Word32Xor(bt.param0, bt.param1)); | 2029 bt.AddReturn(m.Word32Xor(bt.param0, bt.param1)); |
2049 FOR_UINT32_INPUTS(i) { | 2030 FOR_UINT32_INPUTS(i) { |
2050 FOR_UINT32_INPUTS(j) { | 2031 FOR_UINT32_INPUTS(j) { |
2051 uint32_t expected = *i ^ *j; | 2032 int32_t expected = *i ^ *j; |
2052 CHECK_EQ(expected, bt.call(*i, *j)); | 2033 CHECK_UINT32_EQ(expected, bt.call(*i, *j)); |
2053 } | 2034 } |
2054 } | 2035 } |
2055 } | 2036 } |
2056 { | 2037 { |
2057 RawMachineAssemblerTester<int32_t> m; | 2038 RawMachineAssemblerTester<int32_t> m; |
2058 Int32BinopTester bt(&m); | 2039 Int32BinopTester bt(&m); |
2059 bt.AddReturn(m.Word32Xor(bt.param0, m.Word32Not(bt.param1))); | 2040 bt.AddReturn(m.Word32Xor(bt.param0, m.Word32Not(bt.param1))); |
2060 FOR_UINT32_INPUTS(i) { | 2041 FOR_INT32_INPUTS(i) { |
2061 FOR_UINT32_INPUTS(j) { | 2042 FOR_INT32_INPUTS(j) { |
2062 uint32_t expected = *i ^ ~(*j); | 2043 int32_t expected = *i ^ ~(*j); |
2063 CHECK_EQ(expected, bt.call(*i, *j)); | 2044 CHECK_EQ(expected, bt.call(*i, *j)); |
2064 } | 2045 } |
2065 } | 2046 } |
2066 } | 2047 } |
2067 { | 2048 { |
2068 RawMachineAssemblerTester<int32_t> m; | 2049 RawMachineAssemblerTester<int32_t> m; |
2069 Int32BinopTester bt(&m); | 2050 Int32BinopTester bt(&m); |
2070 bt.AddReturn(m.Word32Xor(m.Word32Not(bt.param0), bt.param1)); | 2051 bt.AddReturn(m.Word32Xor(m.Word32Not(bt.param0), bt.param1)); |
2071 FOR_UINT32_INPUTS(i) { | 2052 FOR_INT32_INPUTS(i) { |
2072 FOR_UINT32_INPUTS(j) { | 2053 FOR_INT32_INPUTS(j) { |
2073 uint32_t expected = ~(*i) ^ *j; | 2054 int32_t expected = ~(*i) ^ *j; |
2074 CHECK_EQ(expected, bt.call(*i, *j)); | 2055 CHECK_EQ(expected, bt.call(*i, *j)); |
2075 } | 2056 } |
2076 } | 2057 } |
2077 } | 2058 } |
2078 { | 2059 { |
2079 FOR_UINT32_INPUTS(i) { | 2060 FOR_UINT32_INPUTS(i) { |
2080 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 2061 RawMachineAssemblerTester<uint32_t> m(kMachUint32); |
2081 m.Return(m.Word32Xor(m.Int32Constant(*i), m.Word32Not(m.Parameter(0)))); | 2062 m.Return(m.Word32Xor(m.Int32Constant(*i), m.Word32Not(m.Parameter(0)))); |
2082 FOR_UINT32_INPUTS(j) { | 2063 FOR_UINT32_INPUTS(j) { |
2083 uint32_t expected = *i ^ ~(*j); | 2064 uint32_t expected = *i ^ ~(*j); |
2084 CHECK_EQ(expected, m.Call(*j)); | 2065 CHECK_UINT32_EQ(expected, m.Call(*j)); |
2085 } | 2066 } |
2086 } | 2067 } |
2087 } | 2068 } |
2088 } | 2069 } |
2089 | 2070 |
2090 | 2071 |
2091 TEST(RunWord32XorInBranch) { | 2072 TEST(RunWord32XorInBranch) { |
2092 static const int constant = 987654321; | 2073 static const uint32_t constant = 987654321; |
2093 { | 2074 { |
2094 RawMachineAssemblerTester<int32_t> m; | 2075 RawMachineAssemblerTester<int32_t> m; |
2095 Int32BinopTester bt(&m); | 2076 Uint32BinopTester bt(&m); |
2096 MLabel blocka, blockb; | 2077 MLabel blocka, blockb; |
2097 m.Branch( | 2078 m.Branch( |
2098 m.Word32Equal(m.Word32Xor(bt.param0, bt.param1), m.Int32Constant(0)), | 2079 m.Word32Equal(m.Word32Xor(bt.param0, bt.param1), m.Int32Constant(0)), |
2099 &blocka, &blockb); | 2080 &blocka, &blockb); |
2100 m.Bind(&blocka); | 2081 m.Bind(&blocka); |
2101 bt.AddReturn(m.Int32Constant(constant)); | 2082 bt.AddReturn(m.Int32Constant(constant)); |
2102 m.Bind(&blockb); | 2083 m.Bind(&blockb); |
2103 bt.AddReturn(m.Int32Constant(0 - constant)); | 2084 bt.AddReturn(m.Int32Constant(0 - constant)); |
2104 FOR_UINT32_INPUTS(i) { | 2085 FOR_UINT32_INPUTS(i) { |
2105 FOR_UINT32_INPUTS(j) { | 2086 FOR_UINT32_INPUTS(j) { |
2106 int32_t expected = (*i ^ *j) == 0 ? constant : 0 - constant; | 2087 uint32_t expected = (*i ^ *j) == 0 ? constant : 0 - constant; |
2107 CHECK_EQ(expected, bt.call(*i, *j)); | 2088 CHECK_UINT32_EQ(expected, bt.call(*i, *j)); |
2108 } | 2089 } |
2109 } | 2090 } |
2110 } | 2091 } |
2111 { | 2092 { |
2112 RawMachineAssemblerTester<int32_t> m; | 2093 RawMachineAssemblerTester<int32_t> m; |
2113 Int32BinopTester bt(&m); | 2094 Uint32BinopTester bt(&m); |
2114 MLabel blocka, blockb; | 2095 MLabel blocka, blockb; |
2115 m.Branch( | 2096 m.Branch( |
2116 m.Word32NotEqual(m.Word32Xor(bt.param0, bt.param1), m.Int32Constant(0)), | 2097 m.Word32NotEqual(m.Word32Xor(bt.param0, bt.param1), m.Int32Constant(0)), |
2117 &blocka, &blockb); | 2098 &blocka, &blockb); |
2118 m.Bind(&blocka); | 2099 m.Bind(&blocka); |
2119 bt.AddReturn(m.Int32Constant(constant)); | 2100 bt.AddReturn(m.Int32Constant(constant)); |
2120 m.Bind(&blockb); | 2101 m.Bind(&blockb); |
2121 bt.AddReturn(m.Int32Constant(0 - constant)); | 2102 bt.AddReturn(m.Int32Constant(0 - constant)); |
2122 FOR_UINT32_INPUTS(i) { | 2103 FOR_UINT32_INPUTS(i) { |
2123 FOR_UINT32_INPUTS(j) { | 2104 FOR_UINT32_INPUTS(j) { |
2124 int32_t expected = (*i ^ *j) != 0 ? constant : 0 - constant; | 2105 uint32_t expected = (*i ^ *j) != 0 ? constant : 0 - constant; |
2125 CHECK_EQ(expected, bt.call(*i, *j)); | 2106 CHECK_UINT32_EQ(expected, bt.call(*i, *j)); |
2126 } | 2107 } |
2127 } | 2108 } |
2128 } | 2109 } |
2129 { | 2110 { |
2130 FOR_UINT32_INPUTS(i) { | 2111 FOR_UINT32_INPUTS(i) { |
2131 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 2112 RawMachineAssemblerTester<uint32_t> m(kMachUint32); |
2132 MLabel blocka, blockb; | 2113 MLabel blocka, blockb; |
2133 m.Branch(m.Word32Equal(m.Word32Xor(m.Int32Constant(*i), m.Parameter(0)), | 2114 m.Branch(m.Word32Equal(m.Word32Xor(m.Int32Constant(*i), m.Parameter(0)), |
2134 m.Int32Constant(0)), | 2115 m.Int32Constant(0)), |
2135 &blocka, &blockb); | 2116 &blocka, &blockb); |
2136 m.Bind(&blocka); | 2117 m.Bind(&blocka); |
2137 m.Return(m.Int32Constant(constant)); | 2118 m.Return(m.Int32Constant(constant)); |
2138 m.Bind(&blockb); | 2119 m.Bind(&blockb); |
2139 m.Return(m.Int32Constant(0 - constant)); | 2120 m.Return(m.Int32Constant(0 - constant)); |
2140 FOR_UINT32_INPUTS(j) { | 2121 FOR_UINT32_INPUTS(j) { |
2141 int32_t expected = (*i ^ *j) == 0 ? constant : 0 - constant; | 2122 uint32_t expected = (*i ^ *j) == 0 ? constant : 0 - constant; |
2142 CHECK_EQ(expected, m.Call(*j)); | 2123 CHECK_UINT32_EQ(expected, m.Call(*j)); |
2143 } | 2124 } |
2144 } | 2125 } |
2145 } | 2126 } |
2146 { | 2127 { |
2147 FOR_UINT32_INPUTS(i) { | 2128 FOR_UINT32_INPUTS(i) { |
2148 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 2129 RawMachineAssemblerTester<uint32_t> m(kMachUint32); |
2149 MLabel blocka, blockb; | 2130 MLabel blocka, blockb; |
2150 m.Branch( | 2131 m.Branch( |
2151 m.Word32NotEqual(m.Word32Xor(m.Int32Constant(*i), m.Parameter(0)), | 2132 m.Word32NotEqual(m.Word32Xor(m.Int32Constant(*i), m.Parameter(0)), |
2152 m.Int32Constant(0)), | 2133 m.Int32Constant(0)), |
2153 &blocka, &blockb); | 2134 &blocka, &blockb); |
2154 m.Bind(&blocka); | 2135 m.Bind(&blocka); |
2155 m.Return(m.Int32Constant(constant)); | 2136 m.Return(m.Int32Constant(constant)); |
2156 m.Bind(&blockb); | 2137 m.Bind(&blockb); |
2157 m.Return(m.Int32Constant(0 - constant)); | 2138 m.Return(m.Int32Constant(0 - constant)); |
2158 FOR_UINT32_INPUTS(j) { | 2139 FOR_UINT32_INPUTS(j) { |
2159 int32_t expected = (*i ^ *j) != 0 ? constant : 0 - constant; | 2140 uint32_t expected = (*i ^ *j) != 0 ? constant : 0 - constant; |
2160 CHECK_EQ(expected, m.Call(*j)); | 2141 CHECK_UINT32_EQ(expected, m.Call(*j)); |
2161 } | 2142 } |
2162 } | 2143 } |
2163 } | 2144 } |
2164 { | 2145 { |
2165 RawMachineAssemblerTester<void> m; | 2146 RawMachineAssemblerTester<void> m; |
2166 Operator* shops[] = {m.machine()->Word32Sar(), m.machine()->Word32Shl(), | 2147 Operator* shops[] = {m.machine()->Word32Sar(), m.machine()->Word32Shl(), |
2167 m.machine()->Word32Shr()}; | 2148 m.machine()->Word32Shr()}; |
2168 for (size_t n = 0; n < ARRAY_SIZE(shops); n++) { | 2149 for (size_t n = 0; n < ARRAY_SIZE(shops); n++) { |
2169 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, | 2150 RawMachineAssemblerTester<int32_t> m(kMachUint32, kMachInt32, |
2170 kMachineWord32); | 2151 kMachUint32); |
2171 MLabel blocka, blockb; | 2152 MLabel blocka, blockb; |
2172 m.Branch(m.Word32Equal(m.Word32Xor(m.Parameter(0), | 2153 m.Branch(m.Word32Equal(m.Word32Xor(m.Parameter(0), |
2173 m.NewNode(shops[n], m.Parameter(1), | 2154 m.NewNode(shops[n], m.Parameter(1), |
2174 m.Parameter(2))), | 2155 m.Parameter(2))), |
2175 m.Int32Constant(0)), | 2156 m.Int32Constant(0)), |
2176 &blocka, &blockb); | 2157 &blocka, &blockb); |
2177 m.Bind(&blocka); | 2158 m.Bind(&blocka); |
2178 m.Return(m.Int32Constant(constant)); | 2159 m.Return(m.Int32Constant(constant)); |
2179 m.Bind(&blockb); | 2160 m.Bind(&blockb); |
2180 m.Return(m.Int32Constant(0 - constant)); | 2161 m.Return(m.Int32Constant(0 - constant)); |
(...skipping 20 matching lines...) Expand all Loading... |
2201 } | 2182 } |
2202 } | 2183 } |
2203 } | 2184 } |
2204 } | 2185 } |
2205 } | 2186 } |
2206 | 2187 |
2207 | 2188 |
2208 TEST(RunWord32ShlP) { | 2189 TEST(RunWord32ShlP) { |
2209 { | 2190 { |
2210 FOR_UINT32_SHIFTS(shift) { | 2191 FOR_UINT32_SHIFTS(shift) { |
2211 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 2192 RawMachineAssemblerTester<uint32_t> m(kMachUint32); |
2212 m.Return(m.Word32Shl(m.Parameter(0), m.Int32Constant(shift))); | 2193 m.Return(m.Word32Shl(m.Parameter(0), m.Int32Constant(shift))); |
2213 FOR_UINT32_INPUTS(j) { | 2194 FOR_UINT32_INPUTS(j) { |
2214 uint32_t expected = *j << shift; | 2195 uint32_t expected = *j << shift; |
2215 CHECK_EQ(expected, m.Call(*j)); | 2196 CHECK_UINT32_EQ(expected, m.Call(*j)); |
2216 } | 2197 } |
2217 } | 2198 } |
2218 } | 2199 } |
2219 { | 2200 { |
2220 RawMachineAssemblerTester<int32_t> m; | 2201 RawMachineAssemblerTester<int32_t> m; |
2221 Int32BinopTester bt(&m); | 2202 Uint32BinopTester bt(&m); |
2222 bt.AddReturn(m.Word32Shl(bt.param0, bt.param1)); | 2203 bt.AddReturn(m.Word32Shl(bt.param0, bt.param1)); |
2223 FOR_UINT32_INPUTS(i) { | 2204 FOR_UINT32_INPUTS(i) { |
2224 FOR_UINT32_SHIFTS(shift) { | 2205 FOR_UINT32_SHIFTS(shift) { |
2225 uint32_t expected = *i << shift; | 2206 uint32_t expected = *i << shift; |
2226 CHECK_EQ(expected, bt.call(*i, shift)); | 2207 CHECK_UINT32_EQ(expected, bt.call(*i, shift)); |
2227 } | 2208 } |
2228 } | 2209 } |
2229 } | 2210 } |
2230 } | 2211 } |
2231 | 2212 |
2232 | 2213 |
2233 TEST(RunWord32ShrP) { | 2214 TEST(RunWord32ShrP) { |
2234 { | 2215 { |
2235 FOR_UINT32_SHIFTS(shift) { | 2216 FOR_UINT32_SHIFTS(shift) { |
2236 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 2217 RawMachineAssemblerTester<uint32_t> m(kMachUint32); |
2237 m.Return(m.Word32Shr(m.Parameter(0), m.Int32Constant(shift))); | 2218 m.Return(m.Word32Shr(m.Parameter(0), m.Int32Constant(shift))); |
2238 FOR_UINT32_INPUTS(j) { | 2219 FOR_UINT32_INPUTS(j) { |
2239 uint32_t expected = *j >> shift; | 2220 uint32_t expected = *j >> shift; |
2240 CHECK_EQ(expected, m.Call(*j)); | 2221 CHECK_UINT32_EQ(expected, m.Call(*j)); |
2241 } | 2222 } |
2242 } | 2223 } |
2243 } | 2224 } |
2244 { | 2225 { |
2245 RawMachineAssemblerTester<int32_t> m; | 2226 RawMachineAssemblerTester<int32_t> m; |
2246 Int32BinopTester bt(&m); | 2227 Uint32BinopTester bt(&m); |
2247 bt.AddReturn(m.Word32Shr(bt.param0, bt.param1)); | 2228 bt.AddReturn(m.Word32Shr(bt.param0, bt.param1)); |
2248 FOR_UINT32_INPUTS(i) { | 2229 FOR_UINT32_INPUTS(i) { |
2249 FOR_UINT32_SHIFTS(shift) { | 2230 FOR_UINT32_SHIFTS(shift) { |
2250 uint32_t expected = *i >> shift; | 2231 uint32_t expected = *i >> shift; |
2251 CHECK_EQ(expected, bt.call(*i, shift)); | 2232 CHECK_UINT32_EQ(expected, bt.call(*i, shift)); |
2252 } | 2233 } |
2253 } | 2234 } |
2254 CHECK_EQ(0x00010000, bt.call(0x80000000, 15)); | 2235 CHECK_EQ(0x00010000, bt.call(0x80000000, 15)); |
2255 } | 2236 } |
2256 } | 2237 } |
2257 | 2238 |
2258 | 2239 |
2259 TEST(RunWord32SarP) { | 2240 TEST(RunWord32SarP) { |
2260 { | 2241 { |
2261 FOR_INT32_SHIFTS(shift) { | 2242 FOR_INT32_SHIFTS(shift) { |
2262 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 2243 RawMachineAssemblerTester<int32_t> m(kMachInt32); |
2263 m.Return(m.Word32Sar(m.Parameter(0), m.Int32Constant(shift))); | 2244 m.Return(m.Word32Sar(m.Parameter(0), m.Int32Constant(shift))); |
2264 FOR_INT32_INPUTS(j) { | 2245 FOR_INT32_INPUTS(j) { |
2265 int32_t expected = *j >> shift; | 2246 int32_t expected = *j >> shift; |
2266 CHECK_EQ(expected, m.Call(*j)); | 2247 CHECK_EQ(expected, m.Call(*j)); |
2267 } | 2248 } |
2268 } | 2249 } |
2269 } | 2250 } |
2270 { | 2251 { |
2271 RawMachineAssemblerTester<int32_t> m; | 2252 RawMachineAssemblerTester<int32_t> m; |
2272 Int32BinopTester bt(&m); | 2253 Int32BinopTester bt(&m); |
2273 bt.AddReturn(m.Word32Sar(bt.param0, bt.param1)); | 2254 bt.AddReturn(m.Word32Sar(bt.param0, bt.param1)); |
2274 FOR_INT32_INPUTS(i) { | 2255 FOR_INT32_INPUTS(i) { |
2275 FOR_INT32_SHIFTS(shift) { | 2256 FOR_INT32_SHIFTS(shift) { |
2276 int32_t expected = *i >> shift; | 2257 int32_t expected = *i >> shift; |
2277 CHECK_EQ(expected, bt.call(*i, shift)); | 2258 CHECK_EQ(expected, bt.call(*i, shift)); |
2278 } | 2259 } |
2279 } | 2260 } |
2280 CHECK_EQ(0xFFFF0000, bt.call(0x80000000, 15)); | 2261 CHECK_EQ(0xFFFF0000, bt.call(0x80000000, 15)); |
2281 } | 2262 } |
2282 } | 2263 } |
2283 | 2264 |
2284 | 2265 |
2285 TEST(RunWord32NotP) { | 2266 TEST(RunWord32NotP) { |
2286 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 2267 RawMachineAssemblerTester<int32_t> m(kMachInt32); |
2287 m.Return(m.Word32Not(m.Parameter(0))); | 2268 m.Return(m.Word32Not(m.Parameter(0))); |
2288 FOR_UINT32_INPUTS(i) { | 2269 FOR_INT32_INPUTS(i) { |
2289 int expected = ~(*i); | 2270 int expected = ~(*i); |
2290 CHECK_EQ(expected, m.Call(*i)); | 2271 CHECK_EQ(expected, m.Call(*i)); |
2291 } | 2272 } |
2292 } | 2273 } |
2293 | 2274 |
2294 | 2275 |
2295 TEST(RunInt32NegP) { | 2276 TEST(RunInt32NegP) { |
2296 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 2277 RawMachineAssemblerTester<int32_t> m(kMachInt32); |
2297 m.Return(m.Int32Neg(m.Parameter(0))); | 2278 m.Return(m.Int32Neg(m.Parameter(0))); |
2298 FOR_INT32_INPUTS(i) { | 2279 FOR_INT32_INPUTS(i) { |
2299 int expected = -*i; | 2280 int expected = -*i; |
2300 CHECK_EQ(expected, m.Call(*i)); | 2281 CHECK_EQ(expected, m.Call(*i)); |
2301 } | 2282 } |
2302 } | 2283 } |
2303 | 2284 |
2304 | 2285 |
2305 TEST(RunWord32EqualAndWord32SarP) { | 2286 TEST(RunWord32EqualAndWord32SarP) { |
2306 { | 2287 { |
2307 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, | 2288 RawMachineAssemblerTester<int32_t> m(kMachInt32, kMachInt32, kMachUint32); |
2308 kMachineWord32); | |
2309 m.Return(m.Word32Equal(m.Parameter(0), | 2289 m.Return(m.Word32Equal(m.Parameter(0), |
2310 m.Word32Sar(m.Parameter(1), m.Parameter(2)))); | 2290 m.Word32Sar(m.Parameter(1), m.Parameter(2)))); |
2311 FOR_INT32_INPUTS(i) { | 2291 FOR_INT32_INPUTS(i) { |
2312 FOR_INT32_INPUTS(j) { | 2292 FOR_INT32_INPUTS(j) { |
2313 FOR_UINT32_SHIFTS(shift) { | 2293 FOR_UINT32_SHIFTS(shift) { |
2314 int32_t expected = (*i == (*j >> shift)); | 2294 int32_t expected = (*i == (*j >> shift)); |
2315 CHECK_EQ(expected, m.Call(*i, *j, shift)); | 2295 CHECK_EQ(expected, m.Call(*i, *j, shift)); |
2316 } | 2296 } |
2317 } | 2297 } |
2318 } | 2298 } |
2319 } | 2299 } |
2320 { | 2300 { |
2321 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, | 2301 RawMachineAssemblerTester<int32_t> m(kMachInt32, kMachUint32, kMachInt32); |
2322 kMachineWord32); | |
2323 m.Return(m.Word32Equal(m.Word32Sar(m.Parameter(0), m.Parameter(1)), | 2302 m.Return(m.Word32Equal(m.Word32Sar(m.Parameter(0), m.Parameter(1)), |
2324 m.Parameter(2))); | 2303 m.Parameter(2))); |
2325 FOR_INT32_INPUTS(i) { | 2304 FOR_INT32_INPUTS(i) { |
2326 FOR_UINT32_SHIFTS(shift) { | 2305 FOR_UINT32_SHIFTS(shift) { |
2327 FOR_INT32_INPUTS(k) { | 2306 FOR_INT32_INPUTS(k) { |
2328 int32_t expected = ((*i >> shift) == *k); | 2307 int32_t expected = ((*i >> shift) == *k); |
2329 CHECK_EQ(expected, m.Call(*i, shift, *k)); | 2308 CHECK_EQ(expected, m.Call(*i, shift, *k)); |
2330 } | 2309 } |
2331 } | 2310 } |
2332 } | 2311 } |
2333 } | 2312 } |
2334 } | 2313 } |
2335 | 2314 |
2336 | 2315 |
2337 TEST(RunWord32EqualAndWord32ShlP) { | 2316 TEST(RunWord32EqualAndWord32ShlP) { |
2338 { | 2317 { |
2339 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, | 2318 RawMachineAssemblerTester<int32_t> m(kMachUint32, kMachUint32, kMachUint32); |
2340 kMachineWord32); | |
2341 m.Return(m.Word32Equal(m.Parameter(0), | 2319 m.Return(m.Word32Equal(m.Parameter(0), |
2342 m.Word32Shl(m.Parameter(1), m.Parameter(2)))); | 2320 m.Word32Shl(m.Parameter(1), m.Parameter(2)))); |
2343 FOR_UINT32_INPUTS(i) { | 2321 FOR_UINT32_INPUTS(i) { |
2344 FOR_UINT32_INPUTS(j) { | 2322 FOR_UINT32_INPUTS(j) { |
2345 FOR_UINT32_SHIFTS(shift) { | 2323 FOR_UINT32_SHIFTS(shift) { |
2346 int32_t expected = (*i == (*j << shift)); | 2324 int32_t expected = (*i == (*j << shift)); |
2347 CHECK_EQ(expected, m.Call(*i, *j, shift)); | 2325 CHECK_EQ(expected, m.Call(*i, *j, shift)); |
2348 } | 2326 } |
2349 } | 2327 } |
2350 } | 2328 } |
2351 } | 2329 } |
2352 { | 2330 { |
2353 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, | 2331 RawMachineAssemblerTester<int32_t> m(kMachUint32, kMachUint32, kMachUint32); |
2354 kMachineWord32); | |
2355 m.Return(m.Word32Equal(m.Word32Shl(m.Parameter(0), m.Parameter(1)), | 2332 m.Return(m.Word32Equal(m.Word32Shl(m.Parameter(0), m.Parameter(1)), |
2356 m.Parameter(2))); | 2333 m.Parameter(2))); |
2357 FOR_UINT32_INPUTS(i) { | 2334 FOR_UINT32_INPUTS(i) { |
2358 FOR_UINT32_SHIFTS(shift) { | 2335 FOR_UINT32_SHIFTS(shift) { |
2359 FOR_UINT32_INPUTS(k) { | 2336 FOR_UINT32_INPUTS(k) { |
2360 int32_t expected = ((*i << shift) == *k); | 2337 int32_t expected = ((*i << shift) == *k); |
2361 CHECK_EQ(expected, m.Call(*i, shift, *k)); | 2338 CHECK_EQ(expected, m.Call(*i, shift, *k)); |
2362 } | 2339 } |
2363 } | 2340 } |
2364 } | 2341 } |
2365 } | 2342 } |
2366 } | 2343 } |
2367 | 2344 |
2368 | 2345 |
2369 TEST(RunWord32EqualAndWord32ShrP) { | 2346 TEST(RunWord32EqualAndWord32ShrP) { |
2370 { | 2347 { |
2371 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, | 2348 RawMachineAssemblerTester<int32_t> m(kMachUint32, kMachUint32, kMachUint32); |
2372 kMachineWord32); | |
2373 m.Return(m.Word32Equal(m.Parameter(0), | 2349 m.Return(m.Word32Equal(m.Parameter(0), |
2374 m.Word32Shr(m.Parameter(1), m.Parameter(2)))); | 2350 m.Word32Shr(m.Parameter(1), m.Parameter(2)))); |
2375 FOR_UINT32_INPUTS(i) { | 2351 FOR_UINT32_INPUTS(i) { |
2376 FOR_UINT32_INPUTS(j) { | 2352 FOR_UINT32_INPUTS(j) { |
2377 FOR_UINT32_SHIFTS(shift) { | 2353 FOR_UINT32_SHIFTS(shift) { |
2378 int32_t expected = (*i == (*j >> shift)); | 2354 int32_t expected = (*i == (*j >> shift)); |
2379 CHECK_EQ(expected, m.Call(*i, *j, shift)); | 2355 CHECK_EQ(expected, m.Call(*i, *j, shift)); |
2380 } | 2356 } |
2381 } | 2357 } |
2382 } | 2358 } |
2383 } | 2359 } |
2384 { | 2360 { |
2385 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, | 2361 RawMachineAssemblerTester<int32_t> m(kMachUint32, kMachUint32, kMachUint32); |
2386 kMachineWord32); | |
2387 m.Return(m.Word32Equal(m.Word32Shr(m.Parameter(0), m.Parameter(1)), | 2362 m.Return(m.Word32Equal(m.Word32Shr(m.Parameter(0), m.Parameter(1)), |
2388 m.Parameter(2))); | 2363 m.Parameter(2))); |
2389 FOR_UINT32_INPUTS(i) { | 2364 FOR_UINT32_INPUTS(i) { |
2390 FOR_UINT32_SHIFTS(shift) { | 2365 FOR_UINT32_SHIFTS(shift) { |
2391 FOR_UINT32_INPUTS(k) { | 2366 FOR_UINT32_INPUTS(k) { |
2392 int32_t expected = ((*i >> shift) == *k); | 2367 int32_t expected = ((*i >> shift) == *k); |
2393 CHECK_EQ(expected, m.Call(*i, shift, *k)); | 2368 CHECK_EQ(expected, m.Call(*i, shift, *k)); |
2394 } | 2369 } |
2395 } | 2370 } |
2396 } | 2371 } |
2397 } | 2372 } |
2398 } | 2373 } |
2399 | 2374 |
2400 | 2375 |
2401 TEST(RunDeadNodes) { | 2376 TEST(RunDeadNodes) { |
2402 for (int i = 0; true; i++) { | 2377 for (int i = 0; true; i++) { |
2403 RawMachineAssemblerTester<int32_t> m(i == 5 ? kMachineWord32 | 2378 RawMachineAssemblerTester<int32_t> m(i == 5 ? kMachInt32 : kMachNone); |
2404 : kMachineLast); | |
2405 int constant = 0x55 + i; | 2379 int constant = 0x55 + i; |
2406 switch (i) { | 2380 switch (i) { |
2407 case 0: | 2381 case 0: |
2408 m.Int32Constant(44); | 2382 m.Int32Constant(44); |
2409 break; | 2383 break; |
2410 case 1: | 2384 case 1: |
2411 m.StringConstant("unused"); | 2385 m.StringConstant("unused"); |
2412 break; | 2386 break; |
2413 case 2: | 2387 case 2: |
2414 m.NumberConstant(11.1); | 2388 m.NumberConstant(11.1); |
2415 break; | 2389 break; |
2416 case 3: | 2390 case 3: |
2417 m.PointerConstant(&constant); | 2391 m.PointerConstant(&constant); |
2418 break; | 2392 break; |
2419 case 4: | 2393 case 4: |
2420 m.LoadFromPointer(&constant, kMachineWord32); | 2394 m.LoadFromPointer(&constant, kMachInt32); |
2421 break; | 2395 break; |
2422 case 5: | 2396 case 5: |
2423 m.Parameter(0); | 2397 m.Parameter(0); |
2424 break; | 2398 break; |
2425 default: | 2399 default: |
2426 return; | 2400 return; |
2427 } | 2401 } |
2428 m.Return(m.Int32Constant(constant)); | 2402 m.Return(m.Int32Constant(constant)); |
2429 if (i != 5) { | 2403 if (i != 5) { |
2430 CHECK_EQ(constant, m.Call()); | 2404 CHECK_EQ(constant, m.Call()); |
(...skipping 13 matching lines...) Expand all Loading... |
2444 m.machine()->Word32Shr(), m.machine()->Word32Sar(), | 2418 m.machine()->Word32Shr(), m.machine()->Word32Sar(), |
2445 m.machine()->Word32Equal(), m.machine()->Int32Add(), | 2419 m.machine()->Word32Equal(), m.machine()->Int32Add(), |
2446 m.machine()->Int32Sub(), m.machine()->Int32Mul(), | 2420 m.machine()->Int32Sub(), m.machine()->Int32Mul(), |
2447 m.machine()->Int32Div(), m.machine()->Int32UDiv(), | 2421 m.machine()->Int32Div(), m.machine()->Int32UDiv(), |
2448 m.machine()->Int32Mod(), m.machine()->Int32UMod(), | 2422 m.machine()->Int32Mod(), m.machine()->Int32UMod(), |
2449 m.machine()->Int32LessThan(), m.machine()->Int32LessThanOrEqual(), | 2423 m.machine()->Int32LessThan(), m.machine()->Int32LessThanOrEqual(), |
2450 m.machine()->Uint32LessThan(), m.machine()->Uint32LessThanOrEqual(), | 2424 m.machine()->Uint32LessThan(), m.machine()->Uint32LessThanOrEqual(), |
2451 NULL}; | 2425 NULL}; |
2452 | 2426 |
2453 for (int i = 0; ops[i] != NULL; i++) { | 2427 for (int i = 0; ops[i] != NULL; i++) { |
2454 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32); | 2428 RawMachineAssemblerTester<int32_t> m(kMachInt32, kMachInt32); |
2455 int constant = 0x55555 + i; | 2429 int constant = 0x55555 + i; |
2456 m.NewNode(ops[i], m.Parameter(0), m.Parameter(1)); | 2430 m.NewNode(ops[i], m.Parameter(0), m.Parameter(1)); |
2457 m.Return(m.Int32Constant(constant)); | 2431 m.Return(m.Int32Constant(constant)); |
2458 | 2432 |
2459 CHECK_EQ(constant, m.Call(1, 1)); | 2433 CHECK_EQ(constant, m.Call(1, 1)); |
2460 } | 2434 } |
2461 } | 2435 } |
2462 | 2436 |
2463 | 2437 |
2464 template <typename Type, typename CType> | 2438 template <typename Type, typename CType> |
(...skipping 18 matching lines...) Expand all Loading... |
2483 Type expected = buffer[i]; | 2457 Type expected = buffer[i]; |
2484 Type actual = static_cast<CType>(m.Call()); | 2458 Type actual = static_cast<CType>(m.Call()); |
2485 CHECK_EQ(expected, actual); | 2459 CHECK_EQ(expected, actual); |
2486 printf("XXX\n"); | 2460 printf("XXX\n"); |
2487 } | 2461 } |
2488 } | 2462 } |
2489 } | 2463 } |
2490 | 2464 |
2491 | 2465 |
2492 TEST(RunLoadImmIndex) { | 2466 TEST(RunLoadImmIndex) { |
2493 RunLoadImmIndex<int8_t, uint8_t>(kMachineWord8); | 2467 RunLoadImmIndex<int8_t, uint8_t>(kMachInt8); |
2494 RunLoadImmIndex<int16_t, uint16_t>(kMachineWord16); | 2468 RunLoadImmIndex<int16_t, uint16_t>(kMachInt16); |
2495 RunLoadImmIndex<int32_t, uint32_t>(kMachineWord32); | 2469 RunLoadImmIndex<int32_t, uint32_t>(kMachInt32); |
2496 RunLoadImmIndex<int32_t*, int32_t*>(kMachineTagged); | 2470 RunLoadImmIndex<int32_t*, int32_t*>(kMachAnyTagged); |
2497 | 2471 |
2498 // TODO(titzer): test kMachineFloat64 loads | 2472 // TODO(titzer): test kRepBit loads |
| 2473 // TODO(titzer): test kMachFloat64 loads |
2499 // TODO(titzer): test various indexing modes. | 2474 // TODO(titzer): test various indexing modes. |
2500 } | 2475 } |
2501 | 2476 |
2502 | 2477 |
2503 template <typename CType> | 2478 template <typename CType> |
2504 static void RunLoadStore(MachineType rep) { | 2479 static void RunLoadStore(MachineType rep) { |
2505 const int kNumElems = 4; | 2480 const int kNumElems = 4; |
2506 CType buffer[kNumElems]; | 2481 CType buffer[kNumElems]; |
2507 | 2482 |
2508 for (int32_t x = 0; x < kNumElems; x++) { | 2483 for (int32_t x = 0; x < kNumElems; x++) { |
(...skipping 14 matching lines...) Expand all Loading... |
2523 m.Return(m.Int32Constant(OK)); | 2498 m.Return(m.Int32Constant(OK)); |
2524 | 2499 |
2525 CHECK_NE(buffer[x], buffer[y]); | 2500 CHECK_NE(buffer[x], buffer[y]); |
2526 CHECK_EQ(OK, m.Call()); | 2501 CHECK_EQ(OK, m.Call()); |
2527 CHECK_EQ(buffer[x], buffer[y]); | 2502 CHECK_EQ(buffer[x], buffer[y]); |
2528 } | 2503 } |
2529 } | 2504 } |
2530 | 2505 |
2531 | 2506 |
2532 TEST(RunLoadStore) { | 2507 TEST(RunLoadStore) { |
2533 RunLoadStore<int8_t>(kMachineWord8); | 2508 RunLoadStore<int8_t>(kMachInt8); |
2534 RunLoadStore<int16_t>(kMachineWord16); | 2509 RunLoadStore<int16_t>(kMachInt16); |
2535 RunLoadStore<int32_t>(kMachineWord32); | 2510 RunLoadStore<int32_t>(kMachInt32); |
2536 RunLoadStore<void*>(kMachineTagged); | 2511 RunLoadStore<void*>(kMachAnyTagged); |
2537 RunLoadStore<double>(kMachineFloat64); | 2512 RunLoadStore<double>(kMachFloat64); |
2538 } | 2513 } |
2539 | 2514 |
2540 | 2515 |
2541 TEST(RunFloat64Binop) { | 2516 TEST(RunFloat64Binop) { |
2542 RawMachineAssemblerTester<int32_t> m; | 2517 RawMachineAssemblerTester<int32_t> m; |
2543 double result; | 2518 double result; |
2544 | 2519 |
2545 Operator* ops[] = {m.machine()->Float64Add(), m.machine()->Float64Sub(), | 2520 Operator* ops[] = {m.machine()->Float64Add(), m.machine()->Float64Sub(), |
2546 m.machine()->Float64Mul(), m.machine()->Float64Div(), | 2521 m.machine()->Float64Mul(), m.machine()->Float64Div(), |
2547 m.machine()->Float64Mod(), NULL}; | 2522 m.machine()->Float64Mod(), NULL}; |
(...skipping 11 matching lines...) Expand all Loading... |
2559 NULL}; | 2534 NULL}; |
2560 | 2535 |
2561 for (int i = 0; ops[i] != NULL; i++) { | 2536 for (int i = 0; ops[i] != NULL; i++) { |
2562 for (int j = 0; inputs[j] != NULL; j += 2) { | 2537 for (int j = 0; inputs[j] != NULL; j += 2) { |
2563 RawMachineAssemblerTester<int32_t> m; | 2538 RawMachineAssemblerTester<int32_t> m; |
2564 Node* a = m.NewNode(inputs[j]); | 2539 Node* a = m.NewNode(inputs[j]); |
2565 Node* b = m.NewNode(inputs[j + 1]); | 2540 Node* b = m.NewNode(inputs[j + 1]); |
2566 Node* binop = m.NewNode(ops[i], a, b); | 2541 Node* binop = m.NewNode(ops[i], a, b); |
2567 Node* base = m.PointerConstant(&result); | 2542 Node* base = m.PointerConstant(&result); |
2568 Node* zero = m.Int32Constant(0); | 2543 Node* zero = m.Int32Constant(0); |
2569 m.Store(kMachineFloat64, base, zero, binop); | 2544 m.Store(kMachFloat64, base, zero, binop); |
2570 m.Return(m.Int32Constant(i + j)); | 2545 m.Return(m.Int32Constant(i + j)); |
2571 CHECK_EQ(i + j, m.Call()); | 2546 CHECK_EQ(i + j, m.Call()); |
2572 } | 2547 } |
2573 } | 2548 } |
2574 } | 2549 } |
2575 | 2550 |
2576 | 2551 |
2577 TEST(RunDeadFloat64Binops) { | 2552 TEST(RunDeadFloat64Binops) { |
2578 RawMachineAssemblerTester<int32_t> m; | 2553 RawMachineAssemblerTester<int32_t> m; |
2579 | 2554 |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2620 } | 2595 } |
2621 } | 2596 } |
2622 | 2597 |
2623 | 2598 |
2624 TEST(RunFloat64SubImm1) { | 2599 TEST(RunFloat64SubImm1) { |
2625 double input = 0.0; | 2600 double input = 0.0; |
2626 double output = 0.0; | 2601 double output = 0.0; |
2627 | 2602 |
2628 FOR_FLOAT64_INPUTS(i) { | 2603 FOR_FLOAT64_INPUTS(i) { |
2629 RawMachineAssemblerTester<int32_t> m; | 2604 RawMachineAssemblerTester<int32_t> m; |
2630 Node* t0 = m.LoadFromPointer(&input, kMachineFloat64); | 2605 Node* t0 = m.LoadFromPointer(&input, kMachFloat64); |
2631 Node* t1 = m.Float64Sub(m.Float64Constant(*i), t0); | 2606 Node* t1 = m.Float64Sub(m.Float64Constant(*i), t0); |
2632 m.StoreToPointer(&output, kMachineFloat64, t1); | 2607 m.StoreToPointer(&output, kMachFloat64, t1); |
2633 m.Return(m.Int32Constant(0)); | 2608 m.Return(m.Int32Constant(0)); |
2634 FOR_FLOAT64_INPUTS(j) { | 2609 FOR_FLOAT64_INPUTS(j) { |
2635 input = *j; | 2610 input = *j; |
2636 double expected = *i - input; | 2611 double expected = *i - input; |
2637 CHECK_EQ(0, m.Call()); | 2612 CHECK_EQ(0, m.Call()); |
2638 CHECK_EQ(expected, output); | 2613 CHECK_EQ(expected, output); |
2639 } | 2614 } |
2640 } | 2615 } |
2641 } | 2616 } |
2642 | 2617 |
2643 | 2618 |
2644 TEST(RunFloat64SubImm2) { | 2619 TEST(RunFloat64SubImm2) { |
2645 double input = 0.0; | 2620 double input = 0.0; |
2646 double output = 0.0; | 2621 double output = 0.0; |
2647 | 2622 |
2648 FOR_FLOAT64_INPUTS(i) { | 2623 FOR_FLOAT64_INPUTS(i) { |
2649 RawMachineAssemblerTester<int32_t> m; | 2624 RawMachineAssemblerTester<int32_t> m; |
2650 Node* t0 = m.LoadFromPointer(&input, kMachineFloat64); | 2625 Node* t0 = m.LoadFromPointer(&input, kMachFloat64); |
2651 Node* t1 = m.Float64Sub(t0, m.Float64Constant(*i)); | 2626 Node* t1 = m.Float64Sub(t0, m.Float64Constant(*i)); |
2652 m.StoreToPointer(&output, kMachineFloat64, t1); | 2627 m.StoreToPointer(&output, kMachFloat64, t1); |
2653 m.Return(m.Int32Constant(0)); | 2628 m.Return(m.Int32Constant(0)); |
2654 FOR_FLOAT64_INPUTS(j) { | 2629 FOR_FLOAT64_INPUTS(j) { |
2655 input = *j; | 2630 input = *j; |
2656 double expected = input - *i; | 2631 double expected = input - *i; |
2657 CHECK_EQ(0, m.Call()); | 2632 CHECK_EQ(0, m.Call()); |
2658 CHECK_EQ(expected, output); | 2633 CHECK_EQ(expected, output); |
2659 } | 2634 } |
2660 } | 2635 } |
2661 } | 2636 } |
2662 | 2637 |
(...skipping 14 matching lines...) Expand all Loading... |
2677 | 2652 |
2678 | 2653 |
2679 TEST(RunFloat64MulAndFloat64AddP) { | 2654 TEST(RunFloat64MulAndFloat64AddP) { |
2680 double input_a = 0.0; | 2655 double input_a = 0.0; |
2681 double input_b = 0.0; | 2656 double input_b = 0.0; |
2682 double input_c = 0.0; | 2657 double input_c = 0.0; |
2683 double output = 0.0; | 2658 double output = 0.0; |
2684 | 2659 |
2685 { | 2660 { |
2686 RawMachineAssemblerTester<int32_t> m; | 2661 RawMachineAssemblerTester<int32_t> m; |
2687 Node* a = m.LoadFromPointer(&input_a, kMachineFloat64); | 2662 Node* a = m.LoadFromPointer(&input_a, kMachFloat64); |
2688 Node* b = m.LoadFromPointer(&input_b, kMachineFloat64); | 2663 Node* b = m.LoadFromPointer(&input_b, kMachFloat64); |
2689 Node* c = m.LoadFromPointer(&input_c, kMachineFloat64); | 2664 Node* c = m.LoadFromPointer(&input_c, kMachFloat64); |
2690 m.StoreToPointer(&output, kMachineFloat64, | 2665 m.StoreToPointer(&output, kMachFloat64, |
2691 m.Float64Add(m.Float64Mul(a, b), c)); | 2666 m.Float64Add(m.Float64Mul(a, b), c)); |
2692 m.Return(m.Int32Constant(0)); | 2667 m.Return(m.Int32Constant(0)); |
2693 FOR_FLOAT64_INPUTS(i) { | 2668 FOR_FLOAT64_INPUTS(i) { |
2694 FOR_FLOAT64_INPUTS(j) { | 2669 FOR_FLOAT64_INPUTS(j) { |
2695 FOR_FLOAT64_INPUTS(k) { | 2670 FOR_FLOAT64_INPUTS(k) { |
2696 input_a = *i; | 2671 input_a = *i; |
2697 input_b = *j; | 2672 input_b = *j; |
2698 input_c = *k; | 2673 input_c = *k; |
2699 volatile double temp = input_a * input_b; | 2674 volatile double temp = input_a * input_b; |
2700 volatile double expected = temp + input_c; | 2675 volatile double expected = temp + input_c; |
2701 CHECK_EQ(0, m.Call()); | 2676 CHECK_EQ(0, m.Call()); |
2702 CHECK_EQ(expected, output); | 2677 CHECK_EQ(expected, output); |
2703 } | 2678 } |
2704 } | 2679 } |
2705 } | 2680 } |
2706 } | 2681 } |
2707 { | 2682 { |
2708 RawMachineAssemblerTester<int32_t> m; | 2683 RawMachineAssemblerTester<int32_t> m; |
2709 Node* a = m.LoadFromPointer(&input_a, kMachineFloat64); | 2684 Node* a = m.LoadFromPointer(&input_a, kMachFloat64); |
2710 Node* b = m.LoadFromPointer(&input_b, kMachineFloat64); | 2685 Node* b = m.LoadFromPointer(&input_b, kMachFloat64); |
2711 Node* c = m.LoadFromPointer(&input_c, kMachineFloat64); | 2686 Node* c = m.LoadFromPointer(&input_c, kMachFloat64); |
2712 m.StoreToPointer(&output, kMachineFloat64, | 2687 m.StoreToPointer(&output, kMachFloat64, |
2713 m.Float64Add(a, m.Float64Mul(b, c))); | 2688 m.Float64Add(a, m.Float64Mul(b, c))); |
2714 m.Return(m.Int32Constant(0)); | 2689 m.Return(m.Int32Constant(0)); |
2715 FOR_FLOAT64_INPUTS(i) { | 2690 FOR_FLOAT64_INPUTS(i) { |
2716 FOR_FLOAT64_INPUTS(j) { | 2691 FOR_FLOAT64_INPUTS(j) { |
2717 FOR_FLOAT64_INPUTS(k) { | 2692 FOR_FLOAT64_INPUTS(k) { |
2718 input_a = *i; | 2693 input_a = *i; |
2719 input_b = *j; | 2694 input_b = *j; |
2720 input_c = *k; | 2695 input_c = *k; |
2721 volatile double temp = input_b * input_c; | 2696 volatile double temp = input_b * input_c; |
2722 volatile double expected = input_a + temp; | 2697 volatile double expected = input_a + temp; |
2723 CHECK_EQ(0, m.Call()); | 2698 CHECK_EQ(0, m.Call()); |
2724 CHECK_EQ(expected, output); | 2699 CHECK_EQ(expected, output); |
2725 } | 2700 } |
2726 } | 2701 } |
2727 } | 2702 } |
2728 } | 2703 } |
2729 } | 2704 } |
2730 | 2705 |
2731 | 2706 |
2732 TEST(RunFloat64MulAndFloat64SubP) { | 2707 TEST(RunFloat64MulAndFloat64SubP) { |
2733 double input_a = 0.0; | 2708 double input_a = 0.0; |
2734 double input_b = 0.0; | 2709 double input_b = 0.0; |
2735 double input_c = 0.0; | 2710 double input_c = 0.0; |
2736 double output = 0.0; | 2711 double output = 0.0; |
2737 | 2712 |
2738 RawMachineAssemblerTester<int32_t> m; | 2713 RawMachineAssemblerTester<int32_t> m; |
2739 Node* a = m.LoadFromPointer(&input_a, kMachineFloat64); | 2714 Node* a = m.LoadFromPointer(&input_a, kMachFloat64); |
2740 Node* b = m.LoadFromPointer(&input_b, kMachineFloat64); | 2715 Node* b = m.LoadFromPointer(&input_b, kMachFloat64); |
2741 Node* c = m.LoadFromPointer(&input_c, kMachineFloat64); | 2716 Node* c = m.LoadFromPointer(&input_c, kMachFloat64); |
2742 m.StoreToPointer(&output, kMachineFloat64, | 2717 m.StoreToPointer(&output, kMachFloat64, m.Float64Sub(a, m.Float64Mul(b, c))); |
2743 m.Float64Sub(a, m.Float64Mul(b, c))); | |
2744 m.Return(m.Int32Constant(0)); | 2718 m.Return(m.Int32Constant(0)); |
2745 | 2719 |
2746 FOR_FLOAT64_INPUTS(i) { | 2720 FOR_FLOAT64_INPUTS(i) { |
2747 FOR_FLOAT64_INPUTS(j) { | 2721 FOR_FLOAT64_INPUTS(j) { |
2748 FOR_FLOAT64_INPUTS(k) { | 2722 FOR_FLOAT64_INPUTS(k) { |
2749 input_a = *i; | 2723 input_a = *i; |
2750 input_b = *j; | 2724 input_b = *j; |
2751 input_c = *k; | 2725 input_c = *k; |
2752 volatile double temp = input_b * input_c; | 2726 volatile double temp = input_b * input_c; |
2753 volatile double expected = input_a - temp; | 2727 volatile double expected = input_a - temp; |
2754 CHECK_EQ(0, m.Call()); | 2728 CHECK_EQ(0, m.Call()); |
2755 CHECK_EQ(expected, output); | 2729 CHECK_EQ(expected, output); |
2756 } | 2730 } |
2757 } | 2731 } |
2758 } | 2732 } |
2759 } | 2733 } |
2760 | 2734 |
2761 | 2735 |
2762 TEST(RunFloat64MulImm) { | 2736 TEST(RunFloat64MulImm) { |
2763 double input = 0.0; | 2737 double input = 0.0; |
2764 double output = 0.0; | 2738 double output = 0.0; |
2765 | 2739 |
2766 { | 2740 { |
2767 FOR_FLOAT64_INPUTS(i) { | 2741 FOR_FLOAT64_INPUTS(i) { |
2768 RawMachineAssemblerTester<int32_t> m; | 2742 RawMachineAssemblerTester<int32_t> m; |
2769 Node* t0 = m.LoadFromPointer(&input, kMachineFloat64); | 2743 Node* t0 = m.LoadFromPointer(&input, kMachFloat64); |
2770 Node* t1 = m.Float64Mul(m.Float64Constant(*i), t0); | 2744 Node* t1 = m.Float64Mul(m.Float64Constant(*i), t0); |
2771 m.StoreToPointer(&output, kMachineFloat64, t1); | 2745 m.StoreToPointer(&output, kMachFloat64, t1); |
2772 m.Return(m.Int32Constant(0)); | 2746 m.Return(m.Int32Constant(0)); |
2773 FOR_FLOAT64_INPUTS(j) { | 2747 FOR_FLOAT64_INPUTS(j) { |
2774 input = *j; | 2748 input = *j; |
2775 double expected = *i * input; | 2749 double expected = *i * input; |
2776 CHECK_EQ(0, m.Call()); | 2750 CHECK_EQ(0, m.Call()); |
2777 CHECK_EQ(expected, output); | 2751 CHECK_EQ(expected, output); |
2778 } | 2752 } |
2779 } | 2753 } |
2780 } | 2754 } |
2781 { | 2755 { |
2782 FOR_FLOAT64_INPUTS(i) { | 2756 FOR_FLOAT64_INPUTS(i) { |
2783 RawMachineAssemblerTester<int32_t> m; | 2757 RawMachineAssemblerTester<int32_t> m; |
2784 Node* t0 = m.LoadFromPointer(&input, kMachineFloat64); | 2758 Node* t0 = m.LoadFromPointer(&input, kMachFloat64); |
2785 Node* t1 = m.Float64Mul(t0, m.Float64Constant(*i)); | 2759 Node* t1 = m.Float64Mul(t0, m.Float64Constant(*i)); |
2786 m.StoreToPointer(&output, kMachineFloat64, t1); | 2760 m.StoreToPointer(&output, kMachFloat64, t1); |
2787 m.Return(m.Int32Constant(0)); | 2761 m.Return(m.Int32Constant(0)); |
2788 FOR_FLOAT64_INPUTS(j) { | 2762 FOR_FLOAT64_INPUTS(j) { |
2789 input = *j; | 2763 input = *j; |
2790 double expected = input * *i; | 2764 double expected = input * *i; |
2791 CHECK_EQ(0, m.Call()); | 2765 CHECK_EQ(0, m.Call()); |
2792 CHECK_EQ(expected, output); | 2766 CHECK_EQ(expected, output); |
2793 } | 2767 } |
2794 } | 2768 } |
2795 } | 2769 } |
2796 } | 2770 } |
(...skipping 29 matching lines...) Expand all Loading... |
2826 } | 2800 } |
2827 } | 2801 } |
2828 | 2802 |
2829 | 2803 |
2830 TEST(RunChangeInt32ToFloat64_A) { | 2804 TEST(RunChangeInt32ToFloat64_A) { |
2831 RawMachineAssemblerTester<int32_t> m; | 2805 RawMachineAssemblerTester<int32_t> m; |
2832 int32_t magic = 0x986234; | 2806 int32_t magic = 0x986234; |
2833 double result = 0; | 2807 double result = 0; |
2834 | 2808 |
2835 Node* convert = m.ChangeInt32ToFloat64(m.Int32Constant(magic)); | 2809 Node* convert = m.ChangeInt32ToFloat64(m.Int32Constant(magic)); |
2836 m.Store(kMachineFloat64, m.PointerConstant(&result), m.Int32Constant(0), | 2810 m.Store(kMachFloat64, m.PointerConstant(&result), m.Int32Constant(0), |
2837 convert); | 2811 convert); |
2838 m.Return(m.Int32Constant(magic)); | 2812 m.Return(m.Int32Constant(magic)); |
2839 | 2813 |
2840 CHECK_EQ(magic, m.Call()); | 2814 CHECK_EQ(magic, m.Call()); |
2841 CHECK_EQ(static_cast<double>(magic), result); | 2815 CHECK_EQ(static_cast<double>(magic), result); |
2842 } | 2816 } |
2843 | 2817 |
2844 | 2818 |
2845 TEST(RunChangeInt32ToFloat64_B) { | 2819 TEST(RunChangeInt32ToFloat64_B) { |
2846 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 2820 RawMachineAssemblerTester<int32_t> m(kMachInt32); |
2847 double output = 0; | 2821 double output = 0; |
2848 | 2822 |
2849 Node* convert = m.ChangeInt32ToFloat64(m.Parameter(0)); | 2823 Node* convert = m.ChangeInt32ToFloat64(m.Parameter(0)); |
2850 m.Store(kMachineFloat64, m.PointerConstant(&output), m.Int32Constant(0), | 2824 m.Store(kMachFloat64, m.PointerConstant(&output), m.Int32Constant(0), |
2851 convert); | 2825 convert); |
2852 m.Return(m.Parameter(0)); | 2826 m.Return(m.Parameter(0)); |
2853 | 2827 |
2854 FOR_INT32_INPUTS(i) { | 2828 FOR_INT32_INPUTS(i) { |
2855 int32_t expect = *i; | 2829 int32_t expect = *i; |
2856 CHECK_EQ(expect, m.Call(expect)); | 2830 CHECK_EQ(expect, m.Call(expect)); |
2857 CHECK_EQ(static_cast<double>(expect), output); | 2831 CHECK_EQ(static_cast<double>(expect), output); |
2858 } | 2832 } |
2859 } | 2833 } |
2860 | 2834 |
2861 | 2835 |
2862 TEST(RunChangeUint32ToFloat64_B) { | 2836 TEST(RunChangeUint32ToFloat64_B) { |
2863 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 2837 RawMachineAssemblerTester<int32_t> m(kMachUint32); |
2864 double output = 0; | 2838 double output = 0; |
2865 | 2839 |
2866 Node* convert = m.ChangeUint32ToFloat64(m.Parameter(0)); | 2840 Node* convert = m.ChangeUint32ToFloat64(m.Parameter(0)); |
2867 m.Store(kMachineFloat64, m.PointerConstant(&output), m.Int32Constant(0), | 2841 m.Store(kMachFloat64, m.PointerConstant(&output), m.Int32Constant(0), |
2868 convert); | 2842 convert); |
2869 m.Return(m.Parameter(0)); | 2843 m.Return(m.Parameter(0)); |
2870 | 2844 |
2871 FOR_UINT32_INPUTS(i) { | 2845 FOR_UINT32_INPUTS(i) { |
2872 uint32_t expect = *i; | 2846 uint32_t expect = *i; |
2873 CHECK_EQ(expect, m.Call(expect)); | 2847 CHECK_EQ(expect, m.Call(expect)); |
2874 CHECK_EQ(static_cast<double>(expect), output); | 2848 CHECK_EQ(static_cast<double>(expect), output); |
2875 } | 2849 } |
2876 } | 2850 } |
2877 | 2851 |
2878 | 2852 |
2879 TEST(RunChangeFloat64ToInt32_A) { | 2853 TEST(RunChangeFloat64ToInt32_A) { |
2880 RawMachineAssemblerTester<int32_t> m; | 2854 RawMachineAssemblerTester<int32_t> m; |
2881 int32_t magic = 0x786234; | 2855 int32_t magic = 0x786234; |
2882 double input = 11.1; | 2856 double input = 11.1; |
2883 int32_t result = 0; | 2857 int32_t result = 0; |
2884 | 2858 |
2885 m.Store(kMachineWord32, m.PointerConstant(&result), m.Int32Constant(0), | 2859 m.Store(kMachInt32, m.PointerConstant(&result), m.Int32Constant(0), |
2886 m.ChangeFloat64ToInt32(m.Float64Constant(input))); | 2860 m.ChangeFloat64ToInt32(m.Float64Constant(input))); |
2887 m.Return(m.Int32Constant(magic)); | 2861 m.Return(m.Int32Constant(magic)); |
2888 | 2862 |
2889 CHECK_EQ(magic, m.Call()); | 2863 CHECK_EQ(magic, m.Call()); |
2890 CHECK_EQ(static_cast<int32_t>(input), result); | 2864 CHECK_EQ(static_cast<int32_t>(input), result); |
2891 } | 2865 } |
2892 | 2866 |
2893 | 2867 |
2894 TEST(RunChangeFloat64ToInt32_B) { | 2868 TEST(RunChangeFloat64ToInt32_B) { |
2895 RawMachineAssemblerTester<int32_t> m; | 2869 RawMachineAssemblerTester<int32_t> m; |
2896 double input = 0; | 2870 double input = 0; |
2897 int32_t output = 0; | 2871 int32_t output = 0; |
2898 | 2872 |
2899 Node* load = | 2873 Node* load = |
2900 m.Load(kMachineFloat64, m.PointerConstant(&input), m.Int32Constant(0)); | 2874 m.Load(kMachFloat64, m.PointerConstant(&input), m.Int32Constant(0)); |
2901 Node* convert = m.ChangeFloat64ToInt32(load); | 2875 Node* convert = m.ChangeFloat64ToInt32(load); |
2902 m.Store(kMachineWord32, m.PointerConstant(&output), m.Int32Constant(0), | 2876 m.Store(kMachInt32, m.PointerConstant(&output), m.Int32Constant(0), convert); |
2903 convert); | |
2904 m.Return(convert); | 2877 m.Return(convert); |
2905 | 2878 |
2906 { | 2879 { |
2907 FOR_INT32_INPUTS(i) { | 2880 FOR_INT32_INPUTS(i) { |
2908 input = *i; | 2881 input = *i; |
2909 int32_t expect = *i; | 2882 int32_t expect = *i; |
2910 CHECK_EQ(expect, m.Call()); | 2883 CHECK_EQ(expect, m.Call()); |
2911 CHECK_EQ(expect, output); | 2884 CHECK_EQ(expect, output); |
2912 } | 2885 } |
2913 } | 2886 } |
(...skipping 18 matching lines...) Expand all Loading... |
2932 // really should be Change operators. | 2905 // really should be Change operators. |
2933 } | 2906 } |
2934 | 2907 |
2935 | 2908 |
2936 TEST(RunChangeFloat64ToUint32_B) { | 2909 TEST(RunChangeFloat64ToUint32_B) { |
2937 RawMachineAssemblerTester<int32_t> m; | 2910 RawMachineAssemblerTester<int32_t> m; |
2938 double input = 0; | 2911 double input = 0; |
2939 int32_t output = 0; | 2912 int32_t output = 0; |
2940 | 2913 |
2941 Node* load = | 2914 Node* load = |
2942 m.Load(kMachineFloat64, m.PointerConstant(&input), m.Int32Constant(0)); | 2915 m.Load(kMachFloat64, m.PointerConstant(&input), m.Int32Constant(0)); |
2943 Node* convert = m.ChangeFloat64ToUint32(load); | 2916 Node* convert = m.ChangeFloat64ToUint32(load); |
2944 m.Store(kMachineWord32, m.PointerConstant(&output), m.Int32Constant(0), | 2917 m.Store(kMachInt32, m.PointerConstant(&output), m.Int32Constant(0), convert); |
2945 convert); | |
2946 m.Return(convert); | 2918 m.Return(convert); |
2947 | 2919 |
2948 { | 2920 { |
2949 FOR_UINT32_INPUTS(i) { | 2921 FOR_UINT32_INPUTS(i) { |
2950 input = *i; | 2922 input = *i; |
2951 // TODO(titzer): add a CheckEqualsHelper overload for uint32_t. | 2923 // TODO(titzer): add a CheckEqualsHelper overload for uint32_t. |
2952 int32_t expect = static_cast<int32_t>(*i); | 2924 int32_t expect = static_cast<int32_t>(*i); |
2953 CHECK_EQ(expect, m.Call()); | 2925 CHECK_EQ(expect, m.Call()); |
2954 CHECK_EQ(expect, output); | 2926 CHECK_EQ(expect, output); |
2955 } | 2927 } |
(...skipping 22 matching lines...) Expand all Loading... |
2978 | 2950 |
2979 TEST(RunChangeFloat64ToInt32_spilled) { | 2951 TEST(RunChangeFloat64ToInt32_spilled) { |
2980 RawMachineAssemblerTester<int32_t> m; | 2952 RawMachineAssemblerTester<int32_t> m; |
2981 const int kNumInputs = 32; | 2953 const int kNumInputs = 32; |
2982 int32_t magic = 0x786234; | 2954 int32_t magic = 0x786234; |
2983 double input[kNumInputs]; | 2955 double input[kNumInputs]; |
2984 int32_t result[kNumInputs]; | 2956 int32_t result[kNumInputs]; |
2985 Node* input_node[kNumInputs]; | 2957 Node* input_node[kNumInputs]; |
2986 | 2958 |
2987 for (int i = 0; i < kNumInputs; i++) { | 2959 for (int i = 0; i < kNumInputs; i++) { |
2988 input_node[i] = m.Load(kMachineFloat64, m.PointerConstant(&input), | 2960 input_node[i] = |
2989 m.Int32Constant(i * 8)); | 2961 m.Load(kMachFloat64, m.PointerConstant(&input), m.Int32Constant(i * 8)); |
2990 } | 2962 } |
2991 | 2963 |
2992 for (int i = 0; i < kNumInputs; i++) { | 2964 for (int i = 0; i < kNumInputs; i++) { |
2993 m.Store(kMachineWord32, m.PointerConstant(&result), m.Int32Constant(i * 4), | 2965 m.Store(kMachInt32, m.PointerConstant(&result), m.Int32Constant(i * 4), |
2994 m.ChangeFloat64ToInt32(input_node[i])); | 2966 m.ChangeFloat64ToInt32(input_node[i])); |
2995 } | 2967 } |
2996 | 2968 |
2997 m.Return(m.Int32Constant(magic)); | 2969 m.Return(m.Int32Constant(magic)); |
2998 | 2970 |
2999 for (int i = 0; i < kNumInputs; i++) { | 2971 for (int i = 0; i < kNumInputs; i++) { |
3000 input[i] = 100.9 + i; | 2972 input[i] = 100.9 + i; |
3001 } | 2973 } |
3002 | 2974 |
3003 CHECK_EQ(magic, m.Call()); | 2975 CHECK_EQ(magic, m.Call()); |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3059 MLabel blocka, blockb, end; | 3031 MLabel blocka, blockb, end; |
3060 Node* k1 = m.Float64Constant(constant); | 3032 Node* k1 = m.Float64Constant(constant); |
3061 Node* k2 = m.Float64Constant(0 - constant); | 3033 Node* k2 = m.Float64Constant(0 - constant); |
3062 m.Branch(m.Int32Constant(0), &blocka, &blockb); | 3034 m.Branch(m.Int32Constant(0), &blocka, &blockb); |
3063 m.Bind(&blocka); | 3035 m.Bind(&blocka); |
3064 m.Goto(&end); | 3036 m.Goto(&end); |
3065 m.Bind(&blockb); | 3037 m.Bind(&blockb); |
3066 m.Goto(&end); | 3038 m.Goto(&end); |
3067 m.Bind(&end); | 3039 m.Bind(&end); |
3068 Node* phi = m.Phi(k2, k1); | 3040 Node* phi = m.Phi(k2, k1); |
3069 m.Store(kMachineFloat64, m.PointerConstant(&buffer), m.Int32Constant(0), phi); | 3041 m.Store(kMachFloat64, m.PointerConstant(&buffer), m.Int32Constant(0), phi); |
3070 m.Return(m.Int32Constant(magic)); | 3042 m.Return(m.Int32Constant(magic)); |
3071 | 3043 |
3072 CHECK_EQ(magic, m.Call()); | 3044 CHECK_EQ(magic, m.Call()); |
3073 CHECK_EQ(constant, buffer); | 3045 CHECK_EQ(constant, buffer); |
3074 } | 3046 } |
3075 | 3047 |
3076 | 3048 |
3077 TEST(RunRefDiamond) { | 3049 TEST(RunRefDiamond) { |
3078 RawMachineAssemblerTester<int32_t> m; | 3050 RawMachineAssemblerTester<int32_t> m; |
3079 | 3051 |
3080 const int magic = 99644; | 3052 const int magic = 99644; |
3081 Handle<String> rexpected = | 3053 Handle<String> rexpected = |
3082 CcTest::i_isolate()->factory()->InternalizeUtf8String("A"); | 3054 CcTest::i_isolate()->factory()->InternalizeUtf8String("A"); |
3083 String* buffer; | 3055 String* buffer; |
3084 | 3056 |
3085 MLabel blocka, blockb, end; | 3057 MLabel blocka, blockb, end; |
3086 Node* k1 = m.StringConstant("A"); | 3058 Node* k1 = m.StringConstant("A"); |
3087 Node* k2 = m.StringConstant("B"); | 3059 Node* k2 = m.StringConstant("B"); |
3088 m.Branch(m.Int32Constant(0), &blocka, &blockb); | 3060 m.Branch(m.Int32Constant(0), &blocka, &blockb); |
3089 m.Bind(&blocka); | 3061 m.Bind(&blocka); |
3090 m.Goto(&end); | 3062 m.Goto(&end); |
3091 m.Bind(&blockb); | 3063 m.Bind(&blockb); |
3092 m.Goto(&end); | 3064 m.Goto(&end); |
3093 m.Bind(&end); | 3065 m.Bind(&end); |
3094 Node* phi = m.Phi(k2, k1); | 3066 Node* phi = m.Phi(k2, k1); |
3095 m.Store(kMachineTagged, m.PointerConstant(&buffer), m.Int32Constant(0), phi); | 3067 m.Store(kMachAnyTagged, m.PointerConstant(&buffer), m.Int32Constant(0), phi); |
3096 m.Return(m.Int32Constant(magic)); | 3068 m.Return(m.Int32Constant(magic)); |
3097 | 3069 |
3098 CHECK_EQ(magic, m.Call()); | 3070 CHECK_EQ(magic, m.Call()); |
3099 CHECK(rexpected->SameValue(buffer)); | 3071 CHECK(rexpected->SameValue(buffer)); |
3100 } | 3072 } |
3101 | 3073 |
3102 | 3074 |
3103 TEST(RunDoubleRefDiamond) { | 3075 TEST(RunDoubleRefDiamond) { |
3104 RawMachineAssemblerTester<int32_t> m; | 3076 RawMachineAssemblerTester<int32_t> m; |
3105 | 3077 |
(...skipping 10 matching lines...) Expand all Loading... |
3116 Node* r1 = m.StringConstant("AX"); | 3088 Node* r1 = m.StringConstant("AX"); |
3117 Node* r2 = m.StringConstant("BX"); | 3089 Node* r2 = m.StringConstant("BX"); |
3118 m.Branch(m.Int32Constant(0), &blocka, &blockb); | 3090 m.Branch(m.Int32Constant(0), &blocka, &blockb); |
3119 m.Bind(&blocka); | 3091 m.Bind(&blocka); |
3120 m.Goto(&end); | 3092 m.Goto(&end); |
3121 m.Bind(&blockb); | 3093 m.Bind(&blockb); |
3122 m.Goto(&end); | 3094 m.Goto(&end); |
3123 m.Bind(&end); | 3095 m.Bind(&end); |
3124 Node* dphi = m.Phi(d2, d1); | 3096 Node* dphi = m.Phi(d2, d1); |
3125 Node* rphi = m.Phi(r2, r1); | 3097 Node* rphi = m.Phi(r2, r1); |
3126 m.Store(kMachineFloat64, m.PointerConstant(&dbuffer), m.Int32Constant(0), | 3098 m.Store(kMachFloat64, m.PointerConstant(&dbuffer), m.Int32Constant(0), dphi); |
3127 dphi); | 3099 m.Store(kMachAnyTagged, m.PointerConstant(&rbuffer), m.Int32Constant(0), |
3128 m.Store(kMachineTagged, m.PointerConstant(&rbuffer), m.Int32Constant(0), | |
3129 rphi); | 3100 rphi); |
3130 m.Return(m.Int32Constant(magic)); | 3101 m.Return(m.Int32Constant(magic)); |
3131 | 3102 |
3132 CHECK_EQ(magic, m.Call()); | 3103 CHECK_EQ(magic, m.Call()); |
3133 CHECK_EQ(dconstant, dbuffer); | 3104 CHECK_EQ(dconstant, dbuffer); |
3134 CHECK(rexpected->SameValue(rbuffer)); | 3105 CHECK(rexpected->SameValue(rbuffer)); |
3135 } | 3106 } |
3136 | 3107 |
3137 | 3108 |
3138 TEST(RunDoubleRefDoubleDiamond) { | 3109 TEST(RunDoubleRefDoubleDiamond) { |
(...skipping 22 matching lines...) Expand all Loading... |
3161 m.Branch(m.Int32Constant(0), &blockd, &blocke); | 3132 m.Branch(m.Int32Constant(0), &blockd, &blocke); |
3162 | 3133 |
3163 m.Bind(&blockd); | 3134 m.Bind(&blockd); |
3164 m.Goto(&end); | 3135 m.Goto(&end); |
3165 m.Bind(&blocke); | 3136 m.Bind(&blocke); |
3166 m.Goto(&end); | 3137 m.Goto(&end); |
3167 m.Bind(&end); | 3138 m.Bind(&end); |
3168 Node* dphi2 = m.Phi(d1, dphi1); | 3139 Node* dphi2 = m.Phi(d1, dphi1); |
3169 Node* rphi2 = m.Phi(r1, rphi1); | 3140 Node* rphi2 = m.Phi(r1, rphi1); |
3170 | 3141 |
3171 m.Store(kMachineFloat64, m.PointerConstant(&dbuffer), m.Int32Constant(0), | 3142 m.Store(kMachFloat64, m.PointerConstant(&dbuffer), m.Int32Constant(0), dphi2); |
3172 dphi2); | 3143 m.Store(kMachAnyTagged, m.PointerConstant(&rbuffer), m.Int32Constant(0), |
3173 m.Store(kMachineTagged, m.PointerConstant(&rbuffer), m.Int32Constant(0), | |
3174 rphi2); | 3144 rphi2); |
3175 m.Return(m.Int32Constant(magic)); | 3145 m.Return(m.Int32Constant(magic)); |
3176 | 3146 |
3177 CHECK_EQ(magic, m.Call()); | 3147 CHECK_EQ(magic, m.Call()); |
3178 CHECK_EQ(dconstant, dbuffer); | 3148 CHECK_EQ(dconstant, dbuffer); |
3179 CHECK(rexpected->SameValue(rbuffer)); | 3149 CHECK(rexpected->SameValue(rbuffer)); |
3180 } | 3150 } |
3181 | 3151 |
3182 | 3152 |
3183 TEST(RunDoubleLoopPhi) { | 3153 TEST(RunDoubleLoopPhi) { |
3184 RawMachineAssemblerTester<int32_t> m; | 3154 RawMachineAssemblerTester<int32_t> m; |
3185 MLabel header, body, end; | 3155 MLabel header, body, end; |
3186 | 3156 |
3187 int magic = 99773; | 3157 int magic = 99773; |
3188 double buffer = 0.99; | 3158 double buffer = 0.99; |
3189 double dconstant = 777.1; | 3159 double dconstant = 777.1; |
3190 | 3160 |
3191 Node* zero = m.Int32Constant(0); | 3161 Node* zero = m.Int32Constant(0); |
3192 Node* dk = m.Float64Constant(dconstant); | 3162 Node* dk = m.Float64Constant(dconstant); |
3193 | 3163 |
3194 m.Goto(&header); | 3164 m.Goto(&header); |
3195 m.Bind(&header); | 3165 m.Bind(&header); |
3196 Node* phi = m.Phi(dk, dk); | 3166 Node* phi = m.Phi(dk, dk); |
3197 phi->ReplaceInput(1, phi); | 3167 phi->ReplaceInput(1, phi); |
3198 m.Branch(zero, &body, &end); | 3168 m.Branch(zero, &body, &end); |
3199 m.Bind(&body); | 3169 m.Bind(&body); |
3200 m.Goto(&header); | 3170 m.Goto(&header); |
3201 m.Bind(&end); | 3171 m.Bind(&end); |
3202 m.Store(kMachineFloat64, m.PointerConstant(&buffer), m.Int32Constant(0), phi); | 3172 m.Store(kMachFloat64, m.PointerConstant(&buffer), m.Int32Constant(0), phi); |
3203 m.Return(m.Int32Constant(magic)); | 3173 m.Return(m.Int32Constant(magic)); |
3204 | 3174 |
3205 CHECK_EQ(magic, m.Call()); | 3175 CHECK_EQ(magic, m.Call()); |
3206 } | 3176 } |
3207 | 3177 |
3208 | 3178 |
3209 TEST(RunCountToTenAccRaw) { | 3179 TEST(RunCountToTenAccRaw) { |
3210 RawMachineAssemblerTester<int32_t> m; | 3180 RawMachineAssemblerTester<int32_t> m; |
3211 | 3181 |
3212 Node* zero = m.Int32Constant(0); | 3182 Node* zero = m.Int32Constant(0); |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3273 | 3243 |
3274 CHECK_EQ(10, m.Call()); | 3244 CHECK_EQ(10, m.Call()); |
3275 } | 3245 } |
3276 | 3246 |
3277 | 3247 |
3278 TEST(RunAddTree) { | 3248 TEST(RunAddTree) { |
3279 RawMachineAssemblerTester<int32_t> m; | 3249 RawMachineAssemblerTester<int32_t> m; |
3280 int32_t inputs[] = {11, 12, 13, 14, 15, 16, 17, 18}; | 3250 int32_t inputs[] = {11, 12, 13, 14, 15, 16, 17, 18}; |
3281 | 3251 |
3282 Node* base = m.PointerConstant(inputs); | 3252 Node* base = m.PointerConstant(inputs); |
3283 Node* n0 = m.Load(kMachineWord32, base, m.Int32Constant(0 * sizeof(int32_t))); | 3253 Node* n0 = m.Load(kMachInt32, base, m.Int32Constant(0 * sizeof(int32_t))); |
3284 Node* n1 = m.Load(kMachineWord32, base, m.Int32Constant(1 * sizeof(int32_t))); | 3254 Node* n1 = m.Load(kMachInt32, base, m.Int32Constant(1 * sizeof(int32_t))); |
3285 Node* n2 = m.Load(kMachineWord32, base, m.Int32Constant(2 * sizeof(int32_t))); | 3255 Node* n2 = m.Load(kMachInt32, base, m.Int32Constant(2 * sizeof(int32_t))); |
3286 Node* n3 = m.Load(kMachineWord32, base, m.Int32Constant(3 * sizeof(int32_t))); | 3256 Node* n3 = m.Load(kMachInt32, base, m.Int32Constant(3 * sizeof(int32_t))); |
3287 Node* n4 = m.Load(kMachineWord32, base, m.Int32Constant(4 * sizeof(int32_t))); | 3257 Node* n4 = m.Load(kMachInt32, base, m.Int32Constant(4 * sizeof(int32_t))); |
3288 Node* n5 = m.Load(kMachineWord32, base, m.Int32Constant(5 * sizeof(int32_t))); | 3258 Node* n5 = m.Load(kMachInt32, base, m.Int32Constant(5 * sizeof(int32_t))); |
3289 Node* n6 = m.Load(kMachineWord32, base, m.Int32Constant(6 * sizeof(int32_t))); | 3259 Node* n6 = m.Load(kMachInt32, base, m.Int32Constant(6 * sizeof(int32_t))); |
3290 Node* n7 = m.Load(kMachineWord32, base, m.Int32Constant(7 * sizeof(int32_t))); | 3260 Node* n7 = m.Load(kMachInt32, base, m.Int32Constant(7 * sizeof(int32_t))); |
3291 | 3261 |
3292 Node* i1 = m.Int32Add(n0, n1); | 3262 Node* i1 = m.Int32Add(n0, n1); |
3293 Node* i2 = m.Int32Add(n2, n3); | 3263 Node* i2 = m.Int32Add(n2, n3); |
3294 Node* i3 = m.Int32Add(n4, n5); | 3264 Node* i3 = m.Int32Add(n4, n5); |
3295 Node* i4 = m.Int32Add(n6, n7); | 3265 Node* i4 = m.Int32Add(n6, n7); |
3296 | 3266 |
3297 Node* i5 = m.Int32Add(i1, i2); | 3267 Node* i5 = m.Int32Add(i1, i2); |
3298 Node* i6 = m.Int32Add(i3, i4); | 3268 Node* i6 = m.Int32Add(i3, i4); |
3299 | 3269 |
3300 Node* i7 = m.Int32Add(i5, i6); | 3270 Node* i7 = m.Int32Add(i5, i6); |
(...skipping 17 matching lines...) Expand all Loading... |
3318 void* function_address = | 3288 void* function_address = |
3319 reinterpret_cast<void*>(reinterpret_cast<intptr_t>(&Seven)); | 3289 reinterpret_cast<void*>(reinterpret_cast<intptr_t>(&Seven)); |
3320 | 3290 |
3321 RawMachineAssemblerTester<int32_t> m; | 3291 RawMachineAssemblerTester<int32_t> m; |
3322 Node** args = NULL; | 3292 Node** args = NULL; |
3323 MachineType* arg_types = NULL; | 3293 MachineType* arg_types = NULL; |
3324 Node* function = | 3294 Node* function = |
3325 call_direct ? m.PointerConstant(function_address) | 3295 call_direct ? m.PointerConstant(function_address) |
3326 : m.LoadFromPointer(&function_address, | 3296 : m.LoadFromPointer(&function_address, |
3327 MachineOperatorBuilder::pointer_rep()); | 3297 MachineOperatorBuilder::pointer_rep()); |
3328 m.Return(m.CallC(function, kMachineWord32, arg_types, args, 0)); | 3298 m.Return(m.CallC(function, kMachInt32, arg_types, args, 0)); |
3329 | 3299 |
3330 CHECK_EQ(7, m.Call()); | 3300 CHECK_EQ(7, m.Call()); |
3331 } | 3301 } |
3332 } | 3302 } |
3333 | 3303 |
3334 | 3304 |
3335 TEST(RunCallUnaryMinus) { | 3305 TEST(RunCallUnaryMinus) { |
3336 for (int i = 0; i < 2; i++) { | 3306 for (int i = 0; i < 2; i++) { |
3337 bool call_direct = i == 0; | 3307 bool call_direct = i == 0; |
3338 void* function_address = | 3308 void* function_address = |
3339 reinterpret_cast<void*>(reinterpret_cast<intptr_t>(&UnaryMinus)); | 3309 reinterpret_cast<void*>(reinterpret_cast<intptr_t>(&UnaryMinus)); |
3340 | 3310 |
3341 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 3311 RawMachineAssemblerTester<int32_t> m(kMachInt32); |
3342 Node* args[] = {m.Parameter(0)}; | 3312 Node* args[] = {m.Parameter(0)}; |
3343 MachineType arg_types[] = {kMachineWord32}; | 3313 MachineType arg_types[] = {kMachInt32}; |
3344 Node* function = | 3314 Node* function = |
3345 call_direct ? m.PointerConstant(function_address) | 3315 call_direct ? m.PointerConstant(function_address) |
3346 : m.LoadFromPointer(&function_address, | 3316 : m.LoadFromPointer(&function_address, |
3347 MachineOperatorBuilder::pointer_rep()); | 3317 MachineOperatorBuilder::pointer_rep()); |
3348 m.Return(m.CallC(function, kMachineWord32, arg_types, args, 1)); | 3318 m.Return(m.CallC(function, kMachInt32, arg_types, args, 1)); |
3349 | 3319 |
3350 FOR_INT32_INPUTS(i) { | 3320 FOR_INT32_INPUTS(i) { |
3351 int a = *i; | 3321 int a = *i; |
3352 CHECK_EQ(-a, m.Call(a)); | 3322 CHECK_EQ(-a, m.Call(a)); |
3353 } | 3323 } |
3354 } | 3324 } |
3355 } | 3325 } |
3356 | 3326 |
3357 | 3327 |
3358 TEST(RunCallAPlusTwoB) { | 3328 TEST(RunCallAPlusTwoB) { |
3359 for (int i = 0; i < 2; i++) { | 3329 for (int i = 0; i < 2; i++) { |
3360 bool call_direct = i == 0; | 3330 bool call_direct = i == 0; |
3361 void* function_address = | 3331 void* function_address = |
3362 reinterpret_cast<void*>(reinterpret_cast<intptr_t>(&APlusTwoB)); | 3332 reinterpret_cast<void*>(reinterpret_cast<intptr_t>(&APlusTwoB)); |
3363 | 3333 |
3364 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32); | 3334 RawMachineAssemblerTester<int32_t> m(kMachInt32, kMachInt32); |
3365 Node* args[] = {m.Parameter(0), m.Parameter(1)}; | 3335 Node* args[] = {m.Parameter(0), m.Parameter(1)}; |
3366 MachineType arg_types[] = {kMachineWord32, kMachineWord32}; | 3336 MachineType arg_types[] = {kMachInt32, kMachInt32}; |
3367 Node* function = | 3337 Node* function = |
3368 call_direct ? m.PointerConstant(function_address) | 3338 call_direct ? m.PointerConstant(function_address) |
3369 : m.LoadFromPointer(&function_address, | 3339 : m.LoadFromPointer(&function_address, |
3370 MachineOperatorBuilder::pointer_rep()); | 3340 MachineOperatorBuilder::pointer_rep()); |
3371 m.Return(m.CallC(function, kMachineWord32, arg_types, args, 2)); | 3341 m.Return(m.CallC(function, kMachInt32, arg_types, args, 2)); |
3372 | 3342 |
3373 FOR_INT32_INPUTS(i) { | 3343 FOR_INT32_INPUTS(i) { |
3374 FOR_INT32_INPUTS(j) { | 3344 FOR_INT32_INPUTS(j) { |
3375 int a = *i; | 3345 int a = *i; |
3376 int b = *j; | 3346 int b = *j; |
3377 int result = m.Call(a, b); | 3347 int result = m.Call(a, b); |
3378 CHECK_EQ(a + 2 * b, result); | 3348 CHECK_EQ(a + 2 * b, result); |
3379 } | 3349 } |
3380 } | 3350 } |
3381 } | 3351 } |
3382 } | 3352 } |
3383 | 3353 |
3384 #endif // MACHINE_ASSEMBLER_SUPPORTS_CALL_C | 3354 #endif // MACHINE_ASSEMBLER_SUPPORTS_CALL_C |
3385 | 3355 |
3386 | 3356 |
3387 static const int kFloat64CompareHelperTestCases = 15; | 3357 static const int kFloat64CompareHelperTestCases = 15; |
3388 static const int kFloat64CompareHelperNodeType = 4; | 3358 static const int kFloat64CompareHelperNodeType = 4; |
3389 | 3359 |
3390 static int Float64CompareHelper(RawMachineAssemblerTester<int32_t>* m, | 3360 static int Float64CompareHelper(RawMachineAssemblerTester<int32_t>* m, |
3391 int test_case, int node_type, double x, | 3361 int test_case, int node_type, double x, |
3392 double y) { | 3362 double y) { |
3393 static double buffer[2]; | 3363 static double buffer[2]; |
3394 buffer[0] = x; | 3364 buffer[0] = x; |
3395 buffer[1] = y; | 3365 buffer[1] = y; |
3396 CHECK(0 <= test_case && test_case < kFloat64CompareHelperTestCases); | 3366 CHECK(0 <= test_case && test_case < kFloat64CompareHelperTestCases); |
3397 CHECK(0 <= node_type && node_type < kFloat64CompareHelperNodeType); | 3367 CHECK(0 <= node_type && node_type < kFloat64CompareHelperNodeType); |
3398 CHECK(x < y); | 3368 CHECK(x < y); |
3399 bool load_a = node_type / 2 == 1; | 3369 bool load_a = node_type / 2 == 1; |
3400 bool load_b = node_type % 2 == 1; | 3370 bool load_b = node_type % 2 == 1; |
3401 Node* a = load_a ? m->Load(kMachineFloat64, m->PointerConstant(&buffer[0])) | 3371 Node* a = load_a ? m->Load(kMachFloat64, m->PointerConstant(&buffer[0])) |
3402 : m->Float64Constant(x); | 3372 : m->Float64Constant(x); |
3403 Node* b = load_b ? m->Load(kMachineFloat64, m->PointerConstant(&buffer[1])) | 3373 Node* b = load_b ? m->Load(kMachFloat64, m->PointerConstant(&buffer[1])) |
3404 : m->Float64Constant(y); | 3374 : m->Float64Constant(y); |
3405 Node* cmp = NULL; | 3375 Node* cmp = NULL; |
3406 bool expected = false; | 3376 bool expected = false; |
3407 switch (test_case) { | 3377 switch (test_case) { |
3408 // Equal tests. | 3378 // Equal tests. |
3409 case 0: | 3379 case 0: |
3410 cmp = m->Float64Equal(a, b); | 3380 cmp = m->Float64Equal(a, b); |
3411 expected = false; | 3381 expected = false; |
3412 break; | 3382 break; |
3413 case 1: | 3383 case 1: |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3521 } | 3491 } |
3522 } | 3492 } |
3523 } | 3493 } |
3524 | 3494 |
3525 | 3495 |
3526 TEST(RunFloat64Equal) { | 3496 TEST(RunFloat64Equal) { |
3527 double input_a = 0.0; | 3497 double input_a = 0.0; |
3528 double input_b = 0.0; | 3498 double input_b = 0.0; |
3529 | 3499 |
3530 RawMachineAssemblerTester<int32_t> m; | 3500 RawMachineAssemblerTester<int32_t> m; |
3531 Node* a = m.LoadFromPointer(&input_a, kMachineFloat64); | 3501 Node* a = m.LoadFromPointer(&input_a, kMachFloat64); |
3532 Node* b = m.LoadFromPointer(&input_b, kMachineFloat64); | 3502 Node* b = m.LoadFromPointer(&input_b, kMachFloat64); |
3533 m.Return(m.Float64Equal(a, b)); | 3503 m.Return(m.Float64Equal(a, b)); |
3534 | 3504 |
3535 CompareWrapper cmp(IrOpcode::kFloat64Equal); | 3505 CompareWrapper cmp(IrOpcode::kFloat64Equal); |
3536 FOR_FLOAT64_INPUTS(pl) { | 3506 FOR_FLOAT64_INPUTS(pl) { |
3537 FOR_FLOAT64_INPUTS(pr) { | 3507 FOR_FLOAT64_INPUTS(pr) { |
3538 input_a = *pl; | 3508 input_a = *pl; |
3539 input_b = *pr; | 3509 input_b = *pr; |
3540 int32_t expected = cmp.Float64Compare(input_a, input_b) ? 1 : 0; | 3510 int32_t expected = cmp.Float64Compare(input_a, input_b) ? 1 : 0; |
3541 CHECK_EQ(expected, m.Call()); | 3511 CHECK_EQ(expected, m.Call()); |
3542 } | 3512 } |
3543 } | 3513 } |
3544 } | 3514 } |
3545 | 3515 |
3546 | 3516 |
3547 TEST(RunFloat64LessThan) { | 3517 TEST(RunFloat64LessThan) { |
3548 double input_a = 0.0; | 3518 double input_a = 0.0; |
3549 double input_b = 0.0; | 3519 double input_b = 0.0; |
3550 | 3520 |
3551 RawMachineAssemblerTester<int32_t> m; | 3521 RawMachineAssemblerTester<int32_t> m; |
3552 Node* a = m.LoadFromPointer(&input_a, kMachineFloat64); | 3522 Node* a = m.LoadFromPointer(&input_a, kMachFloat64); |
3553 Node* b = m.LoadFromPointer(&input_b, kMachineFloat64); | 3523 Node* b = m.LoadFromPointer(&input_b, kMachFloat64); |
3554 m.Return(m.Float64LessThan(a, b)); | 3524 m.Return(m.Float64LessThan(a, b)); |
3555 | 3525 |
3556 CompareWrapper cmp(IrOpcode::kFloat64LessThan); | 3526 CompareWrapper cmp(IrOpcode::kFloat64LessThan); |
3557 FOR_FLOAT64_INPUTS(pl) { | 3527 FOR_FLOAT64_INPUTS(pl) { |
3558 FOR_FLOAT64_INPUTS(pr) { | 3528 FOR_FLOAT64_INPUTS(pr) { |
3559 input_a = *pl; | 3529 input_a = *pl; |
3560 input_b = *pr; | 3530 input_b = *pr; |
3561 int32_t expected = cmp.Float64Compare(input_a, input_b) ? 1 : 0; | 3531 int32_t expected = cmp.Float64Compare(input_a, input_b) ? 1 : 0; |
3562 CHECK_EQ(expected, m.Call()); | 3532 CHECK_EQ(expected, m.Call()); |
3563 } | 3533 } |
(...skipping 28 matching lines...) Expand all Loading... |
3592 for (int i = -127; i < 127; i++) { | 3562 for (int i = -127; i < 127; i++) { |
3593 input = i; | 3563 input = i; |
3594 int expected = i >= 0 ? i + 1 : max + (i - min) + 2; | 3564 int expected = i >= 0 ? i + 1 : max + (i - min) + 2; |
3595 CHECK_EQ(expected, m.Call()); | 3565 CHECK_EQ(expected, m.Call()); |
3596 CHECK_EQ(i + 1, input); | 3566 CHECK_EQ(i + 1, input); |
3597 } | 3567 } |
3598 } | 3568 } |
3599 | 3569 |
3600 | 3570 |
3601 TEST(RunLoadStoreTruncation) { | 3571 TEST(RunLoadStoreTruncation) { |
3602 LoadStoreTruncation<int8_t, kMachineWord8>(); | 3572 LoadStoreTruncation<int8_t, kMachInt8>(); |
3603 LoadStoreTruncation<int16_t, kMachineWord16>(); | 3573 LoadStoreTruncation<int16_t, kMachInt16>(); |
3604 } | 3574 } |
3605 | 3575 |
3606 | 3576 |
3607 static void IntPtrCompare(intptr_t left, intptr_t right) { | 3577 static void IntPtrCompare(intptr_t left, intptr_t right) { |
3608 for (int test = 0; test < 7; test++) { | 3578 for (int test = 0; test < 7; test++) { |
3609 RawMachineAssemblerTester<bool> m(MachineOperatorBuilder::pointer_rep(), | 3579 RawMachineAssemblerTester<bool> m(MachineOperatorBuilder::pointer_rep(), |
3610 MachineOperatorBuilder::pointer_rep()); | 3580 MachineOperatorBuilder::pointer_rep()); |
3611 Node* p0 = m.Parameter(0); | 3581 Node* p0 = m.Parameter(0); |
3612 Node* p1 = m.Parameter(1); | 3582 Node* p1 = m.Parameter(1); |
3613 Node* res = NULL; | 3583 Node* res = NULL; |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3669 int32_t outputs[kInputSize]; | 3639 int32_t outputs[kInputSize]; |
3670 for (int i = 0; i < kInputSize; i++) { | 3640 for (int i = 0; i < kInputSize; i++) { |
3671 inputs[i] = i; | 3641 inputs[i] = i; |
3672 outputs[i] = -1; | 3642 outputs[i] = -1; |
3673 } | 3643 } |
3674 RawMachineAssemblerTester<int32_t*> m; | 3644 RawMachineAssemblerTester<int32_t*> m; |
3675 Node* input = m.PointerConstant(&inputs[0]); | 3645 Node* input = m.PointerConstant(&inputs[0]); |
3676 Node* output = m.PointerConstant(&outputs[kInputSize - 1]); | 3646 Node* output = m.PointerConstant(&outputs[kInputSize - 1]); |
3677 Node* elem_size = m.ConvertInt32ToIntPtr(m.Int32Constant(sizeof(inputs[0]))); | 3647 Node* elem_size = m.ConvertInt32ToIntPtr(m.Int32Constant(sizeof(inputs[0]))); |
3678 for (int i = 0; i < kInputSize; i++) { | 3648 for (int i = 0; i < kInputSize; i++) { |
3679 m.Store(kMachineWord32, output, m.Load(kMachineWord32, input)); | 3649 m.Store(kMachInt32, output, m.Load(kMachInt32, input)); |
3680 input = m.IntPtrAdd(input, elem_size); | 3650 input = m.IntPtrAdd(input, elem_size); |
3681 output = m.IntPtrSub(output, elem_size); | 3651 output = m.IntPtrSub(output, elem_size); |
3682 } | 3652 } |
3683 m.Return(input); | 3653 m.Return(input); |
3684 CHECK_EQ(&inputs[kInputSize], m.Call()); | 3654 CHECK_EQ(&inputs[kInputSize], m.Call()); |
3685 for (int i = 0; i < kInputSize; i++) { | 3655 for (int i = 0; i < kInputSize; i++) { |
3686 CHECK_EQ(i, inputs[i]); | 3656 CHECK_EQ(i, inputs[i]); |
3687 CHECK_EQ(kInputSize - i - 1, outputs[i]); | 3657 CHECK_EQ(kInputSize - i - 1, outputs[i]); |
3688 } | 3658 } |
3689 } | 3659 } |
(...skipping 20 matching lines...) Expand all Loading... |
3710 m.Word32Shl(bt.param0, m.Int32Sub(m.Int32Constant(32), bt.param1)), | 3680 m.Word32Shl(bt.param0, m.Int32Sub(m.Int32Constant(32), bt.param1)), |
3711 m.Word32Shr(bt.param0, bt.param1))); | 3681 m.Word32Shr(bt.param0, bt.param1))); |
3712 bt.Run(ValueHelper::uint32_vector(), ValueHelper::ror_vector(), rotr32); | 3682 bt.Run(ValueHelper::uint32_vector(), ValueHelper::ror_vector(), rotr32); |
3713 } | 3683 } |
3714 } | 3684 } |
3715 | 3685 |
3716 | 3686 |
3717 TEST(RunTestInt32RotateRightImm) { | 3687 TEST(RunTestInt32RotateRightImm) { |
3718 FOR_INPUTS(uint32_t, ror, i) { | 3688 FOR_INPUTS(uint32_t, ror, i) { |
3719 { | 3689 { |
3720 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 3690 RawMachineAssemblerTester<int32_t> m(kMachUint32); |
3721 Node* value = m.Parameter(0); | 3691 Node* value = m.Parameter(0); |
3722 m.Return(m.Word32Or(m.Word32Shr(value, m.Int32Constant(*i)), | 3692 m.Return(m.Word32Or(m.Word32Shr(value, m.Int32Constant(*i)), |
3723 m.Word32Shl(value, m.Int32Constant(32 - *i)))); | 3693 m.Word32Shl(value, m.Int32Constant(32 - *i)))); |
3724 m.Run(ValueHelper::uint32_vector(), | 3694 m.Run(ValueHelper::uint32_vector(), |
3725 std::bind2nd(std::ptr_fun(&rotr32), *i)); | 3695 std::bind2nd(std::ptr_fun(&rotr32), *i)); |
3726 } | 3696 } |
3727 { | 3697 { |
3728 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 3698 RawMachineAssemblerTester<int32_t> m(kMachUint32); |
3729 Node* value = m.Parameter(0); | 3699 Node* value = m.Parameter(0); |
3730 m.Return(m.Word32Or(m.Word32Shl(value, m.Int32Constant(32 - *i)), | 3700 m.Return(m.Word32Or(m.Word32Shl(value, m.Int32Constant(32 - *i)), |
3731 m.Word32Shr(value, m.Int32Constant(*i)))); | 3701 m.Word32Shr(value, m.Int32Constant(*i)))); |
3732 m.Run(ValueHelper::uint32_vector(), | 3702 m.Run(ValueHelper::uint32_vector(), |
3733 std::bind2nd(std::ptr_fun(&rotr32), *i)); | 3703 std::bind2nd(std::ptr_fun(&rotr32), *i)); |
3734 } | 3704 } |
3735 } | 3705 } |
3736 } | 3706 } |
3737 | 3707 |
3738 | 3708 |
3739 TEST(RunSpillLotsOfThings) { | 3709 TEST(RunSpillLotsOfThings) { |
3740 static const int kInputSize = 1000; | 3710 static const int kInputSize = 1000; |
3741 RawMachineAssemblerTester<void> m; | 3711 RawMachineAssemblerTester<void> m; |
3742 Node* accs[kInputSize]; | 3712 Node* accs[kInputSize]; |
3743 int32_t outputs[kInputSize]; | 3713 int32_t outputs[kInputSize]; |
3744 Node* one = m.Int32Constant(1); | 3714 Node* one = m.Int32Constant(1); |
3745 Node* acc = one; | 3715 Node* acc = one; |
3746 for (int i = 0; i < kInputSize; i++) { | 3716 for (int i = 0; i < kInputSize; i++) { |
3747 acc = m.Int32Add(acc, one); | 3717 acc = m.Int32Add(acc, one); |
3748 accs[i] = acc; | 3718 accs[i] = acc; |
3749 } | 3719 } |
3750 for (int i = 0; i < kInputSize; i++) { | 3720 for (int i = 0; i < kInputSize; i++) { |
3751 m.StoreToPointer(&outputs[i], kMachineWord32, accs[i]); | 3721 m.StoreToPointer(&outputs[i], kMachInt32, accs[i]); |
3752 } | 3722 } |
3753 m.Return(one); | 3723 m.Return(one); |
3754 m.Call(); | 3724 m.Call(); |
3755 for (int i = 0; i < kInputSize; i++) { | 3725 for (int i = 0; i < kInputSize; i++) { |
3756 CHECK_EQ(outputs[i], i + 2); | 3726 CHECK_EQ(outputs[i], i + 2); |
3757 } | 3727 } |
3758 } | 3728 } |
3759 | 3729 |
3760 | 3730 |
3761 TEST(RunSpillConstantsAndParameters) { | 3731 TEST(RunSpillConstantsAndParameters) { |
3762 static const int kInputSize = 1000; | 3732 static const int kInputSize = 1000; |
3763 static const int32_t kBase = 987; | 3733 static const int32_t kBase = 987; |
3764 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32); | 3734 RawMachineAssemblerTester<int32_t> m(kMachInt32, kMachInt32); |
3765 int32_t outputs[kInputSize]; | 3735 int32_t outputs[kInputSize]; |
3766 Node* csts[kInputSize]; | 3736 Node* csts[kInputSize]; |
3767 Node* accs[kInputSize]; | 3737 Node* accs[kInputSize]; |
3768 Node* acc = m.Int32Constant(0); | 3738 Node* acc = m.Int32Constant(0); |
3769 for (int i = 0; i < kInputSize; i++) { | 3739 for (int i = 0; i < kInputSize; i++) { |
3770 csts[i] = m.Int32Constant(static_cast<int32_t>(kBase + i)); | 3740 csts[i] = m.Int32Constant(static_cast<int32_t>(kBase + i)); |
3771 } | 3741 } |
3772 for (int i = 0; i < kInputSize; i++) { | 3742 for (int i = 0; i < kInputSize; i++) { |
3773 acc = m.Int32Add(acc, csts[i]); | 3743 acc = m.Int32Add(acc, csts[i]); |
3774 accs[i] = acc; | 3744 accs[i] = acc; |
3775 } | 3745 } |
3776 for (int i = 0; i < kInputSize; i++) { | 3746 for (int i = 0; i < kInputSize; i++) { |
3777 m.StoreToPointer(&outputs[i], kMachineWord32, accs[i]); | 3747 m.StoreToPointer(&outputs[i], kMachInt32, accs[i]); |
3778 } | 3748 } |
3779 m.Return(m.Int32Add(acc, m.Int32Add(m.Parameter(0), m.Parameter(1)))); | 3749 m.Return(m.Int32Add(acc, m.Int32Add(m.Parameter(0), m.Parameter(1)))); |
3780 FOR_INT32_INPUTS(i) { | 3750 FOR_INT32_INPUTS(i) { |
3781 FOR_INT32_INPUTS(j) { | 3751 FOR_INT32_INPUTS(j) { |
3782 int32_t expected = *i + *j; | 3752 int32_t expected = *i + *j; |
3783 for (int k = 0; k < kInputSize; k++) { | 3753 for (int k = 0; k < kInputSize; k++) { |
3784 expected += kBase + k; | 3754 expected += kBase + k; |
3785 } | 3755 } |
3786 CHECK_EQ(expected, m.Call(*i, *j)); | 3756 CHECK_EQ(expected, m.Call(*i, *j)); |
3787 expected = 0; | 3757 expected = 0; |
3788 for (int k = 0; k < kInputSize; k++) { | 3758 for (int k = 0; k < kInputSize; k++) { |
3789 expected += kBase + k; | 3759 expected += kBase + k; |
3790 CHECK_EQ(expected, outputs[k]); | 3760 CHECK_EQ(expected, outputs[k]); |
3791 } | 3761 } |
3792 } | 3762 } |
3793 } | 3763 } |
3794 } | 3764 } |
3795 | 3765 |
3796 | 3766 |
3797 TEST(RunNewSpaceConstantsInPhi) { | 3767 TEST(RunNewSpaceConstantsInPhi) { |
3798 RawMachineAssemblerTester<Object*> m(kMachineWord32); | 3768 RawMachineAssemblerTester<Object*> m(kMachInt32); |
3799 | 3769 |
3800 Isolate* isolate = CcTest::i_isolate(); | 3770 Isolate* isolate = CcTest::i_isolate(); |
3801 Handle<HeapNumber> true_val = isolate->factory()->NewHeapNumber(11.2); | 3771 Handle<HeapNumber> true_val = isolate->factory()->NewHeapNumber(11.2); |
3802 Handle<HeapNumber> false_val = isolate->factory()->NewHeapNumber(11.3); | 3772 Handle<HeapNumber> false_val = isolate->factory()->NewHeapNumber(11.3); |
3803 Node* true_node = m.HeapConstant(true_val); | 3773 Node* true_node = m.HeapConstant(true_val); |
3804 Node* false_node = m.HeapConstant(false_val); | 3774 Node* false_node = m.HeapConstant(false_val); |
3805 | 3775 |
3806 MLabel blocka, blockb, end; | 3776 MLabel blocka, blockb, end; |
3807 m.Branch(m.Parameter(0), &blocka, &blockb); | 3777 m.Branch(m.Parameter(0), &blocka, &blockb); |
3808 m.Bind(&blocka); | 3778 m.Bind(&blocka); |
(...skipping 21 matching lines...) Expand all Loading... |
3830 Node* acc = one; | 3800 Node* acc = one; |
3831 for (int i = 0; i < kInputSize; i++) { | 3801 for (int i = 0; i < kInputSize; i++) { |
3832 acc = m.Int32Add(acc, one); | 3802 acc = m.Int32Add(acc, one); |
3833 accs[i] = acc; | 3803 accs[i] = acc; |
3834 } | 3804 } |
3835 // If the spill slot computation is wrong, it might load from the c frame | 3805 // If the spill slot computation is wrong, it might load from the c frame |
3836 { | 3806 { |
3837 void* func = reinterpret_cast<void*>(reinterpret_cast<intptr_t>(&Seven)); | 3807 void* func = reinterpret_cast<void*>(reinterpret_cast<intptr_t>(&Seven)); |
3838 Node** args = NULL; | 3808 Node** args = NULL; |
3839 MachineType* arg_types = NULL; | 3809 MachineType* arg_types = NULL; |
3840 m.CallC(m.PointerConstant(func), kMachineWord32, arg_types, args, 0); | 3810 m.CallC(m.PointerConstant(func), kMachInt32, arg_types, args, 0); |
3841 } | 3811 } |
3842 for (int i = 0; i < kInputSize; i++) { | 3812 for (int i = 0; i < kInputSize; i++) { |
3843 m.StoreToPointer(&outputs[i], kMachineWord32, accs[i]); | 3813 m.StoreToPointer(&outputs[i], kMachInt32, accs[i]); |
3844 } | 3814 } |
3845 m.Return(one); | 3815 m.Return(one); |
3846 m.Call(); | 3816 m.Call(); |
3847 for (int i = 0; i < kInputSize; i++) { | 3817 for (int i = 0; i < kInputSize; i++) { |
3848 CHECK_EQ(outputs[i], i + 2); | 3818 CHECK_EQ(outputs[i], i + 2); |
3849 } | 3819 } |
3850 } | 3820 } |
3851 | 3821 |
3852 #endif // MACHINE_ASSEMBLER_SUPPORTS_CALL_C | 3822 #endif // MACHINE_ASSEMBLER_SUPPORTS_CALL_C |
3853 | 3823 |
(...skipping 14 matching lines...) Expand all Loading... |
3868 } | 3838 } |
3869 | 3839 |
3870 | 3840 |
3871 TEST(RunInt32AddWithOverflowP) { | 3841 TEST(RunInt32AddWithOverflowP) { |
3872 int32_t actual_val = -1; | 3842 int32_t actual_val = -1; |
3873 RawMachineAssemblerTester<int32_t> m; | 3843 RawMachineAssemblerTester<int32_t> m; |
3874 Int32BinopTester bt(&m); | 3844 Int32BinopTester bt(&m); |
3875 Node* add = m.Int32AddWithOverflow(bt.param0, bt.param1); | 3845 Node* add = m.Int32AddWithOverflow(bt.param0, bt.param1); |
3876 Node* val = m.Projection(0, add); | 3846 Node* val = m.Projection(0, add); |
3877 Node* ovf = m.Projection(1, add); | 3847 Node* ovf = m.Projection(1, add); |
3878 m.StoreToPointer(&actual_val, kMachineWord32, val); | 3848 m.StoreToPointer(&actual_val, kMachInt32, val); |
3879 bt.AddReturn(ovf); | 3849 bt.AddReturn(ovf); |
3880 FOR_INT32_INPUTS(i) { | 3850 FOR_INT32_INPUTS(i) { |
3881 FOR_INT32_INPUTS(j) { | 3851 FOR_INT32_INPUTS(j) { |
3882 int32_t expected_val; | 3852 int32_t expected_val; |
3883 int expected_ovf = sadd_overflow(*i, *j, &expected_val); | 3853 int expected_ovf = sadd_overflow(*i, *j, &expected_val); |
3884 CHECK_EQ(expected_ovf, bt.call(*i, *j)); | 3854 CHECK_EQ(expected_ovf, bt.call(*i, *j)); |
3885 CHECK_EQ(expected_val, actual_val); | 3855 CHECK_EQ(expected_val, actual_val); |
3886 } | 3856 } |
3887 } | 3857 } |
3888 } | 3858 } |
3889 | 3859 |
3890 | 3860 |
3891 TEST(RunInt32AddWithOverflowImm) { | 3861 TEST(RunInt32AddWithOverflowImm) { |
3892 int32_t actual_val = -1, expected_val = 0; | 3862 int32_t actual_val = -1, expected_val = 0; |
3893 FOR_INT32_INPUTS(i) { | 3863 FOR_INT32_INPUTS(i) { |
3894 { | 3864 { |
3895 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 3865 RawMachineAssemblerTester<int32_t> m(kMachInt32); |
3896 Node* add = m.Int32AddWithOverflow(m.Int32Constant(*i), m.Parameter(0)); | 3866 Node* add = m.Int32AddWithOverflow(m.Int32Constant(*i), m.Parameter(0)); |
3897 Node* val = m.Projection(0, add); | 3867 Node* val = m.Projection(0, add); |
3898 Node* ovf = m.Projection(1, add); | 3868 Node* ovf = m.Projection(1, add); |
3899 m.StoreToPointer(&actual_val, kMachineWord32, val); | 3869 m.StoreToPointer(&actual_val, kMachInt32, val); |
3900 m.Return(ovf); | 3870 m.Return(ovf); |
3901 FOR_INT32_INPUTS(j) { | 3871 FOR_INT32_INPUTS(j) { |
3902 int expected_ovf = sadd_overflow(*i, *j, &expected_val); | 3872 int expected_ovf = sadd_overflow(*i, *j, &expected_val); |
3903 CHECK_EQ(expected_ovf, m.Call(*j)); | 3873 CHECK_EQ(expected_ovf, m.Call(*j)); |
3904 CHECK_EQ(expected_val, actual_val); | 3874 CHECK_EQ(expected_val, actual_val); |
3905 } | 3875 } |
3906 } | 3876 } |
3907 { | 3877 { |
3908 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 3878 RawMachineAssemblerTester<int32_t> m(kMachInt32); |
3909 Node* add = m.Int32AddWithOverflow(m.Parameter(0), m.Int32Constant(*i)); | 3879 Node* add = m.Int32AddWithOverflow(m.Parameter(0), m.Int32Constant(*i)); |
3910 Node* val = m.Projection(0, add); | 3880 Node* val = m.Projection(0, add); |
3911 Node* ovf = m.Projection(1, add); | 3881 Node* ovf = m.Projection(1, add); |
3912 m.StoreToPointer(&actual_val, kMachineWord32, val); | 3882 m.StoreToPointer(&actual_val, kMachInt32, val); |
3913 m.Return(ovf); | 3883 m.Return(ovf); |
3914 FOR_INT32_INPUTS(j) { | 3884 FOR_INT32_INPUTS(j) { |
3915 int expected_ovf = sadd_overflow(*i, *j, &expected_val); | 3885 int expected_ovf = sadd_overflow(*i, *j, &expected_val); |
3916 CHECK_EQ(expected_ovf, m.Call(*j)); | 3886 CHECK_EQ(expected_ovf, m.Call(*j)); |
3917 CHECK_EQ(expected_val, actual_val); | 3887 CHECK_EQ(expected_val, actual_val); |
3918 } | 3888 } |
3919 } | 3889 } |
3920 FOR_INT32_INPUTS(j) { | 3890 FOR_INT32_INPUTS(j) { |
3921 RawMachineAssemblerTester<int32_t> m; | 3891 RawMachineAssemblerTester<int32_t> m; |
3922 Node* add = | 3892 Node* add = |
3923 m.Int32AddWithOverflow(m.Int32Constant(*i), m.Int32Constant(*j)); | 3893 m.Int32AddWithOverflow(m.Int32Constant(*i), m.Int32Constant(*j)); |
3924 Node* val = m.Projection(0, add); | 3894 Node* val = m.Projection(0, add); |
3925 Node* ovf = m.Projection(1, add); | 3895 Node* ovf = m.Projection(1, add); |
3926 m.StoreToPointer(&actual_val, kMachineWord32, val); | 3896 m.StoreToPointer(&actual_val, kMachInt32, val); |
3927 m.Return(ovf); | 3897 m.Return(ovf); |
3928 int expected_ovf = sadd_overflow(*i, *j, &expected_val); | 3898 int expected_ovf = sadd_overflow(*i, *j, &expected_val); |
3929 CHECK_EQ(expected_ovf, m.Call()); | 3899 CHECK_EQ(expected_ovf, m.Call()); |
3930 CHECK_EQ(expected_val, actual_val); | 3900 CHECK_EQ(expected_val, actual_val); |
3931 } | 3901 } |
3932 } | 3902 } |
3933 } | 3903 } |
3934 | 3904 |
3935 | 3905 |
3936 TEST(RunInt32AddWithOverflowInBranchP) { | 3906 TEST(RunInt32AddWithOverflowInBranchP) { |
3937 int constant = 911777; | 3907 int constant = 911777; |
3938 MLabel blocka, blockb; | 3908 MLabel blocka, blockb; |
3939 RawMachineAssemblerTester<int32_t> m; | 3909 RawMachineAssemblerTester<int32_t> m; |
3940 Int32BinopTester bt(&m); | 3910 Int32BinopTester bt(&m); |
3941 Node* add = m.Int32AddWithOverflow(bt.param0, bt.param1); | 3911 Node* add = m.Int32AddWithOverflow(bt.param0, bt.param1); |
3942 Node* ovf = m.Projection(1, add); | 3912 Node* ovf = m.Projection(1, add); |
3943 m.Branch(ovf, &blocka, &blockb); | 3913 m.Branch(ovf, &blocka, &blockb); |
3944 m.Bind(&blocka); | 3914 m.Bind(&blocka); |
3945 bt.AddReturn(m.Int32Constant(constant)); | 3915 bt.AddReturn(m.Int32Constant(constant)); |
3946 m.Bind(&blockb); | 3916 m.Bind(&blockb); |
3947 Node* val = m.Projection(0, add); | 3917 Node* val = m.Projection(0, add); |
3948 bt.AddReturn(val); | 3918 bt.AddReturn(val); |
3949 FOR_UINT32_INPUTS(i) { | 3919 FOR_INT32_INPUTS(i) { |
3950 FOR_UINT32_INPUTS(j) { | 3920 FOR_INT32_INPUTS(j) { |
3951 int32_t expected; | 3921 int32_t expected; |
3952 if (sadd_overflow(*i, *j, &expected)) expected = constant; | 3922 if (sadd_overflow(*i, *j, &expected)) expected = constant; |
3953 CHECK_EQ(expected, bt.call(*i, *j)); | 3923 CHECK_EQ(expected, bt.call(*i, *j)); |
3954 } | 3924 } |
3955 } | 3925 } |
3956 } | 3926 } |
3957 | 3927 |
3958 | 3928 |
3959 TEST(RunInt32SubWithOverflowP) { | 3929 TEST(RunInt32SubWithOverflowP) { |
3960 int32_t actual_val = -1; | 3930 int32_t actual_val = -1; |
3961 RawMachineAssemblerTester<int32_t> m; | 3931 RawMachineAssemblerTester<int32_t> m; |
3962 Int32BinopTester bt(&m); | 3932 Int32BinopTester bt(&m); |
3963 Node* add = m.Int32SubWithOverflow(bt.param0, bt.param1); | 3933 Node* add = m.Int32SubWithOverflow(bt.param0, bt.param1); |
3964 Node* val = m.Projection(0, add); | 3934 Node* val = m.Projection(0, add); |
3965 Node* ovf = m.Projection(1, add); | 3935 Node* ovf = m.Projection(1, add); |
3966 m.StoreToPointer(&actual_val, kMachineWord32, val); | 3936 m.StoreToPointer(&actual_val, kMachInt32, val); |
3967 bt.AddReturn(ovf); | 3937 bt.AddReturn(ovf); |
3968 FOR_INT32_INPUTS(i) { | 3938 FOR_INT32_INPUTS(i) { |
3969 FOR_INT32_INPUTS(j) { | 3939 FOR_INT32_INPUTS(j) { |
3970 int32_t expected_val; | 3940 int32_t expected_val; |
3971 int expected_ovf = ssub_overflow(*i, *j, &expected_val); | 3941 int expected_ovf = ssub_overflow(*i, *j, &expected_val); |
3972 CHECK_EQ(expected_ovf, bt.call(*i, *j)); | 3942 CHECK_EQ(expected_ovf, bt.call(*i, *j)); |
3973 CHECK_EQ(expected_val, actual_val); | 3943 CHECK_EQ(expected_val, actual_val); |
3974 } | 3944 } |
3975 } | 3945 } |
3976 } | 3946 } |
3977 | 3947 |
3978 | 3948 |
3979 TEST(RunInt32SubWithOverflowImm) { | 3949 TEST(RunInt32SubWithOverflowImm) { |
3980 int32_t actual_val = -1, expected_val = 0; | 3950 int32_t actual_val = -1, expected_val = 0; |
3981 FOR_INT32_INPUTS(i) { | 3951 FOR_INT32_INPUTS(i) { |
3982 { | 3952 { |
3983 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 3953 RawMachineAssemblerTester<int32_t> m(kMachInt32); |
3984 Node* add = m.Int32SubWithOverflow(m.Int32Constant(*i), m.Parameter(0)); | 3954 Node* add = m.Int32SubWithOverflow(m.Int32Constant(*i), m.Parameter(0)); |
3985 Node* val = m.Projection(0, add); | 3955 Node* val = m.Projection(0, add); |
3986 Node* ovf = m.Projection(1, add); | 3956 Node* ovf = m.Projection(1, add); |
3987 m.StoreToPointer(&actual_val, kMachineWord32, val); | 3957 m.StoreToPointer(&actual_val, kMachInt32, val); |
3988 m.Return(ovf); | 3958 m.Return(ovf); |
3989 FOR_INT32_INPUTS(j) { | 3959 FOR_INT32_INPUTS(j) { |
3990 int expected_ovf = ssub_overflow(*i, *j, &expected_val); | 3960 int expected_ovf = ssub_overflow(*i, *j, &expected_val); |
3991 CHECK_EQ(expected_ovf, m.Call(*j)); | 3961 CHECK_EQ(expected_ovf, m.Call(*j)); |
3992 CHECK_EQ(expected_val, actual_val); | 3962 CHECK_EQ(expected_val, actual_val); |
3993 } | 3963 } |
3994 } | 3964 } |
3995 { | 3965 { |
3996 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | 3966 RawMachineAssemblerTester<int32_t> m(kMachInt32); |
3997 Node* add = m.Int32SubWithOverflow(m.Parameter(0), m.Int32Constant(*i)); | 3967 Node* add = m.Int32SubWithOverflow(m.Parameter(0), m.Int32Constant(*i)); |
3998 Node* val = m.Projection(0, add); | 3968 Node* val = m.Projection(0, add); |
3999 Node* ovf = m.Projection(1, add); | 3969 Node* ovf = m.Projection(1, add); |
4000 m.StoreToPointer(&actual_val, kMachineWord32, val); | 3970 m.StoreToPointer(&actual_val, kMachInt32, val); |
4001 m.Return(ovf); | 3971 m.Return(ovf); |
4002 FOR_INT32_INPUTS(j) { | 3972 FOR_INT32_INPUTS(j) { |
4003 int expected_ovf = ssub_overflow(*j, *i, &expected_val); | 3973 int expected_ovf = ssub_overflow(*j, *i, &expected_val); |
4004 CHECK_EQ(expected_ovf, m.Call(*j)); | 3974 CHECK_EQ(expected_ovf, m.Call(*j)); |
4005 CHECK_EQ(expected_val, actual_val); | 3975 CHECK_EQ(expected_val, actual_val); |
4006 } | 3976 } |
4007 } | 3977 } |
4008 FOR_INT32_INPUTS(j) { | 3978 FOR_INT32_INPUTS(j) { |
4009 RawMachineAssemblerTester<int32_t> m; | 3979 RawMachineAssemblerTester<int32_t> m; |
4010 Node* add = | 3980 Node* add = |
4011 m.Int32SubWithOverflow(m.Int32Constant(*i), m.Int32Constant(*j)); | 3981 m.Int32SubWithOverflow(m.Int32Constant(*i), m.Int32Constant(*j)); |
4012 Node* val = m.Projection(0, add); | 3982 Node* val = m.Projection(0, add); |
4013 Node* ovf = m.Projection(1, add); | 3983 Node* ovf = m.Projection(1, add); |
4014 m.StoreToPointer(&actual_val, kMachineWord32, val); | 3984 m.StoreToPointer(&actual_val, kMachInt32, val); |
4015 m.Return(ovf); | 3985 m.Return(ovf); |
4016 int expected_ovf = ssub_overflow(*i, *j, &expected_val); | 3986 int expected_ovf = ssub_overflow(*i, *j, &expected_val); |
4017 CHECK_EQ(expected_ovf, m.Call()); | 3987 CHECK_EQ(expected_ovf, m.Call()); |
4018 CHECK_EQ(expected_val, actual_val); | 3988 CHECK_EQ(expected_val, actual_val); |
4019 } | 3989 } |
4020 } | 3990 } |
4021 } | 3991 } |
4022 | 3992 |
4023 | 3993 |
4024 TEST(RunInt32SubWithOverflowInBranchP) { | 3994 TEST(RunInt32SubWithOverflowInBranchP) { |
4025 int constant = 911999; | 3995 int constant = 911999; |
4026 MLabel blocka, blockb; | 3996 MLabel blocka, blockb; |
4027 RawMachineAssemblerTester<int32_t> m; | 3997 RawMachineAssemblerTester<int32_t> m; |
4028 Int32BinopTester bt(&m); | 3998 Int32BinopTester bt(&m); |
4029 Node* sub = m.Int32SubWithOverflow(bt.param0, bt.param1); | 3999 Node* sub = m.Int32SubWithOverflow(bt.param0, bt.param1); |
4030 Node* ovf = m.Projection(1, sub); | 4000 Node* ovf = m.Projection(1, sub); |
4031 m.Branch(ovf, &blocka, &blockb); | 4001 m.Branch(ovf, &blocka, &blockb); |
4032 m.Bind(&blocka); | 4002 m.Bind(&blocka); |
4033 bt.AddReturn(m.Int32Constant(constant)); | 4003 bt.AddReturn(m.Int32Constant(constant)); |
4034 m.Bind(&blockb); | 4004 m.Bind(&blockb); |
4035 Node* val = m.Projection(0, sub); | 4005 Node* val = m.Projection(0, sub); |
4036 bt.AddReturn(val); | 4006 bt.AddReturn(val); |
4037 FOR_UINT32_INPUTS(i) { | 4007 FOR_INT32_INPUTS(i) { |
4038 FOR_UINT32_INPUTS(j) { | 4008 FOR_INT32_INPUTS(j) { |
4039 int32_t expected; | 4009 int32_t expected; |
4040 if (ssub_overflow(*i, *j, &expected)) expected = constant; | 4010 if (ssub_overflow(*i, *j, &expected)) expected = constant; |
4041 CHECK_EQ(expected, bt.call(*i, *j)); | 4011 CHECK_EQ(expected, bt.call(*i, *j)); |
4042 } | 4012 } |
4043 } | 4013 } |
4044 } | 4014 } |
4045 | 4015 |
4046 #endif // V8_TURBOFAN_TARGET | 4016 #endif // V8_TURBOFAN_TARGET |
OLD | NEW |