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

Side by Side Diff: test/cctest/compiler/test-run-machops.cc

Issue 1477413002: Move RMA::Label out of the class, so it can be forward declared. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 the V8 project authors. All rights reserved. Use of this 1 // Copyright 2014 the V8 project authors. All rights reserved. Use of this
2 // source code is governed by a BSD-style license that can be found in the 2 // source code is governed by a BSD-style license that can be found in the
3 // LICENSE file. 3 // LICENSE file.
4 4
5 // TODO(jochen): Remove this after the setting is turned on globally. 5 // TODO(jochen): Remove this after the setting is turned on globally.
6 #define V8_IMMINENT_DEPRECATION_WARNINGS 6 #define V8_IMMINENT_DEPRECATION_WARNINGS
7 7
8 #include <cmath> 8 #include <cmath>
9 #include <functional> 9 #include <functional>
10 #include <limits> 10 #include <limits>
11 11
12 #include "src/base/bits.h" 12 #include "src/base/bits.h"
13 #include "src/base/utils/random-number-generator.h" 13 #include "src/base/utils/random-number-generator.h"
14 #include "src/codegen.h" 14 #include "src/codegen.h"
15 #include "test/cctest/cctest.h" 15 #include "test/cctest/cctest.h"
16 #include "test/cctest/compiler/codegen-tester.h" 16 #include "test/cctest/compiler/codegen-tester.h"
17 #include "test/cctest/compiler/graph-builder-tester.h" 17 #include "test/cctest/compiler/graph-builder-tester.h"
18 #include "test/cctest/compiler/value-helper.h" 18 #include "test/cctest/compiler/value-helper.h"
19 19
20 using namespace v8::base; 20 using namespace v8::base;
21 21
22 namespace v8 { 22 namespace v8 {
23 namespace internal { 23 namespace internal {
24 namespace compiler { 24 namespace compiler {
25 25
26 typedef RawMachineAssembler::Label MLabel;
27
28 26
29 TEST(RunInt32Add) { 27 TEST(RunInt32Add) {
30 RawMachineAssemblerTester<int32_t> m; 28 RawMachineAssemblerTester<int32_t> m;
31 Node* add = m.Int32Add(m.Int32Constant(0), m.Int32Constant(1)); 29 Node* add = m.Int32Add(m.Int32Constant(0), m.Int32Constant(1));
32 m.Return(add); 30 m.Return(add);
33 CHECK_EQ(1, m.Call()); 31 CHECK_EQ(1, m.Call());
34 } 32 }
35 33
36 34
37 TEST(RunWord32Ctz) { 35 TEST(RunWord32Ctz) {
(...skipping 382 matching lines...) Expand 10 before | Expand all | Expand 10 after
420 418
421 419
422 // TODO(titzer): add tests that run 64-bit integer operations. 420 // TODO(titzer): add tests that run 64-bit integer operations.
423 #endif // V8_TARGET_ARCH_64_BIT 421 #endif // V8_TARGET_ARCH_64_BIT
424 422
425 423
426 TEST(RunGoto) { 424 TEST(RunGoto) {
427 RawMachineAssemblerTester<int32_t> m; 425 RawMachineAssemblerTester<int32_t> m;
428 int constant = 99999; 426 int constant = 99999;
429 427
430 MLabel next; 428 RawLabel next;
431 m.Goto(&next); 429 m.Goto(&next);
432 m.Bind(&next); 430 m.Bind(&next);
433 m.Return(m.Int32Constant(constant)); 431 m.Return(m.Int32Constant(constant));
434 432
435 CHECK_EQ(constant, m.Call()); 433 CHECK_EQ(constant, m.Call());
436 } 434 }
437 435
438 436
439 TEST(RunGotoMultiple) { 437 TEST(RunGotoMultiple) {
440 RawMachineAssemblerTester<int32_t> m; 438 RawMachineAssemblerTester<int32_t> m;
441 int constant = 9999977; 439 int constant = 9999977;
442 440
443 MLabel labels[10]; 441 RawLabel labels[10];
444 for (size_t i = 0; i < arraysize(labels); i++) { 442 for (size_t i = 0; i < arraysize(labels); i++) {
445 m.Goto(&labels[i]); 443 m.Goto(&labels[i]);
446 m.Bind(&labels[i]); 444 m.Bind(&labels[i]);
447 } 445 }
448 m.Return(m.Int32Constant(constant)); 446 m.Return(m.Int32Constant(constant));
449 447
450 CHECK_EQ(constant, m.Call()); 448 CHECK_EQ(constant, m.Call());
451 } 449 }
452 450
453 451
454 TEST(RunBranch) { 452 TEST(RunBranch) {
455 RawMachineAssemblerTester<int32_t> m; 453 RawMachineAssemblerTester<int32_t> m;
456 int constant = 999777; 454 int constant = 999777;
457 455
458 MLabel blocka, blockb; 456 RawLabel blocka, blockb;
459 m.Branch(m.Int32Constant(0), &blocka, &blockb); 457 m.Branch(m.Int32Constant(0), &blocka, &blockb);
460 m.Bind(&blocka); 458 m.Bind(&blocka);
461 m.Return(m.Int32Constant(0 - constant)); 459 m.Return(m.Int32Constant(0 - constant));
462 m.Bind(&blockb); 460 m.Bind(&blockb);
463 m.Return(m.Int32Constant(constant)); 461 m.Return(m.Int32Constant(constant));
464 462
465 CHECK_EQ(constant, m.Call()); 463 CHECK_EQ(constant, m.Call());
466 } 464 }
467 465
468 466
469 TEST(RunDiamond2) { 467 TEST(RunDiamond2) {
470 RawMachineAssemblerTester<int32_t> m; 468 RawMachineAssemblerTester<int32_t> m;
471 469
472 int constant = 995666; 470 int constant = 995666;
473 471
474 MLabel blocka, blockb, end; 472 RawLabel blocka, blockb, end;
475 m.Branch(m.Int32Constant(0), &blocka, &blockb); 473 m.Branch(m.Int32Constant(0), &blocka, &blockb);
476 m.Bind(&blocka); 474 m.Bind(&blocka);
477 m.Goto(&end); 475 m.Goto(&end);
478 m.Bind(&blockb); 476 m.Bind(&blockb);
479 m.Goto(&end); 477 m.Goto(&end);
480 m.Bind(&end); 478 m.Bind(&end);
481 m.Return(m.Int32Constant(constant)); 479 m.Return(m.Int32Constant(constant));
482 480
483 CHECK_EQ(constant, m.Call()); 481 CHECK_EQ(constant, m.Call());
484 } 482 }
485 483
486 484
487 TEST(RunLoop) { 485 TEST(RunLoop) {
488 RawMachineAssemblerTester<int32_t> m; 486 RawMachineAssemblerTester<int32_t> m;
489 int constant = 999555; 487 int constant = 999555;
490 488
491 MLabel header, body, exit; 489 RawLabel header, body, exit;
492 m.Goto(&header); 490 m.Goto(&header);
493 m.Bind(&header); 491 m.Bind(&header);
494 m.Branch(m.Int32Constant(0), &body, &exit); 492 m.Branch(m.Int32Constant(0), &body, &exit);
495 m.Bind(&body); 493 m.Bind(&body);
496 m.Goto(&header); 494 m.Goto(&header);
497 m.Bind(&exit); 495 m.Bind(&exit);
498 m.Return(m.Int32Constant(constant)); 496 m.Return(m.Int32Constant(constant));
499 497
500 CHECK_EQ(constant, m.Call()); 498 CHECK_EQ(constant, m.Call());
501 } 499 }
502 500
503 501
504 template <typename R> 502 template <typename R>
505 static void BuildDiamondPhi(RawMachineAssemblerTester<R>* m, Node* cond_node, 503 static void BuildDiamondPhi(RawMachineAssemblerTester<R>* m, Node* cond_node,
506 MachineType type, Node* true_node, 504 MachineType type, Node* true_node,
507 Node* false_node) { 505 Node* false_node) {
508 MLabel blocka, blockb, end; 506 RawLabel blocka, blockb, end;
509 m->Branch(cond_node, &blocka, &blockb); 507 m->Branch(cond_node, &blocka, &blockb);
510 m->Bind(&blocka); 508 m->Bind(&blocka);
511 m->Goto(&end); 509 m->Goto(&end);
512 m->Bind(&blockb); 510 m->Bind(&blockb);
513 m->Goto(&end); 511 m->Goto(&end);
514 512
515 m->Bind(&end); 513 m->Bind(&end);
516 Node* phi = m->Phi(type, true_node, false_node); 514 Node* phi = m->Phi(type, true_node, false_node);
517 m->Return(phi); 515 m->Return(phi);
518 } 516 }
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
570 TEST(RunLoopPhiConst) { 568 TEST(RunLoopPhiConst) {
571 RawMachineAssemblerTester<int32_t> m; 569 RawMachineAssemblerTester<int32_t> m;
572 int true_val = 0x44000; 570 int true_val = 0x44000;
573 int false_val = 0x00888; 571 int false_val = 0x00888;
574 572
575 Node* cond_node = m.Int32Constant(0); 573 Node* cond_node = m.Int32Constant(0);
576 Node* true_node = m.Int32Constant(true_val); 574 Node* true_node = m.Int32Constant(true_val);
577 Node* false_node = m.Int32Constant(false_val); 575 Node* false_node = m.Int32Constant(false_val);
578 576
579 // x = false_val; while(false) { x = true_val; } return x; 577 // x = false_val; while(false) { x = true_val; } return x;
580 MLabel body, header, end; 578 RawLabel body, header, end;
581 579
582 m.Goto(&header); 580 m.Goto(&header);
583 m.Bind(&header); 581 m.Bind(&header);
584 Node* phi = m.Phi(kMachInt32, false_node, true_node); 582 Node* phi = m.Phi(kMachInt32, false_node, true_node);
585 m.Branch(cond_node, &body, &end); 583 m.Branch(cond_node, &body, &end);
586 m.Bind(&body); 584 m.Bind(&body);
587 m.Goto(&header); 585 m.Goto(&header);
588 m.Bind(&end); 586 m.Bind(&end);
589 m.Return(phi); 587 m.Return(phi);
590 588
591 CHECK_EQ(false_val, m.Call()); 589 CHECK_EQ(false_val, m.Call());
592 } 590 }
593 591
594 592
595 TEST(RunLoopPhiParam) { 593 TEST(RunLoopPhiParam) {
596 RawMachineAssemblerTester<int32_t> m(kMachInt32, kMachInt32, kMachInt32); 594 RawMachineAssemblerTester<int32_t> m(kMachInt32, kMachInt32, kMachInt32);
597 595
598 MLabel blocka, blockb, end; 596 RawLabel blocka, blockb, end;
599 597
600 m.Goto(&blocka); 598 m.Goto(&blocka);
601 599
602 m.Bind(&blocka); 600 m.Bind(&blocka);
603 Node* phi = m.Phi(kMachInt32, m.Parameter(1), m.Parameter(2)); 601 Node* phi = m.Phi(kMachInt32, m.Parameter(1), m.Parameter(2));
604 Node* cond = m.Phi(kMachInt32, m.Parameter(0), m.Int32Constant(0)); 602 Node* cond = m.Phi(kMachInt32, m.Parameter(0), m.Int32Constant(0));
605 m.Branch(cond, &blockb, &end); 603 m.Branch(cond, &blockb, &end);
606 604
607 m.Bind(&blockb); 605 m.Bind(&blockb);
608 m.Goto(&blocka); 606 m.Goto(&blocka);
609 607
610 m.Bind(&end); 608 m.Bind(&end);
611 m.Return(phi); 609 m.Return(phi);
612 610
613 int32_t c1 = 0xa81903b4; 611 int32_t c1 = 0xa81903b4;
614 int32_t c2 = 0x5a1207da; 612 int32_t c2 = 0x5a1207da;
615 int result = m.Call(0, c1, c2); 613 int result = m.Call(0, c1, c2);
616 CHECK_EQ(c1, result); 614 CHECK_EQ(c1, result);
617 result = m.Call(1, c1, c2); 615 result = m.Call(1, c1, c2);
618 CHECK_EQ(c2, result); 616 CHECK_EQ(c2, result);
619 } 617 }
620 618
621 619
622 TEST(RunLoopPhiInduction) { 620 TEST(RunLoopPhiInduction) {
623 RawMachineAssemblerTester<int32_t> m; 621 RawMachineAssemblerTester<int32_t> m;
624 622
625 int false_val = 0x10777; 623 int false_val = 0x10777;
626 624
627 // x = false_val; while(false) { x++; } return x; 625 // x = false_val; while(false) { x++; } return x;
628 MLabel header, body, end; 626 RawLabel header, body, end;
629 Node* false_node = m.Int32Constant(false_val); 627 Node* false_node = m.Int32Constant(false_val);
630 628
631 m.Goto(&header); 629 m.Goto(&header);
632 630
633 m.Bind(&header); 631 m.Bind(&header);
634 Node* phi = m.Phi(kMachInt32, false_node, false_node); 632 Node* phi = m.Phi(kMachInt32, false_node, false_node);
635 m.Branch(m.Int32Constant(0), &body, &end); 633 m.Branch(m.Int32Constant(0), &body, &end);
636 634
637 m.Bind(&body); 635 m.Bind(&body);
638 Node* add = m.Int32Add(phi, m.Int32Constant(1)); 636 Node* add = m.Int32Add(phi, m.Int32Constant(1));
639 phi->ReplaceInput(1, add); 637 phi->ReplaceInput(1, add);
640 m.Goto(&header); 638 m.Goto(&header);
641 639
642 m.Bind(&end); 640 m.Bind(&end);
643 m.Return(phi); 641 m.Return(phi);
644 642
645 CHECK_EQ(false_val, m.Call()); 643 CHECK_EQ(false_val, m.Call());
646 } 644 }
647 645
648 646
649 TEST(RunLoopIncrement) { 647 TEST(RunLoopIncrement) {
650 RawMachineAssemblerTester<int32_t> m; 648 RawMachineAssemblerTester<int32_t> m;
651 Int32BinopTester bt(&m); 649 Int32BinopTester bt(&m);
652 650
653 // x = 0; while(x ^ param) { x++; } return x; 651 // x = 0; while(x ^ param) { x++; } return x;
654 MLabel header, body, end; 652 RawLabel header, body, end;
655 Node* zero = m.Int32Constant(0); 653 Node* zero = m.Int32Constant(0);
656 654
657 m.Goto(&header); 655 m.Goto(&header);
658 656
659 m.Bind(&header); 657 m.Bind(&header);
660 Node* phi = m.Phi(kMachInt32, zero, zero); 658 Node* phi = m.Phi(kMachInt32, zero, zero);
661 m.Branch(m.WordXor(phi, bt.param0), &body, &end); 659 m.Branch(m.WordXor(phi, bt.param0), &body, &end);
662 660
663 m.Bind(&body); 661 m.Bind(&body);
664 phi->ReplaceInput(1, m.Int32Add(phi, m.Int32Constant(1))); 662 phi->ReplaceInput(1, m.Int32Add(phi, m.Int32Constant(1)));
665 m.Goto(&header); 663 m.Goto(&header);
666 664
667 m.Bind(&end); 665 m.Bind(&end);
668 bt.AddReturn(phi); 666 bt.AddReturn(phi);
669 667
670 CHECK_EQ(11, bt.call(11, 0)); 668 CHECK_EQ(11, bt.call(11, 0));
671 CHECK_EQ(110, bt.call(110, 0)); 669 CHECK_EQ(110, bt.call(110, 0));
672 CHECK_EQ(176, bt.call(176, 0)); 670 CHECK_EQ(176, bt.call(176, 0));
673 } 671 }
674 672
675 673
676 TEST(RunLoopIncrement2) { 674 TEST(RunLoopIncrement2) {
677 RawMachineAssemblerTester<int32_t> m; 675 RawMachineAssemblerTester<int32_t> m;
678 Int32BinopTester bt(&m); 676 Int32BinopTester bt(&m);
679 677
680 // x = 0; while(x < param) { x++; } return x; 678 // x = 0; while(x < param) { x++; } return x;
681 MLabel header, body, end; 679 RawLabel header, body, end;
682 Node* zero = m.Int32Constant(0); 680 Node* zero = m.Int32Constant(0);
683 681
684 m.Goto(&header); 682 m.Goto(&header);
685 683
686 m.Bind(&header); 684 m.Bind(&header);
687 Node* phi = m.Phi(kMachInt32, zero, zero); 685 Node* phi = m.Phi(kMachInt32, zero, zero);
688 m.Branch(m.Int32LessThan(phi, bt.param0), &body, &end); 686 m.Branch(m.Int32LessThan(phi, bt.param0), &body, &end);
689 687
690 m.Bind(&body); 688 m.Bind(&body);
691 phi->ReplaceInput(1, m.Int32Add(phi, m.Int32Constant(1))); 689 phi->ReplaceInput(1, m.Int32Add(phi, m.Int32Constant(1)));
692 m.Goto(&header); 690 m.Goto(&header);
693 691
694 m.Bind(&end); 692 m.Bind(&end);
695 bt.AddReturn(phi); 693 bt.AddReturn(phi);
696 694
697 CHECK_EQ(11, bt.call(11, 0)); 695 CHECK_EQ(11, bt.call(11, 0));
698 CHECK_EQ(110, bt.call(110, 0)); 696 CHECK_EQ(110, bt.call(110, 0));
699 CHECK_EQ(176, bt.call(176, 0)); 697 CHECK_EQ(176, bt.call(176, 0));
700 CHECK_EQ(0, bt.call(-200, 0)); 698 CHECK_EQ(0, bt.call(-200, 0));
701 } 699 }
702 700
703 701
704 TEST(RunLoopIncrement3) { 702 TEST(RunLoopIncrement3) {
705 RawMachineAssemblerTester<int32_t> m; 703 RawMachineAssemblerTester<int32_t> m;
706 Int32BinopTester bt(&m); 704 Int32BinopTester bt(&m);
707 705
708 // x = 0; while(x < param) { x++; } return x; 706 // x = 0; while(x < param) { x++; } return x;
709 MLabel header, body, end; 707 RawLabel header, body, end;
710 Node* zero = m.Int32Constant(0); 708 Node* zero = m.Int32Constant(0);
711 709
712 m.Goto(&header); 710 m.Goto(&header);
713 711
714 m.Bind(&header); 712 m.Bind(&header);
715 Node* phi = m.Phi(kMachInt32, zero, zero); 713 Node* phi = m.Phi(kMachInt32, zero, zero);
716 m.Branch(m.Uint32LessThan(phi, bt.param0), &body, &end); 714 m.Branch(m.Uint32LessThan(phi, bt.param0), &body, &end);
717 715
718 m.Bind(&body); 716 m.Bind(&body);
719 phi->ReplaceInput(1, m.Int32Add(phi, m.Int32Constant(1))); 717 phi->ReplaceInput(1, m.Int32Add(phi, m.Int32Constant(1)));
720 m.Goto(&header); 718 m.Goto(&header);
721 719
722 m.Bind(&end); 720 m.Bind(&end);
723 bt.AddReturn(phi); 721 bt.AddReturn(phi);
724 722
725 CHECK_EQ(11, bt.call(11, 0)); 723 CHECK_EQ(11, bt.call(11, 0));
726 CHECK_EQ(110, bt.call(110, 0)); 724 CHECK_EQ(110, bt.call(110, 0));
727 CHECK_EQ(176, bt.call(176, 0)); 725 CHECK_EQ(176, bt.call(176, 0));
728 CHECK_EQ(200, bt.call(200, 0)); 726 CHECK_EQ(200, bt.call(200, 0));
729 } 727 }
730 728
731 729
732 TEST(RunLoopDecrement) { 730 TEST(RunLoopDecrement) {
733 RawMachineAssemblerTester<int32_t> m; 731 RawMachineAssemblerTester<int32_t> m;
734 Int32BinopTester bt(&m); 732 Int32BinopTester bt(&m);
735 733
736 // x = param; while(x) { x--; } return x; 734 // x = param; while(x) { x--; } return x;
737 MLabel header, body, end; 735 RawLabel header, body, end;
738 736
739 m.Goto(&header); 737 m.Goto(&header);
740 738
741 m.Bind(&header); 739 m.Bind(&header);
742 Node* phi = m.Phi(kMachInt32, bt.param0, m.Int32Constant(0)); 740 Node* phi = m.Phi(kMachInt32, bt.param0, m.Int32Constant(0));
743 m.Branch(phi, &body, &end); 741 m.Branch(phi, &body, &end);
744 742
745 m.Bind(&body); 743 m.Bind(&body);
746 phi->ReplaceInput(1, m.Int32Sub(phi, m.Int32Constant(1))); 744 phi->ReplaceInput(1, m.Int32Sub(phi, m.Int32Constant(1)));
747 m.Goto(&header); 745 m.Goto(&header);
748 746
749 m.Bind(&end); 747 m.Bind(&end);
750 bt.AddReturn(phi); 748 bt.AddReturn(phi);
751 749
752 CHECK_EQ(0, bt.call(11, 0)); 750 CHECK_EQ(0, bt.call(11, 0));
753 CHECK_EQ(0, bt.call(110, 0)); 751 CHECK_EQ(0, bt.call(110, 0));
754 CHECK_EQ(0, bt.call(197, 0)); 752 CHECK_EQ(0, bt.call(197, 0));
755 } 753 }
756 754
757 755
758 TEST(RunLoopIncrementFloat32) { 756 TEST(RunLoopIncrementFloat32) {
759 RawMachineAssemblerTester<int32_t> m; 757 RawMachineAssemblerTester<int32_t> m;
760 758
761 // x = -3.0f; while(x < 10f) { x = x + 0.5f; } return (int) (double) x; 759 // x = -3.0f; while(x < 10f) { x = x + 0.5f; } return (int) (double) x;
762 MLabel header, body, end; 760 RawLabel header, body, end;
763 Node* minus_3 = m.Float32Constant(-3.0f); 761 Node* minus_3 = m.Float32Constant(-3.0f);
764 Node* ten = m.Float32Constant(10.0f); 762 Node* ten = m.Float32Constant(10.0f);
765 763
766 m.Goto(&header); 764 m.Goto(&header);
767 765
768 m.Bind(&header); 766 m.Bind(&header);
769 Node* phi = m.Phi(kMachFloat32, minus_3, ten); 767 Node* phi = m.Phi(kMachFloat32, minus_3, ten);
770 m.Branch(m.Float32LessThan(phi, ten), &body, &end); 768 m.Branch(m.Float32LessThan(phi, ten), &body, &end);
771 769
772 m.Bind(&body); 770 m.Bind(&body);
773 phi->ReplaceInput(1, m.Float32Add(phi, m.Float32Constant(0.5f))); 771 phi->ReplaceInput(1, m.Float32Add(phi, m.Float32Constant(0.5f)));
774 m.Goto(&header); 772 m.Goto(&header);
775 773
776 m.Bind(&end); 774 m.Bind(&end);
777 m.Return(m.ChangeFloat64ToInt32(m.ChangeFloat32ToFloat64(phi))); 775 m.Return(m.ChangeFloat64ToInt32(m.ChangeFloat32ToFloat64(phi)));
778 776
779 CHECK_EQ(10, m.Call()); 777 CHECK_EQ(10, m.Call());
780 } 778 }
781 779
782 780
783 TEST(RunLoopIncrementFloat64) { 781 TEST(RunLoopIncrementFloat64) {
784 RawMachineAssemblerTester<int32_t> m; 782 RawMachineAssemblerTester<int32_t> m;
785 783
786 // x = -3.0; while(x < 10) { x = x + 0.5; } return (int) x; 784 // x = -3.0; while(x < 10) { x = x + 0.5; } return (int) x;
787 MLabel header, body, end; 785 RawLabel header, body, end;
788 Node* minus_3 = m.Float64Constant(-3.0); 786 Node* minus_3 = m.Float64Constant(-3.0);
789 Node* ten = m.Float64Constant(10.0); 787 Node* ten = m.Float64Constant(10.0);
790 788
791 m.Goto(&header); 789 m.Goto(&header);
792 790
793 m.Bind(&header); 791 m.Bind(&header);
794 Node* phi = m.Phi(kMachFloat64, minus_3, ten); 792 Node* phi = m.Phi(kMachFloat64, minus_3, ten);
795 m.Branch(m.Float64LessThan(phi, ten), &body, &end); 793 m.Branch(m.Float64LessThan(phi, ten), &body, &end);
796 794
797 m.Bind(&body); 795 m.Bind(&body);
798 phi->ReplaceInput(1, m.Float64Add(phi, m.Float64Constant(0.5))); 796 phi->ReplaceInput(1, m.Float64Add(phi, m.Float64Constant(0.5)));
799 m.Goto(&header); 797 m.Goto(&header);
800 798
801 m.Bind(&end); 799 m.Bind(&end);
802 m.Return(m.ChangeFloat64ToInt32(phi)); 800 m.Return(m.ChangeFloat64ToInt32(phi));
803 801
804 CHECK_EQ(10, m.Call()); 802 CHECK_EQ(10, m.Call());
805 } 803 }
806 804
807 805
808 TEST(RunSwitch1) { 806 TEST(RunSwitch1) {
809 RawMachineAssemblerTester<int32_t> m; 807 RawMachineAssemblerTester<int32_t> m;
810 808
811 int constant = 11223344; 809 int constant = 11223344;
812 810
813 MLabel block0, block1, def, end; 811 RawLabel block0, block1, def, end;
814 MLabel* case_labels[] = {&block0, &block1}; 812 RawLabel* case_labels[] = {&block0, &block1};
815 int32_t case_values[] = {0, 1}; 813 int32_t case_values[] = {0, 1};
816 m.Switch(m.Int32Constant(0), &def, case_values, case_labels, 814 m.Switch(m.Int32Constant(0), &def, case_values, case_labels,
817 arraysize(case_labels)); 815 arraysize(case_labels));
818 m.Bind(&block0); 816 m.Bind(&block0);
819 m.Goto(&end); 817 m.Goto(&end);
820 m.Bind(&block1); 818 m.Bind(&block1);
821 m.Goto(&end); 819 m.Goto(&end);
822 m.Bind(&def); 820 m.Bind(&def);
823 m.Goto(&end); 821 m.Goto(&end);
824 m.Bind(&end); 822 m.Bind(&end);
825 m.Return(m.Int32Constant(constant)); 823 m.Return(m.Int32Constant(constant));
826 824
827 CHECK_EQ(constant, m.Call()); 825 CHECK_EQ(constant, m.Call());
828 } 826 }
829 827
830 828
831 TEST(RunSwitch2) { 829 TEST(RunSwitch2) {
832 RawMachineAssemblerTester<int32_t> m(kMachInt32); 830 RawMachineAssemblerTester<int32_t> m(kMachInt32);
833 831
834 MLabel blocka, blockb, blockc; 832 RawLabel blocka, blockb, blockc;
835 MLabel* case_labels[] = {&blocka, &blockb}; 833 RawLabel* case_labels[] = {&blocka, &blockb};
836 int32_t case_values[] = {std::numeric_limits<int32_t>::min(), 834 int32_t case_values[] = {std::numeric_limits<int32_t>::min(),
837 std::numeric_limits<int32_t>::max()}; 835 std::numeric_limits<int32_t>::max()};
838 m.Switch(m.Parameter(0), &blockc, case_values, case_labels, 836 m.Switch(m.Parameter(0), &blockc, case_values, case_labels,
839 arraysize(case_labels)); 837 arraysize(case_labels));
840 m.Bind(&blocka); 838 m.Bind(&blocka);
841 m.Return(m.Int32Constant(-1)); 839 m.Return(m.Int32Constant(-1));
842 m.Bind(&blockb); 840 m.Bind(&blockb);
843 m.Return(m.Int32Constant(1)); 841 m.Return(m.Int32Constant(1));
844 m.Bind(&blockc); 842 m.Bind(&blockc);
845 m.Return(m.Int32Constant(0)); 843 m.Return(m.Int32Constant(0));
846 844
847 CHECK_EQ(1, m.Call(std::numeric_limits<int32_t>::max())); 845 CHECK_EQ(1, m.Call(std::numeric_limits<int32_t>::max()));
848 CHECK_EQ(-1, m.Call(std::numeric_limits<int32_t>::min())); 846 CHECK_EQ(-1, m.Call(std::numeric_limits<int32_t>::min()));
849 for (int i = -100; i < 100; i += 25) { 847 for (int i = -100; i < 100; i += 25) {
850 CHECK_EQ(0, m.Call(i)); 848 CHECK_EQ(0, m.Call(i));
851 } 849 }
852 } 850 }
853 851
854 852
855 TEST(RunSwitch3) { 853 TEST(RunSwitch3) {
856 RawMachineAssemblerTester<int32_t> m(kMachInt32); 854 RawMachineAssemblerTester<int32_t> m(kMachInt32);
857 855
858 MLabel blocka, blockb, blockc; 856 RawLabel blocka, blockb, blockc;
859 MLabel* case_labels[] = {&blocka, &blockb}; 857 RawLabel* case_labels[] = {&blocka, &blockb};
860 int32_t case_values[] = {std::numeric_limits<int32_t>::min() + 0, 858 int32_t case_values[] = {std::numeric_limits<int32_t>::min() + 0,
861 std::numeric_limits<int32_t>::min() + 1}; 859 std::numeric_limits<int32_t>::min() + 1};
862 m.Switch(m.Parameter(0), &blockc, case_values, case_labels, 860 m.Switch(m.Parameter(0), &blockc, case_values, case_labels,
863 arraysize(case_labels)); 861 arraysize(case_labels));
864 m.Bind(&blocka); 862 m.Bind(&blocka);
865 m.Return(m.Int32Constant(0)); 863 m.Return(m.Int32Constant(0));
866 m.Bind(&blockb); 864 m.Bind(&blockb);
867 m.Return(m.Int32Constant(1)); 865 m.Return(m.Int32Constant(1));
868 m.Bind(&blockc); 866 m.Bind(&blockc);
869 m.Return(m.Int32Constant(2)); 867 m.Return(m.Int32Constant(2));
870 868
871 CHECK_EQ(0, m.Call(std::numeric_limits<int32_t>::min() + 0)); 869 CHECK_EQ(0, m.Call(std::numeric_limits<int32_t>::min() + 0));
872 CHECK_EQ(1, m.Call(std::numeric_limits<int32_t>::min() + 1)); 870 CHECK_EQ(1, m.Call(std::numeric_limits<int32_t>::min() + 1));
873 for (int i = -100; i < 100; i += 25) { 871 for (int i = -100; i < 100; i += 25) {
874 CHECK_EQ(2, m.Call(i)); 872 CHECK_EQ(2, m.Call(i));
875 } 873 }
876 } 874 }
877 875
878 876
879 TEST(RunSwitch4) { 877 TEST(RunSwitch4) {
880 RawMachineAssemblerTester<int32_t> m(kMachInt32); 878 RawMachineAssemblerTester<int32_t> m(kMachInt32);
881 879
882 const size_t kNumCases = 512; 880 const size_t kNumCases = 512;
883 const size_t kNumValues = kNumCases + 1; 881 const size_t kNumValues = kNumCases + 1;
884 int32_t values[kNumValues]; 882 int32_t values[kNumValues];
885 m.main_isolate()->random_number_generator()->NextBytes(values, 883 m.main_isolate()->random_number_generator()->NextBytes(values,
886 sizeof(values)); 884 sizeof(values));
887 MLabel end, def; 885 RawLabel end, def;
888 int32_t case_values[kNumCases]; 886 int32_t case_values[kNumCases];
889 MLabel* case_labels[kNumCases]; 887 RawLabel* case_labels[kNumCases];
890 Node* results[kNumValues]; 888 Node* results[kNumValues];
891 for (size_t i = 0; i < kNumCases; ++i) { 889 for (size_t i = 0; i < kNumCases; ++i) {
892 case_values[i] = static_cast<int32_t>(i); 890 case_values[i] = static_cast<int32_t>(i);
893 case_labels[i] = new (m.main_zone()->New(sizeof(MLabel))) MLabel; 891 case_labels[i] = new (m.main_zone()->New(sizeof(RawLabel))) RawLabel;
894 } 892 }
895 m.Switch(m.Parameter(0), &def, case_values, case_labels, 893 m.Switch(m.Parameter(0), &def, case_values, case_labels,
896 arraysize(case_labels)); 894 arraysize(case_labels));
897 for (size_t i = 0; i < kNumCases; ++i) { 895 for (size_t i = 0; i < kNumCases; ++i) {
898 m.Bind(case_labels[i]); 896 m.Bind(case_labels[i]);
899 results[i] = m.Int32Constant(values[i]); 897 results[i] = m.Int32Constant(values[i]);
900 m.Goto(&end); 898 m.Goto(&end);
901 } 899 }
902 m.Bind(&def); 900 m.Bind(&def);
903 results[kNumCases] = m.Int32Constant(values[kNumCases]); 901 results[kNumCases] = m.Int32Constant(values[kNumCases]);
(...skipping 344 matching lines...) Expand 10 before | Expand all | Expand 10 after
1248 } 1246 }
1249 } 1247 }
1250 } 1248 }
1251 1249
1252 1250
1253 TEST(RunInt32AddInBranch) { 1251 TEST(RunInt32AddInBranch) {
1254 static const int32_t constant = 987654321; 1252 static const int32_t constant = 987654321;
1255 { 1253 {
1256 RawMachineAssemblerTester<int32_t> m; 1254 RawMachineAssemblerTester<int32_t> m;
1257 Int32BinopTester bt(&m); 1255 Int32BinopTester bt(&m);
1258 MLabel blocka, blockb; 1256 RawLabel blocka, blockb;
1259 m.Branch( 1257 m.Branch(
1260 m.Word32Equal(m.Int32Add(bt.param0, bt.param1), m.Int32Constant(0)), 1258 m.Word32Equal(m.Int32Add(bt.param0, bt.param1), m.Int32Constant(0)),
1261 &blocka, &blockb); 1259 &blocka, &blockb);
1262 m.Bind(&blocka); 1260 m.Bind(&blocka);
1263 bt.AddReturn(m.Int32Constant(constant)); 1261 bt.AddReturn(m.Int32Constant(constant));
1264 m.Bind(&blockb); 1262 m.Bind(&blockb);
1265 bt.AddReturn(m.Int32Constant(0 - constant)); 1263 bt.AddReturn(m.Int32Constant(0 - constant));
1266 FOR_UINT32_INPUTS(i) { 1264 FOR_UINT32_INPUTS(i) {
1267 FOR_UINT32_INPUTS(j) { 1265 FOR_UINT32_INPUTS(j) {
1268 int32_t expected = (*i + *j) == 0 ? constant : 0 - constant; 1266 int32_t expected = (*i + *j) == 0 ? constant : 0 - constant;
1269 CHECK_EQ(expected, bt.call(*i, *j)); 1267 CHECK_EQ(expected, bt.call(*i, *j));
1270 } 1268 }
1271 } 1269 }
1272 } 1270 }
1273 { 1271 {
1274 RawMachineAssemblerTester<int32_t> m; 1272 RawMachineAssemblerTester<int32_t> m;
1275 Int32BinopTester bt(&m); 1273 Int32BinopTester bt(&m);
1276 MLabel blocka, blockb; 1274 RawLabel blocka, blockb;
1277 m.Branch( 1275 m.Branch(
1278 m.Word32NotEqual(m.Int32Add(bt.param0, bt.param1), m.Int32Constant(0)), 1276 m.Word32NotEqual(m.Int32Add(bt.param0, bt.param1), m.Int32Constant(0)),
1279 &blocka, &blockb); 1277 &blocka, &blockb);
1280 m.Bind(&blocka); 1278 m.Bind(&blocka);
1281 bt.AddReturn(m.Int32Constant(constant)); 1279 bt.AddReturn(m.Int32Constant(constant));
1282 m.Bind(&blockb); 1280 m.Bind(&blockb);
1283 bt.AddReturn(m.Int32Constant(0 - constant)); 1281 bt.AddReturn(m.Int32Constant(0 - constant));
1284 FOR_UINT32_INPUTS(i) { 1282 FOR_UINT32_INPUTS(i) {
1285 FOR_UINT32_INPUTS(j) { 1283 FOR_UINT32_INPUTS(j) {
1286 int32_t expected = (*i + *j) != 0 ? constant : 0 - constant; 1284 int32_t expected = (*i + *j) != 0 ? constant : 0 - constant;
1287 CHECK_EQ(expected, bt.call(*i, *j)); 1285 CHECK_EQ(expected, bt.call(*i, *j));
1288 } 1286 }
1289 } 1287 }
1290 } 1288 }
1291 { 1289 {
1292 FOR_UINT32_INPUTS(i) { 1290 FOR_UINT32_INPUTS(i) {
1293 RawMachineAssemblerTester<uint32_t> m(kMachUint32); 1291 RawMachineAssemblerTester<uint32_t> m(kMachUint32);
1294 MLabel blocka, blockb; 1292 RawLabel blocka, blockb;
1295 m.Branch(m.Word32Equal(m.Int32Add(m.Int32Constant(*i), m.Parameter(0)), 1293 m.Branch(m.Word32Equal(m.Int32Add(m.Int32Constant(*i), m.Parameter(0)),
1296 m.Int32Constant(0)), 1294 m.Int32Constant(0)),
1297 &blocka, &blockb); 1295 &blocka, &blockb);
1298 m.Bind(&blocka); 1296 m.Bind(&blocka);
1299 m.Return(m.Int32Constant(constant)); 1297 m.Return(m.Int32Constant(constant));
1300 m.Bind(&blockb); 1298 m.Bind(&blockb);
1301 m.Return(m.Int32Constant(0 - constant)); 1299 m.Return(m.Int32Constant(0 - constant));
1302 FOR_UINT32_INPUTS(j) { 1300 FOR_UINT32_INPUTS(j) {
1303 uint32_t expected = (*i + *j) == 0 ? constant : 0 - constant; 1301 uint32_t expected = (*i + *j) == 0 ? constant : 0 - constant;
1304 CHECK_EQ(expected, m.Call(*j)); 1302 CHECK_EQ(expected, m.Call(*j));
1305 } 1303 }
1306 } 1304 }
1307 } 1305 }
1308 { 1306 {
1309 FOR_UINT32_INPUTS(i) { 1307 FOR_UINT32_INPUTS(i) {
1310 RawMachineAssemblerTester<uint32_t> m(kMachUint32); 1308 RawMachineAssemblerTester<uint32_t> m(kMachUint32);
1311 MLabel blocka, blockb; 1309 RawLabel blocka, blockb;
1312 m.Branch(m.Word32NotEqual(m.Int32Add(m.Int32Constant(*i), m.Parameter(0)), 1310 m.Branch(m.Word32NotEqual(m.Int32Add(m.Int32Constant(*i), m.Parameter(0)),
1313 m.Int32Constant(0)), 1311 m.Int32Constant(0)),
1314 &blocka, &blockb); 1312 &blocka, &blockb);
1315 m.Bind(&blocka); 1313 m.Bind(&blocka);
1316 m.Return(m.Int32Constant(constant)); 1314 m.Return(m.Int32Constant(constant));
1317 m.Bind(&blockb); 1315 m.Bind(&blockb);
1318 m.Return(m.Int32Constant(0 - constant)); 1316 m.Return(m.Int32Constant(0 - constant));
1319 FOR_UINT32_INPUTS(j) { 1317 FOR_UINT32_INPUTS(j) {
1320 uint32_t expected = (*i + *j) != 0 ? constant : 0 - constant; 1318 uint32_t expected = (*i + *j) != 0 ? constant : 0 - constant;
1321 CHECK_EQ(expected, m.Call(*j)); 1319 CHECK_EQ(expected, m.Call(*j));
1322 } 1320 }
1323 } 1321 }
1324 } 1322 }
1325 { 1323 {
1326 RawMachineAssemblerTester<void> m; 1324 RawMachineAssemblerTester<void> m;
1327 const Operator* shops[] = {m.machine()->Word32Sar(), 1325 const Operator* shops[] = {m.machine()->Word32Sar(),
1328 m.machine()->Word32Shl(), 1326 m.machine()->Word32Shl(),
1329 m.machine()->Word32Shr()}; 1327 m.machine()->Word32Shr()};
1330 for (size_t n = 0; n < arraysize(shops); n++) { 1328 for (size_t n = 0; n < arraysize(shops); n++) {
1331 RawMachineAssemblerTester<int32_t> m(kMachUint32, kMachInt32, 1329 RawMachineAssemblerTester<int32_t> m(kMachUint32, kMachInt32,
1332 kMachUint32); 1330 kMachUint32);
1333 MLabel blocka, blockb; 1331 RawLabel blocka, blockb;
1334 m.Branch(m.Word32Equal(m.Int32Add(m.Parameter(0), 1332 m.Branch(m.Word32Equal(m.Int32Add(m.Parameter(0),
1335 m.AddNode(shops[n], m.Parameter(1), 1333 m.AddNode(shops[n], m.Parameter(1),
1336 m.Parameter(2))), 1334 m.Parameter(2))),
1337 m.Int32Constant(0)), 1335 m.Int32Constant(0)),
1338 &blocka, &blockb); 1336 &blocka, &blockb);
1339 m.Bind(&blocka); 1337 m.Bind(&blocka);
1340 m.Return(m.Int32Constant(constant)); 1338 m.Return(m.Int32Constant(constant));
1341 m.Bind(&blockb); 1339 m.Bind(&blockb);
1342 m.Return(m.Int32Constant(0 - constant)); 1340 m.Return(m.Int32Constant(0 - constant));
1343 FOR_UINT32_INPUTS(i) { 1341 FOR_UINT32_INPUTS(i) {
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after
1585 } 1583 }
1586 } 1584 }
1587 } 1585 }
1588 1586
1589 1587
1590 TEST(RunInt32SubInBranch) { 1588 TEST(RunInt32SubInBranch) {
1591 static const int constant = 987654321; 1589 static const int constant = 987654321;
1592 { 1590 {
1593 RawMachineAssemblerTester<int32_t> m; 1591 RawMachineAssemblerTester<int32_t> m;
1594 Int32BinopTester bt(&m); 1592 Int32BinopTester bt(&m);
1595 MLabel blocka, blockb; 1593 RawLabel blocka, blockb;
1596 m.Branch( 1594 m.Branch(
1597 m.Word32Equal(m.Int32Sub(bt.param0, bt.param1), m.Int32Constant(0)), 1595 m.Word32Equal(m.Int32Sub(bt.param0, bt.param1), m.Int32Constant(0)),
1598 &blocka, &blockb); 1596 &blocka, &blockb);
1599 m.Bind(&blocka); 1597 m.Bind(&blocka);
1600 bt.AddReturn(m.Int32Constant(constant)); 1598 bt.AddReturn(m.Int32Constant(constant));
1601 m.Bind(&blockb); 1599 m.Bind(&blockb);
1602 bt.AddReturn(m.Int32Constant(0 - constant)); 1600 bt.AddReturn(m.Int32Constant(0 - constant));
1603 FOR_UINT32_INPUTS(i) { 1601 FOR_UINT32_INPUTS(i) {
1604 FOR_UINT32_INPUTS(j) { 1602 FOR_UINT32_INPUTS(j) {
1605 int32_t expected = (*i - *j) == 0 ? constant : 0 - constant; 1603 int32_t expected = (*i - *j) == 0 ? constant : 0 - constant;
1606 CHECK_EQ(expected, bt.call(*i, *j)); 1604 CHECK_EQ(expected, bt.call(*i, *j));
1607 } 1605 }
1608 } 1606 }
1609 } 1607 }
1610 { 1608 {
1611 RawMachineAssemblerTester<int32_t> m; 1609 RawMachineAssemblerTester<int32_t> m;
1612 Int32BinopTester bt(&m); 1610 Int32BinopTester bt(&m);
1613 MLabel blocka, blockb; 1611 RawLabel blocka, blockb;
1614 m.Branch( 1612 m.Branch(
1615 m.Word32NotEqual(m.Int32Sub(bt.param0, bt.param1), m.Int32Constant(0)), 1613 m.Word32NotEqual(m.Int32Sub(bt.param0, bt.param1), m.Int32Constant(0)),
1616 &blocka, &blockb); 1614 &blocka, &blockb);
1617 m.Bind(&blocka); 1615 m.Bind(&blocka);
1618 bt.AddReturn(m.Int32Constant(constant)); 1616 bt.AddReturn(m.Int32Constant(constant));
1619 m.Bind(&blockb); 1617 m.Bind(&blockb);
1620 bt.AddReturn(m.Int32Constant(0 - constant)); 1618 bt.AddReturn(m.Int32Constant(0 - constant));
1621 FOR_UINT32_INPUTS(i) { 1619 FOR_UINT32_INPUTS(i) {
1622 FOR_UINT32_INPUTS(j) { 1620 FOR_UINT32_INPUTS(j) {
1623 int32_t expected = (*i - *j) != 0 ? constant : 0 - constant; 1621 int32_t expected = (*i - *j) != 0 ? constant : 0 - constant;
1624 CHECK_EQ(expected, bt.call(*i, *j)); 1622 CHECK_EQ(expected, bt.call(*i, *j));
1625 } 1623 }
1626 } 1624 }
1627 } 1625 }
1628 { 1626 {
1629 FOR_UINT32_INPUTS(i) { 1627 FOR_UINT32_INPUTS(i) {
1630 RawMachineAssemblerTester<uint32_t> m(kMachUint32); 1628 RawMachineAssemblerTester<uint32_t> m(kMachUint32);
1631 MLabel blocka, blockb; 1629 RawLabel blocka, blockb;
1632 m.Branch(m.Word32Equal(m.Int32Sub(m.Int32Constant(*i), m.Parameter(0)), 1630 m.Branch(m.Word32Equal(m.Int32Sub(m.Int32Constant(*i), m.Parameter(0)),
1633 m.Int32Constant(0)), 1631 m.Int32Constant(0)),
1634 &blocka, &blockb); 1632 &blocka, &blockb);
1635 m.Bind(&blocka); 1633 m.Bind(&blocka);
1636 m.Return(m.Int32Constant(constant)); 1634 m.Return(m.Int32Constant(constant));
1637 m.Bind(&blockb); 1635 m.Bind(&blockb);
1638 m.Return(m.Int32Constant(0 - constant)); 1636 m.Return(m.Int32Constant(0 - constant));
1639 FOR_UINT32_INPUTS(j) { 1637 FOR_UINT32_INPUTS(j) {
1640 uint32_t expected = (*i - *j) == 0 ? constant : 0 - constant; 1638 uint32_t expected = (*i - *j) == 0 ? constant : 0 - constant;
1641 CHECK_EQ(expected, m.Call(*j)); 1639 CHECK_EQ(expected, m.Call(*j));
1642 } 1640 }
1643 } 1641 }
1644 } 1642 }
1645 { 1643 {
1646 FOR_UINT32_INPUTS(i) { 1644 FOR_UINT32_INPUTS(i) {
1647 RawMachineAssemblerTester<int32_t> m(kMachUint32); 1645 RawMachineAssemblerTester<int32_t> m(kMachUint32);
1648 MLabel blocka, blockb; 1646 RawLabel blocka, blockb;
1649 m.Branch(m.Word32NotEqual(m.Int32Sub(m.Int32Constant(*i), m.Parameter(0)), 1647 m.Branch(m.Word32NotEqual(m.Int32Sub(m.Int32Constant(*i), m.Parameter(0)),
1650 m.Int32Constant(0)), 1648 m.Int32Constant(0)),
1651 &blocka, &blockb); 1649 &blocka, &blockb);
1652 m.Bind(&blocka); 1650 m.Bind(&blocka);
1653 m.Return(m.Int32Constant(constant)); 1651 m.Return(m.Int32Constant(constant));
1654 m.Bind(&blockb); 1652 m.Bind(&blockb);
1655 m.Return(m.Int32Constant(0 - constant)); 1653 m.Return(m.Int32Constant(0 - constant));
1656 FOR_UINT32_INPUTS(j) { 1654 FOR_UINT32_INPUTS(j) {
1657 int32_t expected = (*i - *j) != 0 ? constant : 0 - constant; 1655 int32_t expected = (*i - *j) != 0 ? constant : 0 - constant;
1658 CHECK_EQ(expected, m.Call(*j)); 1656 CHECK_EQ(expected, m.Call(*j));
1659 } 1657 }
1660 } 1658 }
1661 } 1659 }
1662 { 1660 {
1663 RawMachineAssemblerTester<void> m; 1661 RawMachineAssemblerTester<void> m;
1664 const Operator* shops[] = {m.machine()->Word32Sar(), 1662 const Operator* shops[] = {m.machine()->Word32Sar(),
1665 m.machine()->Word32Shl(), 1663 m.machine()->Word32Shl(),
1666 m.machine()->Word32Shr()}; 1664 m.machine()->Word32Shr()};
1667 for (size_t n = 0; n < arraysize(shops); n++) { 1665 for (size_t n = 0; n < arraysize(shops); n++) {
1668 RawMachineAssemblerTester<int32_t> m(kMachUint32, kMachInt32, 1666 RawMachineAssemblerTester<int32_t> m(kMachUint32, kMachInt32,
1669 kMachUint32); 1667 kMachUint32);
1670 MLabel blocka, blockb; 1668 RawLabel blocka, blockb;
1671 m.Branch(m.Word32Equal(m.Int32Sub(m.Parameter(0), 1669 m.Branch(m.Word32Equal(m.Int32Sub(m.Parameter(0),
1672 m.AddNode(shops[n], m.Parameter(1), 1670 m.AddNode(shops[n], m.Parameter(1),
1673 m.Parameter(2))), 1671 m.Parameter(2))),
1674 m.Int32Constant(0)), 1672 m.Int32Constant(0)),
1675 &blocka, &blockb); 1673 &blocka, &blockb);
1676 m.Bind(&blocka); 1674 m.Bind(&blocka);
1677 m.Return(m.Int32Constant(constant)); 1675 m.Return(m.Int32Constant(constant));
1678 m.Bind(&blockb); 1676 m.Bind(&blockb);
1679 m.Return(m.Int32Constant(0 - constant)); 1677 m.Return(m.Int32Constant(0 - constant));
1680 FOR_UINT32_INPUTS(i) { 1678 FOR_UINT32_INPUTS(i) {
(...skipping 572 matching lines...) Expand 10 before | Expand all | Expand 10 after
2253 } 2251 }
2254 } 2252 }
2255 } 2253 }
2256 2254
2257 2255
2258 TEST(RunWord32AndInBranch) { 2256 TEST(RunWord32AndInBranch) {
2259 static const int constant = 987654321; 2257 static const int constant = 987654321;
2260 { 2258 {
2261 RawMachineAssemblerTester<int32_t> m; 2259 RawMachineAssemblerTester<int32_t> m;
2262 Int32BinopTester bt(&m); 2260 Int32BinopTester bt(&m);
2263 MLabel blocka, blockb; 2261 RawLabel blocka, blockb;
2264 m.Branch( 2262 m.Branch(
2265 m.Word32Equal(m.Word32And(bt.param0, bt.param1), m.Int32Constant(0)), 2263 m.Word32Equal(m.Word32And(bt.param0, bt.param1), m.Int32Constant(0)),
2266 &blocka, &blockb); 2264 &blocka, &blockb);
2267 m.Bind(&blocka); 2265 m.Bind(&blocka);
2268 bt.AddReturn(m.Int32Constant(constant)); 2266 bt.AddReturn(m.Int32Constant(constant));
2269 m.Bind(&blockb); 2267 m.Bind(&blockb);
2270 bt.AddReturn(m.Int32Constant(0 - constant)); 2268 bt.AddReturn(m.Int32Constant(0 - constant));
2271 FOR_UINT32_INPUTS(i) { 2269 FOR_UINT32_INPUTS(i) {
2272 FOR_UINT32_INPUTS(j) { 2270 FOR_UINT32_INPUTS(j) {
2273 int32_t expected = (*i & *j) == 0 ? constant : 0 - constant; 2271 int32_t expected = (*i & *j) == 0 ? constant : 0 - constant;
2274 CHECK_EQ(expected, bt.call(*i, *j)); 2272 CHECK_EQ(expected, bt.call(*i, *j));
2275 } 2273 }
2276 } 2274 }
2277 } 2275 }
2278 { 2276 {
2279 RawMachineAssemblerTester<int32_t> m; 2277 RawMachineAssemblerTester<int32_t> m;
2280 Int32BinopTester bt(&m); 2278 Int32BinopTester bt(&m);
2281 MLabel blocka, blockb; 2279 RawLabel blocka, blockb;
2282 m.Branch( 2280 m.Branch(
2283 m.Word32NotEqual(m.Word32And(bt.param0, bt.param1), m.Int32Constant(0)), 2281 m.Word32NotEqual(m.Word32And(bt.param0, bt.param1), m.Int32Constant(0)),
2284 &blocka, &blockb); 2282 &blocka, &blockb);
2285 m.Bind(&blocka); 2283 m.Bind(&blocka);
2286 bt.AddReturn(m.Int32Constant(constant)); 2284 bt.AddReturn(m.Int32Constant(constant));
2287 m.Bind(&blockb); 2285 m.Bind(&blockb);
2288 bt.AddReturn(m.Int32Constant(0 - constant)); 2286 bt.AddReturn(m.Int32Constant(0 - constant));
2289 FOR_UINT32_INPUTS(i) { 2287 FOR_UINT32_INPUTS(i) {
2290 FOR_UINT32_INPUTS(j) { 2288 FOR_UINT32_INPUTS(j) {
2291 int32_t expected = (*i & *j) != 0 ? constant : 0 - constant; 2289 int32_t expected = (*i & *j) != 0 ? constant : 0 - constant;
2292 CHECK_EQ(expected, bt.call(*i, *j)); 2290 CHECK_EQ(expected, bt.call(*i, *j));
2293 } 2291 }
2294 } 2292 }
2295 } 2293 }
2296 { 2294 {
2297 FOR_UINT32_INPUTS(i) { 2295 FOR_UINT32_INPUTS(i) {
2298 RawMachineAssemblerTester<int32_t> m(kMachUint32); 2296 RawMachineAssemblerTester<int32_t> m(kMachUint32);
2299 MLabel blocka, blockb; 2297 RawLabel blocka, blockb;
2300 m.Branch(m.Word32Equal(m.Word32And(m.Int32Constant(*i), m.Parameter(0)), 2298 m.Branch(m.Word32Equal(m.Word32And(m.Int32Constant(*i), m.Parameter(0)),
2301 m.Int32Constant(0)), 2299 m.Int32Constant(0)),
2302 &blocka, &blockb); 2300 &blocka, &blockb);
2303 m.Bind(&blocka); 2301 m.Bind(&blocka);
2304 m.Return(m.Int32Constant(constant)); 2302 m.Return(m.Int32Constant(constant));
2305 m.Bind(&blockb); 2303 m.Bind(&blockb);
2306 m.Return(m.Int32Constant(0 - constant)); 2304 m.Return(m.Int32Constant(0 - constant));
2307 FOR_UINT32_INPUTS(j) { 2305 FOR_UINT32_INPUTS(j) {
2308 int32_t expected = (*i & *j) == 0 ? constant : 0 - constant; 2306 int32_t expected = (*i & *j) == 0 ? constant : 0 - constant;
2309 CHECK_EQ(expected, m.Call(*j)); 2307 CHECK_EQ(expected, m.Call(*j));
2310 } 2308 }
2311 } 2309 }
2312 } 2310 }
2313 { 2311 {
2314 FOR_UINT32_INPUTS(i) { 2312 FOR_UINT32_INPUTS(i) {
2315 RawMachineAssemblerTester<int32_t> m(kMachUint32); 2313 RawMachineAssemblerTester<int32_t> m(kMachUint32);
2316 MLabel blocka, blockb; 2314 RawLabel blocka, blockb;
2317 m.Branch( 2315 m.Branch(
2318 m.Word32NotEqual(m.Word32And(m.Int32Constant(*i), m.Parameter(0)), 2316 m.Word32NotEqual(m.Word32And(m.Int32Constant(*i), m.Parameter(0)),
2319 m.Int32Constant(0)), 2317 m.Int32Constant(0)),
2320 &blocka, &blockb); 2318 &blocka, &blockb);
2321 m.Bind(&blocka); 2319 m.Bind(&blocka);
2322 m.Return(m.Int32Constant(constant)); 2320 m.Return(m.Int32Constant(constant));
2323 m.Bind(&blockb); 2321 m.Bind(&blockb);
2324 m.Return(m.Int32Constant(0 - constant)); 2322 m.Return(m.Int32Constant(0 - constant));
2325 FOR_UINT32_INPUTS(j) { 2323 FOR_UINT32_INPUTS(j) {
2326 int32_t expected = (*i & *j) != 0 ? constant : 0 - constant; 2324 int32_t expected = (*i & *j) != 0 ? constant : 0 - constant;
2327 CHECK_EQ(expected, m.Call(*j)); 2325 CHECK_EQ(expected, m.Call(*j));
2328 } 2326 }
2329 } 2327 }
2330 } 2328 }
2331 { 2329 {
2332 RawMachineAssemblerTester<void> m; 2330 RawMachineAssemblerTester<void> m;
2333 const Operator* shops[] = {m.machine()->Word32Sar(), 2331 const Operator* shops[] = {m.machine()->Word32Sar(),
2334 m.machine()->Word32Shl(), 2332 m.machine()->Word32Shl(),
2335 m.machine()->Word32Shr()}; 2333 m.machine()->Word32Shr()};
2336 for (size_t n = 0; n < arraysize(shops); n++) { 2334 for (size_t n = 0; n < arraysize(shops); n++) {
2337 RawMachineAssemblerTester<int32_t> m(kMachUint32, kMachInt32, 2335 RawMachineAssemblerTester<int32_t> m(kMachUint32, kMachInt32,
2338 kMachUint32); 2336 kMachUint32);
2339 MLabel blocka, blockb; 2337 RawLabel blocka, blockb;
2340 m.Branch(m.Word32Equal(m.Word32And(m.Parameter(0), 2338 m.Branch(m.Word32Equal(m.Word32And(m.Parameter(0),
2341 m.AddNode(shops[n], m.Parameter(1), 2339 m.AddNode(shops[n], m.Parameter(1),
2342 m.Parameter(2))), 2340 m.Parameter(2))),
2343 m.Int32Constant(0)), 2341 m.Int32Constant(0)),
2344 &blocka, &blockb); 2342 &blocka, &blockb);
2345 m.Bind(&blocka); 2343 m.Bind(&blocka);
2346 m.Return(m.Int32Constant(constant)); 2344 m.Return(m.Int32Constant(constant));
2347 m.Bind(&blockb); 2345 m.Bind(&blockb);
2348 m.Return(m.Int32Constant(0 - constant)); 2346 m.Return(m.Int32Constant(0 - constant));
2349 FOR_UINT32_INPUTS(i) { 2347 FOR_UINT32_INPUTS(i) {
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
2482 } 2480 }
2483 } 2481 }
2484 } 2482 }
2485 2483
2486 2484
2487 TEST(RunWord32OrInBranch) { 2485 TEST(RunWord32OrInBranch) {
2488 static const int constant = 987654321; 2486 static const int constant = 987654321;
2489 { 2487 {
2490 RawMachineAssemblerTester<int32_t> m; 2488 RawMachineAssemblerTester<int32_t> m;
2491 Int32BinopTester bt(&m); 2489 Int32BinopTester bt(&m);
2492 MLabel blocka, blockb; 2490 RawLabel blocka, blockb;
2493 m.Branch( 2491 m.Branch(
2494 m.Word32Equal(m.Word32Or(bt.param0, bt.param1), m.Int32Constant(0)), 2492 m.Word32Equal(m.Word32Or(bt.param0, bt.param1), m.Int32Constant(0)),
2495 &blocka, &blockb); 2493 &blocka, &blockb);
2496 m.Bind(&blocka); 2494 m.Bind(&blocka);
2497 bt.AddReturn(m.Int32Constant(constant)); 2495 bt.AddReturn(m.Int32Constant(constant));
2498 m.Bind(&blockb); 2496 m.Bind(&blockb);
2499 bt.AddReturn(m.Int32Constant(0 - constant)); 2497 bt.AddReturn(m.Int32Constant(0 - constant));
2500 FOR_INT32_INPUTS(i) { 2498 FOR_INT32_INPUTS(i) {
2501 FOR_INT32_INPUTS(j) { 2499 FOR_INT32_INPUTS(j) {
2502 int32_t expected = (*i | *j) == 0 ? constant : 0 - constant; 2500 int32_t expected = (*i | *j) == 0 ? constant : 0 - constant;
2503 CHECK_EQ(expected, bt.call(*i, *j)); 2501 CHECK_EQ(expected, bt.call(*i, *j));
2504 } 2502 }
2505 } 2503 }
2506 } 2504 }
2507 { 2505 {
2508 RawMachineAssemblerTester<int32_t> m; 2506 RawMachineAssemblerTester<int32_t> m;
2509 Int32BinopTester bt(&m); 2507 Int32BinopTester bt(&m);
2510 MLabel blocka, blockb; 2508 RawLabel blocka, blockb;
2511 m.Branch( 2509 m.Branch(
2512 m.Word32NotEqual(m.Word32Or(bt.param0, bt.param1), m.Int32Constant(0)), 2510 m.Word32NotEqual(m.Word32Or(bt.param0, bt.param1), m.Int32Constant(0)),
2513 &blocka, &blockb); 2511 &blocka, &blockb);
2514 m.Bind(&blocka); 2512 m.Bind(&blocka);
2515 bt.AddReturn(m.Int32Constant(constant)); 2513 bt.AddReturn(m.Int32Constant(constant));
2516 m.Bind(&blockb); 2514 m.Bind(&blockb);
2517 bt.AddReturn(m.Int32Constant(0 - constant)); 2515 bt.AddReturn(m.Int32Constant(0 - constant));
2518 FOR_INT32_INPUTS(i) { 2516 FOR_INT32_INPUTS(i) {
2519 FOR_INT32_INPUTS(j) { 2517 FOR_INT32_INPUTS(j) {
2520 int32_t expected = (*i | *j) != 0 ? constant : 0 - constant; 2518 int32_t expected = (*i | *j) != 0 ? constant : 0 - constant;
2521 CHECK_EQ(expected, bt.call(*i, *j)); 2519 CHECK_EQ(expected, bt.call(*i, *j));
2522 } 2520 }
2523 } 2521 }
2524 } 2522 }
2525 { 2523 {
2526 FOR_INT32_INPUTS(i) { 2524 FOR_INT32_INPUTS(i) {
2527 RawMachineAssemblerTester<int32_t> m(kMachInt32); 2525 RawMachineAssemblerTester<int32_t> m(kMachInt32);
2528 MLabel blocka, blockb; 2526 RawLabel blocka, blockb;
2529 m.Branch(m.Word32Equal(m.Word32Or(m.Int32Constant(*i), m.Parameter(0)), 2527 m.Branch(m.Word32Equal(m.Word32Or(m.Int32Constant(*i), m.Parameter(0)),
2530 m.Int32Constant(0)), 2528 m.Int32Constant(0)),
2531 &blocka, &blockb); 2529 &blocka, &blockb);
2532 m.Bind(&blocka); 2530 m.Bind(&blocka);
2533 m.Return(m.Int32Constant(constant)); 2531 m.Return(m.Int32Constant(constant));
2534 m.Bind(&blockb); 2532 m.Bind(&blockb);
2535 m.Return(m.Int32Constant(0 - constant)); 2533 m.Return(m.Int32Constant(0 - constant));
2536 FOR_INT32_INPUTS(j) { 2534 FOR_INT32_INPUTS(j) {
2537 int32_t expected = (*i | *j) == 0 ? constant : 0 - constant; 2535 int32_t expected = (*i | *j) == 0 ? constant : 0 - constant;
2538 CHECK_EQ(expected, m.Call(*j)); 2536 CHECK_EQ(expected, m.Call(*j));
2539 } 2537 }
2540 } 2538 }
2541 } 2539 }
2542 { 2540 {
2543 FOR_INT32_INPUTS(i) { 2541 FOR_INT32_INPUTS(i) {
2544 RawMachineAssemblerTester<int32_t> m(kMachInt32); 2542 RawMachineAssemblerTester<int32_t> m(kMachInt32);
2545 MLabel blocka, blockb; 2543 RawLabel blocka, blockb;
2546 m.Branch(m.Word32NotEqual(m.Word32Or(m.Int32Constant(*i), m.Parameter(0)), 2544 m.Branch(m.Word32NotEqual(m.Word32Or(m.Int32Constant(*i), m.Parameter(0)),
2547 m.Int32Constant(0)), 2545 m.Int32Constant(0)),
2548 &blocka, &blockb); 2546 &blocka, &blockb);
2549 m.Bind(&blocka); 2547 m.Bind(&blocka);
2550 m.Return(m.Int32Constant(constant)); 2548 m.Return(m.Int32Constant(constant));
2551 m.Bind(&blockb); 2549 m.Bind(&blockb);
2552 m.Return(m.Int32Constant(0 - constant)); 2550 m.Return(m.Int32Constant(0 - constant));
2553 FOR_INT32_INPUTS(j) { 2551 FOR_INT32_INPUTS(j) {
2554 int32_t expected = (*i | *j) != 0 ? constant : 0 - constant; 2552 int32_t expected = (*i | *j) != 0 ? constant : 0 - constant;
2555 CHECK_EQ(expected, m.Call(*j)); 2553 CHECK_EQ(expected, m.Call(*j));
2556 } 2554 }
2557 } 2555 }
2558 } 2556 }
2559 { 2557 {
2560 RawMachineAssemblerTester<void> m; 2558 RawMachineAssemblerTester<void> m;
2561 const Operator* shops[] = {m.machine()->Word32Sar(), 2559 const Operator* shops[] = {m.machine()->Word32Sar(),
2562 m.machine()->Word32Shl(), 2560 m.machine()->Word32Shl(),
2563 m.machine()->Word32Shr()}; 2561 m.machine()->Word32Shr()};
2564 for (size_t n = 0; n < arraysize(shops); n++) { 2562 for (size_t n = 0; n < arraysize(shops); n++) {
2565 RawMachineAssemblerTester<int32_t> m(kMachUint32, kMachInt32, 2563 RawMachineAssemblerTester<int32_t> m(kMachUint32, kMachInt32,
2566 kMachUint32); 2564 kMachUint32);
2567 MLabel blocka, blockb; 2565 RawLabel blocka, blockb;
2568 m.Branch(m.Word32Equal(m.Word32Or(m.Parameter(0), 2566 m.Branch(m.Word32Equal(m.Word32Or(m.Parameter(0),
2569 m.AddNode(shops[n], m.Parameter(1), 2567 m.AddNode(shops[n], m.Parameter(1),
2570 m.Parameter(2))), 2568 m.Parameter(2))),
2571 m.Int32Constant(0)), 2569 m.Int32Constant(0)),
2572 &blocka, &blockb); 2570 &blocka, &blockb);
2573 m.Bind(&blocka); 2571 m.Bind(&blocka);
2574 m.Return(m.Int32Constant(constant)); 2572 m.Return(m.Int32Constant(constant));
2575 m.Bind(&blockb); 2573 m.Bind(&blockb);
2576 m.Return(m.Int32Constant(0 - constant)); 2574 m.Return(m.Int32Constant(0 - constant));
2577 FOR_UINT32_INPUTS(i) { 2575 FOR_UINT32_INPUTS(i) {
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
2706 } 2704 }
2707 } 2705 }
2708 } 2706 }
2709 2707
2710 2708
2711 TEST(RunWord32XorInBranch) { 2709 TEST(RunWord32XorInBranch) {
2712 static const uint32_t constant = 987654321; 2710 static const uint32_t constant = 987654321;
2713 { 2711 {
2714 RawMachineAssemblerTester<int32_t> m; 2712 RawMachineAssemblerTester<int32_t> m;
2715 Uint32BinopTester bt(&m); 2713 Uint32BinopTester bt(&m);
2716 MLabel blocka, blockb; 2714 RawLabel blocka, blockb;
2717 m.Branch( 2715 m.Branch(
2718 m.Word32Equal(m.Word32Xor(bt.param0, bt.param1), m.Int32Constant(0)), 2716 m.Word32Equal(m.Word32Xor(bt.param0, bt.param1), m.Int32Constant(0)),
2719 &blocka, &blockb); 2717 &blocka, &blockb);
2720 m.Bind(&blocka); 2718 m.Bind(&blocka);
2721 bt.AddReturn(m.Int32Constant(constant)); 2719 bt.AddReturn(m.Int32Constant(constant));
2722 m.Bind(&blockb); 2720 m.Bind(&blockb);
2723 bt.AddReturn(m.Int32Constant(0 - constant)); 2721 bt.AddReturn(m.Int32Constant(0 - constant));
2724 FOR_UINT32_INPUTS(i) { 2722 FOR_UINT32_INPUTS(i) {
2725 FOR_UINT32_INPUTS(j) { 2723 FOR_UINT32_INPUTS(j) {
2726 uint32_t expected = (*i ^ *j) == 0 ? constant : 0 - constant; 2724 uint32_t expected = (*i ^ *j) == 0 ? constant : 0 - constant;
2727 CHECK_EQ(expected, bt.call(*i, *j)); 2725 CHECK_EQ(expected, bt.call(*i, *j));
2728 } 2726 }
2729 } 2727 }
2730 } 2728 }
2731 { 2729 {
2732 RawMachineAssemblerTester<int32_t> m; 2730 RawMachineAssemblerTester<int32_t> m;
2733 Uint32BinopTester bt(&m); 2731 Uint32BinopTester bt(&m);
2734 MLabel blocka, blockb; 2732 RawLabel blocka, blockb;
2735 m.Branch( 2733 m.Branch(
2736 m.Word32NotEqual(m.Word32Xor(bt.param0, bt.param1), m.Int32Constant(0)), 2734 m.Word32NotEqual(m.Word32Xor(bt.param0, bt.param1), m.Int32Constant(0)),
2737 &blocka, &blockb); 2735 &blocka, &blockb);
2738 m.Bind(&blocka); 2736 m.Bind(&blocka);
2739 bt.AddReturn(m.Int32Constant(constant)); 2737 bt.AddReturn(m.Int32Constant(constant));
2740 m.Bind(&blockb); 2738 m.Bind(&blockb);
2741 bt.AddReturn(m.Int32Constant(0 - constant)); 2739 bt.AddReturn(m.Int32Constant(0 - constant));
2742 FOR_UINT32_INPUTS(i) { 2740 FOR_UINT32_INPUTS(i) {
2743 FOR_UINT32_INPUTS(j) { 2741 FOR_UINT32_INPUTS(j) {
2744 uint32_t expected = (*i ^ *j) != 0 ? constant : 0 - constant; 2742 uint32_t expected = (*i ^ *j) != 0 ? constant : 0 - constant;
2745 CHECK_EQ(expected, bt.call(*i, *j)); 2743 CHECK_EQ(expected, bt.call(*i, *j));
2746 } 2744 }
2747 } 2745 }
2748 } 2746 }
2749 { 2747 {
2750 FOR_UINT32_INPUTS(i) { 2748 FOR_UINT32_INPUTS(i) {
2751 RawMachineAssemblerTester<uint32_t> m(kMachUint32); 2749 RawMachineAssemblerTester<uint32_t> m(kMachUint32);
2752 MLabel blocka, blockb; 2750 RawLabel blocka, blockb;
2753 m.Branch(m.Word32Equal(m.Word32Xor(m.Int32Constant(*i), m.Parameter(0)), 2751 m.Branch(m.Word32Equal(m.Word32Xor(m.Int32Constant(*i), m.Parameter(0)),
2754 m.Int32Constant(0)), 2752 m.Int32Constant(0)),
2755 &blocka, &blockb); 2753 &blocka, &blockb);
2756 m.Bind(&blocka); 2754 m.Bind(&blocka);
2757 m.Return(m.Int32Constant(constant)); 2755 m.Return(m.Int32Constant(constant));
2758 m.Bind(&blockb); 2756 m.Bind(&blockb);
2759 m.Return(m.Int32Constant(0 - constant)); 2757 m.Return(m.Int32Constant(0 - constant));
2760 FOR_UINT32_INPUTS(j) { 2758 FOR_UINT32_INPUTS(j) {
2761 uint32_t expected = (*i ^ *j) == 0 ? constant : 0 - constant; 2759 uint32_t expected = (*i ^ *j) == 0 ? constant : 0 - constant;
2762 CHECK_EQ(expected, m.Call(*j)); 2760 CHECK_EQ(expected, m.Call(*j));
2763 } 2761 }
2764 } 2762 }
2765 } 2763 }
2766 { 2764 {
2767 FOR_UINT32_INPUTS(i) { 2765 FOR_UINT32_INPUTS(i) {
2768 RawMachineAssemblerTester<uint32_t> m(kMachUint32); 2766 RawMachineAssemblerTester<uint32_t> m(kMachUint32);
2769 MLabel blocka, blockb; 2767 RawLabel blocka, blockb;
2770 m.Branch( 2768 m.Branch(
2771 m.Word32NotEqual(m.Word32Xor(m.Int32Constant(*i), m.Parameter(0)), 2769 m.Word32NotEqual(m.Word32Xor(m.Int32Constant(*i), m.Parameter(0)),
2772 m.Int32Constant(0)), 2770 m.Int32Constant(0)),
2773 &blocka, &blockb); 2771 &blocka, &blockb);
2774 m.Bind(&blocka); 2772 m.Bind(&blocka);
2775 m.Return(m.Int32Constant(constant)); 2773 m.Return(m.Int32Constant(constant));
2776 m.Bind(&blockb); 2774 m.Bind(&blockb);
2777 m.Return(m.Int32Constant(0 - constant)); 2775 m.Return(m.Int32Constant(0 - constant));
2778 FOR_UINT32_INPUTS(j) { 2776 FOR_UINT32_INPUTS(j) {
2779 uint32_t expected = (*i ^ *j) != 0 ? constant : 0 - constant; 2777 uint32_t expected = (*i ^ *j) != 0 ? constant : 0 - constant;
2780 CHECK_EQ(expected, m.Call(*j)); 2778 CHECK_EQ(expected, m.Call(*j));
2781 } 2779 }
2782 } 2780 }
2783 } 2781 }
2784 { 2782 {
2785 RawMachineAssemblerTester<void> m; 2783 RawMachineAssemblerTester<void> m;
2786 const Operator* shops[] = {m.machine()->Word32Sar(), 2784 const Operator* shops[] = {m.machine()->Word32Sar(),
2787 m.machine()->Word32Shl(), 2785 m.machine()->Word32Shl(),
2788 m.machine()->Word32Shr()}; 2786 m.machine()->Word32Shr()};
2789 for (size_t n = 0; n < arraysize(shops); n++) { 2787 for (size_t n = 0; n < arraysize(shops); n++) {
2790 RawMachineAssemblerTester<int32_t> m(kMachUint32, kMachInt32, 2788 RawMachineAssemblerTester<int32_t> m(kMachUint32, kMachInt32,
2791 kMachUint32); 2789 kMachUint32);
2792 MLabel blocka, blockb; 2790 RawLabel blocka, blockb;
2793 m.Branch(m.Word32Equal(m.Word32Xor(m.Parameter(0), 2791 m.Branch(m.Word32Equal(m.Word32Xor(m.Parameter(0),
2794 m.AddNode(shops[n], m.Parameter(1), 2792 m.AddNode(shops[n], m.Parameter(1),
2795 m.Parameter(2))), 2793 m.Parameter(2))),
2796 m.Int32Constant(0)), 2794 m.Int32Constant(0)),
2797 &blocka, &blockb); 2795 &blocka, &blockb);
2798 m.Bind(&blocka); 2796 m.Bind(&blocka);
2799 m.Return(m.Int32Constant(constant)); 2797 m.Return(m.Int32Constant(constant));
2800 m.Bind(&blockb); 2798 m.Bind(&blockb);
2801 m.Return(m.Int32Constant(0 - constant)); 2799 m.Return(m.Int32Constant(0 - constant));
2802 FOR_UINT32_INPUTS(i) { 2800 FOR_UINT32_INPUTS(i) {
(...skipping 1157 matching lines...) Expand 10 before | Expand all | Expand 10 after
3960 CHECK_EQ(magic, m.Call()); 3958 CHECK_EQ(magic, m.Call());
3961 } 3959 }
3962 3960
3963 3961
3964 TEST(RunLoopPhiInduction2) { 3962 TEST(RunLoopPhiInduction2) {
3965 RawMachineAssemblerTester<int32_t> m; 3963 RawMachineAssemblerTester<int32_t> m;
3966 3964
3967 int false_val = 0x10777; 3965 int false_val = 0x10777;
3968 3966
3969 // x = false_val; while(false) { x++; } return x; 3967 // x = false_val; while(false) { x++; } return x;
3970 MLabel header, body, end; 3968 RawLabel header, body, end;
3971 Node* false_node = m.Int32Constant(false_val); 3969 Node* false_node = m.Int32Constant(false_val);
3972 m.Goto(&header); 3970 m.Goto(&header);
3973 m.Bind(&header); 3971 m.Bind(&header);
3974 Node* phi = m.Phi(kMachInt32, false_node, false_node); 3972 Node* phi = m.Phi(kMachInt32, false_node, false_node);
3975 m.Branch(m.Int32Constant(0), &body, &end); 3973 m.Branch(m.Int32Constant(0), &body, &end);
3976 m.Bind(&body); 3974 m.Bind(&body);
3977 Node* add = m.Int32Add(phi, m.Int32Constant(1)); 3975 Node* add = m.Int32Add(phi, m.Int32Constant(1));
3978 phi->ReplaceInput(1, add); 3976 phi->ReplaceInput(1, add);
3979 m.Goto(&header); 3977 m.Goto(&header);
3980 m.Bind(&end); 3978 m.Bind(&end);
3981 m.Return(phi); 3979 m.Return(phi);
3982 3980
3983 CHECK_EQ(false_val, m.Call()); 3981 CHECK_EQ(false_val, m.Call());
3984 } 3982 }
3985 3983
3986 3984
3987 TEST(RunFloatDiamond) { 3985 TEST(RunFloatDiamond) {
3988 RawMachineAssemblerTester<int32_t> m; 3986 RawMachineAssemblerTester<int32_t> m;
3989 3987
3990 const int magic = 99645; 3988 const int magic = 99645;
3991 float buffer = 0.1f; 3989 float buffer = 0.1f;
3992 float constant = 99.99f; 3990 float constant = 99.99f;
3993 3991
3994 MLabel blocka, blockb, end; 3992 RawLabel blocka, blockb, end;
3995 Node* k1 = m.Float32Constant(constant); 3993 Node* k1 = m.Float32Constant(constant);
3996 Node* k2 = m.Float32Constant(0 - constant); 3994 Node* k2 = m.Float32Constant(0 - constant);
3997 m.Branch(m.Int32Constant(0), &blocka, &blockb); 3995 m.Branch(m.Int32Constant(0), &blocka, &blockb);
3998 m.Bind(&blocka); 3996 m.Bind(&blocka);
3999 m.Goto(&end); 3997 m.Goto(&end);
4000 m.Bind(&blockb); 3998 m.Bind(&blockb);
4001 m.Goto(&end); 3999 m.Goto(&end);
4002 m.Bind(&end); 4000 m.Bind(&end);
4003 Node* phi = m.Phi(kMachFloat32, k2, k1); 4001 Node* phi = m.Phi(kMachFloat32, k2, k1);
4004 m.Store(kMachFloat32, m.PointerConstant(&buffer), m.IntPtrConstant(0), phi, 4002 m.Store(kMachFloat32, m.PointerConstant(&buffer), m.IntPtrConstant(0), phi,
4005 kNoWriteBarrier); 4003 kNoWriteBarrier);
4006 m.Return(m.Int32Constant(magic)); 4004 m.Return(m.Int32Constant(magic));
4007 4005
4008 CHECK_EQ(magic, m.Call()); 4006 CHECK_EQ(magic, m.Call());
4009 CHECK(constant == buffer); 4007 CHECK(constant == buffer);
4010 } 4008 }
4011 4009
4012 4010
4013 TEST(RunDoubleDiamond) { 4011 TEST(RunDoubleDiamond) {
4014 RawMachineAssemblerTester<int32_t> m; 4012 RawMachineAssemblerTester<int32_t> m;
4015 4013
4016 const int magic = 99645; 4014 const int magic = 99645;
4017 double buffer = 0.1; 4015 double buffer = 0.1;
4018 double constant = 99.99; 4016 double constant = 99.99;
4019 4017
4020 MLabel blocka, blockb, end; 4018 RawLabel blocka, blockb, end;
4021 Node* k1 = m.Float64Constant(constant); 4019 Node* k1 = m.Float64Constant(constant);
4022 Node* k2 = m.Float64Constant(0 - constant); 4020 Node* k2 = m.Float64Constant(0 - constant);
4023 m.Branch(m.Int32Constant(0), &blocka, &blockb); 4021 m.Branch(m.Int32Constant(0), &blocka, &blockb);
4024 m.Bind(&blocka); 4022 m.Bind(&blocka);
4025 m.Goto(&end); 4023 m.Goto(&end);
4026 m.Bind(&blockb); 4024 m.Bind(&blockb);
4027 m.Goto(&end); 4025 m.Goto(&end);
4028 m.Bind(&end); 4026 m.Bind(&end);
4029 Node* phi = m.Phi(kMachFloat64, k2, k1); 4027 Node* phi = m.Phi(kMachFloat64, k2, k1);
4030 m.Store(kMachFloat64, m.PointerConstant(&buffer), m.Int32Constant(0), phi, 4028 m.Store(kMachFloat64, m.PointerConstant(&buffer), m.Int32Constant(0), phi,
4031 kNoWriteBarrier); 4029 kNoWriteBarrier);
4032 m.Return(m.Int32Constant(magic)); 4030 m.Return(m.Int32Constant(magic));
4033 4031
4034 CHECK_EQ(magic, m.Call()); 4032 CHECK_EQ(magic, m.Call());
4035 CHECK_EQ(constant, buffer); 4033 CHECK_EQ(constant, buffer);
4036 } 4034 }
4037 4035
4038 4036
4039 TEST(RunRefDiamond) { 4037 TEST(RunRefDiamond) {
4040 RawMachineAssemblerTester<int32_t> m; 4038 RawMachineAssemblerTester<int32_t> m;
4041 4039
4042 const int magic = 99644; 4040 const int magic = 99644;
4043 Handle<String> rexpected = 4041 Handle<String> rexpected =
4044 CcTest::i_isolate()->factory()->InternalizeUtf8String("A"); 4042 CcTest::i_isolate()->factory()->InternalizeUtf8String("A");
4045 String* buffer; 4043 String* buffer;
4046 4044
4047 MLabel blocka, blockb, end; 4045 RawLabel blocka, blockb, end;
4048 Node* k1 = m.StringConstant("A"); 4046 Node* k1 = m.StringConstant("A");
4049 Node* k2 = m.StringConstant("B"); 4047 Node* k2 = m.StringConstant("B");
4050 m.Branch(m.Int32Constant(0), &blocka, &blockb); 4048 m.Branch(m.Int32Constant(0), &blocka, &blockb);
4051 m.Bind(&blocka); 4049 m.Bind(&blocka);
4052 m.Goto(&end); 4050 m.Goto(&end);
4053 m.Bind(&blockb); 4051 m.Bind(&blockb);
4054 m.Goto(&end); 4052 m.Goto(&end);
4055 m.Bind(&end); 4053 m.Bind(&end);
4056 Node* phi = m.Phi(kMachAnyTagged, k2, k1); 4054 Node* phi = m.Phi(kMachAnyTagged, k2, k1);
4057 m.Store(kMachAnyTagged, m.PointerConstant(&buffer), m.Int32Constant(0), phi, 4055 m.Store(kMachAnyTagged, m.PointerConstant(&buffer), m.Int32Constant(0), phi,
4058 kNoWriteBarrier); 4056 kNoWriteBarrier);
4059 m.Return(m.Int32Constant(magic)); 4057 m.Return(m.Int32Constant(magic));
4060 4058
4061 CHECK_EQ(magic, m.Call()); 4059 CHECK_EQ(magic, m.Call());
4062 CHECK(rexpected->SameValue(buffer)); 4060 CHECK(rexpected->SameValue(buffer));
4063 } 4061 }
4064 4062
4065 4063
4066 TEST(RunDoubleRefDiamond) { 4064 TEST(RunDoubleRefDiamond) {
4067 RawMachineAssemblerTester<int32_t> m; 4065 RawMachineAssemblerTester<int32_t> m;
4068 4066
4069 const int magic = 99648; 4067 const int magic = 99648;
4070 double dbuffer = 0.1; 4068 double dbuffer = 0.1;
4071 double dconstant = 99.99; 4069 double dconstant = 99.99;
4072 Handle<String> rexpected = 4070 Handle<String> rexpected =
4073 CcTest::i_isolate()->factory()->InternalizeUtf8String("AX"); 4071 CcTest::i_isolate()->factory()->InternalizeUtf8String("AX");
4074 String* rbuffer; 4072 String* rbuffer;
4075 4073
4076 MLabel blocka, blockb, end; 4074 RawLabel blocka, blockb, end;
4077 Node* d1 = m.Float64Constant(dconstant); 4075 Node* d1 = m.Float64Constant(dconstant);
4078 Node* d2 = m.Float64Constant(0 - dconstant); 4076 Node* d2 = m.Float64Constant(0 - dconstant);
4079 Node* r1 = m.StringConstant("AX"); 4077 Node* r1 = m.StringConstant("AX");
4080 Node* r2 = m.StringConstant("BX"); 4078 Node* r2 = m.StringConstant("BX");
4081 m.Branch(m.Int32Constant(0), &blocka, &blockb); 4079 m.Branch(m.Int32Constant(0), &blocka, &blockb);
4082 m.Bind(&blocka); 4080 m.Bind(&blocka);
4083 m.Goto(&end); 4081 m.Goto(&end);
4084 m.Bind(&blockb); 4082 m.Bind(&blockb);
4085 m.Goto(&end); 4083 m.Goto(&end);
4086 m.Bind(&end); 4084 m.Bind(&end);
(...skipping 14 matching lines...) Expand all
4101 TEST(RunDoubleRefDoubleDiamond) { 4099 TEST(RunDoubleRefDoubleDiamond) {
4102 RawMachineAssemblerTester<int32_t> m; 4100 RawMachineAssemblerTester<int32_t> m;
4103 4101
4104 const int magic = 99649; 4102 const int magic = 99649;
4105 double dbuffer = 0.1; 4103 double dbuffer = 0.1;
4106 double dconstant = 99.997; 4104 double dconstant = 99.997;
4107 Handle<String> rexpected = 4105 Handle<String> rexpected =
4108 CcTest::i_isolate()->factory()->InternalizeUtf8String("AD"); 4106 CcTest::i_isolate()->factory()->InternalizeUtf8String("AD");
4109 String* rbuffer; 4107 String* rbuffer;
4110 4108
4111 MLabel blocka, blockb, mid, blockd, blocke, end; 4109 RawLabel blocka, blockb, mid, blockd, blocke, end;
4112 Node* d1 = m.Float64Constant(dconstant); 4110 Node* d1 = m.Float64Constant(dconstant);
4113 Node* d2 = m.Float64Constant(0 - dconstant); 4111 Node* d2 = m.Float64Constant(0 - dconstant);
4114 Node* r1 = m.StringConstant("AD"); 4112 Node* r1 = m.StringConstant("AD");
4115 Node* r2 = m.StringConstant("BD"); 4113 Node* r2 = m.StringConstant("BD");
4116 m.Branch(m.Int32Constant(0), &blocka, &blockb); 4114 m.Branch(m.Int32Constant(0), &blocka, &blockb);
4117 m.Bind(&blocka); 4115 m.Bind(&blocka);
4118 m.Goto(&mid); 4116 m.Goto(&mid);
4119 m.Bind(&blockb); 4117 m.Bind(&blockb);
4120 m.Goto(&mid); 4118 m.Goto(&mid);
4121 m.Bind(&mid); 4119 m.Bind(&mid);
(...skipping 16 matching lines...) Expand all
4138 m.Return(m.Int32Constant(magic)); 4136 m.Return(m.Int32Constant(magic));
4139 4137
4140 CHECK_EQ(magic, m.Call()); 4138 CHECK_EQ(magic, m.Call());
4141 CHECK_EQ(dconstant, dbuffer); 4139 CHECK_EQ(dconstant, dbuffer);
4142 CHECK(rexpected->SameValue(rbuffer)); 4140 CHECK(rexpected->SameValue(rbuffer));
4143 } 4141 }
4144 4142
4145 4143
4146 TEST(RunDoubleLoopPhi) { 4144 TEST(RunDoubleLoopPhi) {
4147 RawMachineAssemblerTester<int32_t> m; 4145 RawMachineAssemblerTester<int32_t> m;
4148 MLabel header, body, end; 4146 RawLabel header, body, end;
4149 4147
4150 int magic = 99773; 4148 int magic = 99773;
4151 double buffer = 0.99; 4149 double buffer = 0.99;
4152 double dconstant = 777.1; 4150 double dconstant = 777.1;
4153 4151
4154 Node* zero = m.Int32Constant(0); 4152 Node* zero = m.Int32Constant(0);
4155 Node* dk = m.Float64Constant(dconstant); 4153 Node* dk = m.Float64Constant(dconstant);
4156 4154
4157 m.Goto(&header); 4155 m.Goto(&header);
4158 m.Bind(&header); 4156 m.Bind(&header);
(...skipping 11 matching lines...) Expand all
4170 } 4168 }
4171 4169
4172 4170
4173 TEST(RunCountToTenAccRaw) { 4171 TEST(RunCountToTenAccRaw) {
4174 RawMachineAssemblerTester<int32_t> m; 4172 RawMachineAssemblerTester<int32_t> m;
4175 4173
4176 Node* zero = m.Int32Constant(0); 4174 Node* zero = m.Int32Constant(0);
4177 Node* ten = m.Int32Constant(10); 4175 Node* ten = m.Int32Constant(10);
4178 Node* one = m.Int32Constant(1); 4176 Node* one = m.Int32Constant(1);
4179 4177
4180 MLabel header, body, body_cont, end; 4178 RawLabel header, body, body_cont, end;
4181 4179
4182 m.Goto(&header); 4180 m.Goto(&header);
4183 4181
4184 m.Bind(&header); 4182 m.Bind(&header);
4185 Node* i = m.Phi(kMachInt32, zero, zero); 4183 Node* i = m.Phi(kMachInt32, zero, zero);
4186 Node* j = m.Phi(kMachInt32, zero, zero); 4184 Node* j = m.Phi(kMachInt32, zero, zero);
4187 m.Goto(&body); 4185 m.Goto(&body);
4188 4186
4189 m.Bind(&body); 4187 m.Bind(&body);
4190 Node* next_i = m.Int32Add(i, one); 4188 Node* next_i = m.Int32Add(i, one);
(...skipping 12 matching lines...) Expand all
4203 } 4201 }
4204 4202
4205 4203
4206 TEST(RunCountToTenAccRaw2) { 4204 TEST(RunCountToTenAccRaw2) {
4207 RawMachineAssemblerTester<int32_t> m; 4205 RawMachineAssemblerTester<int32_t> m;
4208 4206
4209 Node* zero = m.Int32Constant(0); 4207 Node* zero = m.Int32Constant(0);
4210 Node* ten = m.Int32Constant(10); 4208 Node* ten = m.Int32Constant(10);
4211 Node* one = m.Int32Constant(1); 4209 Node* one = m.Int32Constant(1);
4212 4210
4213 MLabel header, body, body_cont, end; 4211 RawLabel header, body, body_cont, end;
4214 4212
4215 m.Goto(&header); 4213 m.Goto(&header);
4216 4214
4217 m.Bind(&header); 4215 m.Bind(&header);
4218 Node* i = m.Phi(kMachInt32, zero, zero); 4216 Node* i = m.Phi(kMachInt32, zero, zero);
4219 Node* j = m.Phi(kMachInt32, zero, zero); 4217 Node* j = m.Phi(kMachInt32, zero, zero);
4220 Node* k = m.Phi(kMachInt32, zero, zero); 4218 Node* k = m.Phi(kMachInt32, zero, zero);
4221 m.Goto(&body); 4219 m.Goto(&body);
4222 4220
4223 m.Bind(&body); 4221 m.Bind(&body);
(...skipping 409 matching lines...) Expand 10 before | Expand all | Expand 10 after
4633 4631
4634 TEST(RunNewSpaceConstantsInPhi) { 4632 TEST(RunNewSpaceConstantsInPhi) {
4635 RawMachineAssemblerTester<Object*> m(kMachInt32); 4633 RawMachineAssemblerTester<Object*> m(kMachInt32);
4636 4634
4637 Isolate* isolate = CcTest::i_isolate(); 4635 Isolate* isolate = CcTest::i_isolate();
4638 Handle<HeapNumber> true_val = isolate->factory()->NewHeapNumber(11.2); 4636 Handle<HeapNumber> true_val = isolate->factory()->NewHeapNumber(11.2);
4639 Handle<HeapNumber> false_val = isolate->factory()->NewHeapNumber(11.3); 4637 Handle<HeapNumber> false_val = isolate->factory()->NewHeapNumber(11.3);
4640 Node* true_node = m.HeapConstant(true_val); 4638 Node* true_node = m.HeapConstant(true_val);
4641 Node* false_node = m.HeapConstant(false_val); 4639 Node* false_node = m.HeapConstant(false_val);
4642 4640
4643 MLabel blocka, blockb, end; 4641 RawLabel blocka, blockb, end;
4644 m.Branch(m.Parameter(0), &blocka, &blockb); 4642 m.Branch(m.Parameter(0), &blocka, &blockb);
4645 m.Bind(&blocka); 4643 m.Bind(&blocka);
4646 m.Goto(&end); 4644 m.Goto(&end);
4647 m.Bind(&blockb); 4645 m.Bind(&blockb);
4648 m.Goto(&end); 4646 m.Goto(&end);
4649 4647
4650 m.Bind(&end); 4648 m.Bind(&end);
4651 Node* phi = m.Phi(kMachAnyTagged, true_node, false_node); 4649 Node* phi = m.Phi(kMachAnyTagged, true_node, false_node);
4652 m.Return(phi); 4650 m.Return(phi);
4653 4651
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
4716 int expected_ovf = bits::SignedAddOverflow32(*i, *j, &expected_val); 4714 int expected_ovf = bits::SignedAddOverflow32(*i, *j, &expected_val);
4717 CHECK_EQ(expected_ovf, m.Call()); 4715 CHECK_EQ(expected_ovf, m.Call());
4718 CHECK_EQ(expected_val, actual_val); 4716 CHECK_EQ(expected_val, actual_val);
4719 } 4717 }
4720 } 4718 }
4721 } 4719 }
4722 4720
4723 4721
4724 TEST(RunInt32AddWithOverflowInBranchP) { 4722 TEST(RunInt32AddWithOverflowInBranchP) {
4725 int constant = 911777; 4723 int constant = 911777;
4726 MLabel blocka, blockb; 4724 RawLabel blocka, blockb;
4727 RawMachineAssemblerTester<int32_t> m; 4725 RawMachineAssemblerTester<int32_t> m;
4728 Int32BinopTester bt(&m); 4726 Int32BinopTester bt(&m);
4729 Node* add = m.Int32AddWithOverflow(bt.param0, bt.param1); 4727 Node* add = m.Int32AddWithOverflow(bt.param0, bt.param1);
4730 Node* ovf = m.Projection(1, add); 4728 Node* ovf = m.Projection(1, add);
4731 m.Branch(ovf, &blocka, &blockb); 4729 m.Branch(ovf, &blocka, &blockb);
4732 m.Bind(&blocka); 4730 m.Bind(&blocka);
4733 bt.AddReturn(m.Int32Constant(constant)); 4731 bt.AddReturn(m.Int32Constant(constant));
4734 m.Bind(&blockb); 4732 m.Bind(&blockb);
4735 Node* val = m.Projection(0, add); 4733 Node* val = m.Projection(0, add);
4736 bt.AddReturn(val); 4734 bt.AddReturn(val);
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
4804 int expected_ovf = bits::SignedSubOverflow32(*i, *j, &expected_val); 4802 int expected_ovf = bits::SignedSubOverflow32(*i, *j, &expected_val);
4805 CHECK_EQ(expected_ovf, m.Call()); 4803 CHECK_EQ(expected_ovf, m.Call());
4806 CHECK_EQ(expected_val, actual_val); 4804 CHECK_EQ(expected_val, actual_val);
4807 } 4805 }
4808 } 4806 }
4809 } 4807 }
4810 4808
4811 4809
4812 TEST(RunInt32SubWithOverflowInBranchP) { 4810 TEST(RunInt32SubWithOverflowInBranchP) {
4813 int constant = 911999; 4811 int constant = 911999;
4814 MLabel blocka, blockb; 4812 RawLabel blocka, blockb;
4815 RawMachineAssemblerTester<int32_t> m; 4813 RawMachineAssemblerTester<int32_t> m;
4816 Int32BinopTester bt(&m); 4814 Int32BinopTester bt(&m);
4817 Node* sub = m.Int32SubWithOverflow(bt.param0, bt.param1); 4815 Node* sub = m.Int32SubWithOverflow(bt.param0, bt.param1);
4818 Node* ovf = m.Projection(1, sub); 4816 Node* ovf = m.Projection(1, sub);
4819 m.Branch(ovf, &blocka, &blockb); 4817 m.Branch(ovf, &blocka, &blockb);
4820 m.Bind(&blocka); 4818 m.Bind(&blocka);
4821 bt.AddReturn(m.Int32Constant(constant)); 4819 bt.AddReturn(m.Int32Constant(constant));
4822 m.Bind(&blockb); 4820 m.Bind(&blockb);
4823 Node* val = m.Projection(0, sub); 4821 Node* val = m.Projection(0, sub);
4824 bt.AddReturn(val); 4822 bt.AddReturn(val);
4825 FOR_INT32_INPUTS(i) { 4823 FOR_INT32_INPUTS(i) {
4826 FOR_INT32_INPUTS(j) { 4824 FOR_INT32_INPUTS(j) {
4827 int32_t expected; 4825 int32_t expected;
4828 if (bits::SignedSubOverflow32(*i, *j, &expected)) expected = constant; 4826 if (bits::SignedSubOverflow32(*i, *j, &expected)) expected = constant;
4829 CHECK_EQ(expected, bt.call(*i, *j)); 4827 CHECK_EQ(expected, bt.call(*i, *j));
4830 } 4828 }
4831 } 4829 }
4832 } 4830 }
4833 4831
4834 4832
4835 TEST(RunWord64EqualInBranchP) { 4833 TEST(RunWord64EqualInBranchP) {
4836 int64_t input; 4834 int64_t input;
4837 MLabel blocka, blockb; 4835 RawLabel blocka, blockb;
4838 RawMachineAssemblerTester<int64_t> m; 4836 RawMachineAssemblerTester<int64_t> m;
4839 if (!m.machine()->Is64()) return; 4837 if (!m.machine()->Is64()) return;
4840 Node* value = m.LoadFromPointer(&input, kMachInt64); 4838 Node* value = m.LoadFromPointer(&input, kMachInt64);
4841 m.Branch(m.Word64Equal(value, m.Int64Constant(0)), &blocka, &blockb); 4839 m.Branch(m.Word64Equal(value, m.Int64Constant(0)), &blocka, &blockb);
4842 m.Bind(&blocka); 4840 m.Bind(&blocka);
4843 m.Return(m.Int32Constant(1)); 4841 m.Return(m.Int32Constant(1));
4844 m.Bind(&blockb); 4842 m.Bind(&blockb);
4845 m.Return(m.Int32Constant(2)); 4843 m.Return(m.Int32Constant(2));
4846 input = V8_INT64_C(0); 4844 input = V8_INT64_C(0);
4847 CHECK_EQ(1, m.Call()); 4845 CHECK_EQ(1, m.Call());
(...skipping 822 matching lines...) Expand 10 before | Expand all | Expand 10 after
5670 a.Return(a.Int32Constant(33)); 5668 a.Return(a.Int32Constant(33));
5671 a.End(); 5669 a.End();
5672 Handle<Code> code_a = a.GetCode(); 5670 Handle<Code> code_a = a.GetCode();
5673 5671
5674 GraphBuilderTester<int32_t> b; 5672 GraphBuilderTester<int32_t> b;
5675 b.Return(b.Int32Constant(44)); 5673 b.Return(b.Int32Constant(44));
5676 b.End(); 5674 b.End();
5677 Handle<Code> code_b = b.GetCode(); 5675 Handle<Code> code_b = b.GetCode();
5678 5676
5679 RawMachineAssemblerTester<int32_t> r(kMachInt32); 5677 RawMachineAssemblerTester<int32_t> r(kMachInt32);
5680 RawMachineAssembler::Label tlabel; 5678 RawLabel tlabel;
5681 RawMachineAssembler::Label flabel; 5679 RawLabel flabel;
5682 RawMachineAssembler::Label merge; 5680 RawLabel merge;
5683 r.Branch(r.Parameter(0), &tlabel, &flabel); 5681 r.Branch(r.Parameter(0), &tlabel, &flabel);
5684 r.Bind(&tlabel); 5682 r.Bind(&tlabel);
5685 Node* fa = r.HeapConstant(code_a); 5683 Node* fa = r.HeapConstant(code_a);
5686 r.Goto(&merge); 5684 r.Goto(&merge);
5687 r.Bind(&flabel); 5685 r.Bind(&flabel);
5688 Node* fb = r.HeapConstant(code_b); 5686 Node* fb = r.HeapConstant(code_b);
5689 r.Goto(&merge); 5687 r.Goto(&merge);
5690 r.Bind(&merge); 5688 r.Bind(&merge);
5691 Node* phi = r.Phi(kMachInt32, fa, fb); 5689 Node* phi = r.Phi(kMachInt32, fa, fb);
5692 5690
(...skipping 18 matching lines...) Expand all
5711 Node* call = r.AddNode(r.common()->Call(desc), phi); 5709 Node* call = r.AddNode(r.common()->Call(desc), phi);
5712 r.Return(call); 5710 r.Return(call);
5713 5711
5714 CHECK_EQ(33, r.Call(1)); 5712 CHECK_EQ(33, r.Call(1));
5715 CHECK_EQ(44, r.Call(0)); 5713 CHECK_EQ(44, r.Call(0));
5716 } 5714 }
5717 5715
5718 } // namespace compiler 5716 } // namespace compiler
5719 } // namespace internal 5717 } // namespace internal
5720 } // namespace v8 5718 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698