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 <limits> | 5 #include <limits> |
6 | 6 |
7 #include "test/cctest/cctest.h" | 7 #include "test/cctest/cctest.h" |
8 #include "test/cctest/compiler/codegen-tester.h" | 8 #include "test/cctest/compiler/codegen-tester.h" |
9 #include "test/cctest/compiler/graph-builder-tester.h" | 9 #include "test/cctest/compiler/graph-builder-tester.h" |
10 #include "test/cctest/compiler/value-helper.h" | 10 #include "test/cctest/compiler/value-helper.h" |
(...skipping 475 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
486 Node* c = | 486 Node* c = |
487 r.changer()->GetRepresentationFor(n, from, from_type, use, use_info); | 487 r.changer()->GetRepresentationFor(n, from, from_type, use, use_info); |
488 | 488 |
489 CHECK_NE(c, n); | 489 CHECK_NE(c, n); |
490 CHECK_EQ(expected, c->opcode()); | 490 CHECK_EQ(expected, c->opcode()); |
491 CHECK_EQ(n, c->InputAt(0)); | 491 CHECK_EQ(n, c->InputAt(0)); |
492 } | 492 } |
493 | 493 |
494 TEST(SingleChanges) { | 494 TEST(SingleChanges) { |
495 CheckChange(IrOpcode::kChangeTaggedToBit, MachineRepresentation::kTagged, | 495 CheckChange(IrOpcode::kChangeTaggedToBit, MachineRepresentation::kTagged, |
496 Type::None(), MachineRepresentation::kBit); | 496 Type::Boolean(), MachineRepresentation::kBit); |
497 CheckChange(IrOpcode::kChangeBitToTagged, MachineRepresentation::kBit, | 497 CheckChange(IrOpcode::kChangeBitToTagged, MachineRepresentation::kBit, |
498 Type::None(), MachineRepresentation::kTagged); | 498 Type::Boolean(), MachineRepresentation::kTagged); |
499 | 499 |
500 CheckChange(IrOpcode::kChangeInt31ToTaggedSigned, | 500 CheckChange(IrOpcode::kChangeInt31ToTaggedSigned, |
501 MachineRepresentation::kWord32, Type::Signed31(), | 501 MachineRepresentation::kWord32, Type::Signed31(), |
502 MachineRepresentation::kTagged); | 502 MachineRepresentation::kTagged); |
503 CheckChange(IrOpcode::kChangeInt32ToTagged, MachineRepresentation::kWord32, | 503 CheckChange(IrOpcode::kChangeInt32ToTagged, MachineRepresentation::kWord32, |
504 Type::Signed32(), MachineRepresentation::kTagged); | 504 Type::Signed32(), MachineRepresentation::kTagged); |
505 CheckChange(IrOpcode::kChangeUint32ToTagged, MachineRepresentation::kWord32, | 505 CheckChange(IrOpcode::kChangeUint32ToTagged, MachineRepresentation::kWord32, |
506 Type::Unsigned32(), MachineRepresentation::kTagged); | 506 Type::Unsigned32(), MachineRepresentation::kTagged); |
507 CheckChange(IrOpcode::kChangeFloat64ToTagged, MachineRepresentation::kFloat64, | 507 CheckChange(IrOpcode::kChangeFloat64ToTagged, MachineRepresentation::kFloat64, |
508 Type::Number(), MachineRepresentation::kTagged); | 508 Type::Number(), MachineRepresentation::kTagged); |
(...skipping 30 matching lines...) Expand all Loading... |
539 CheckChange(IrOpcode::kChangeInt32ToFloat64, MachineRepresentation::kWord32, | 539 CheckChange(IrOpcode::kChangeInt32ToFloat64, MachineRepresentation::kWord32, |
540 Type::Signed32(), MachineRepresentation::kFloat64); | 540 Type::Signed32(), MachineRepresentation::kFloat64); |
541 CheckChange(IrOpcode::kChangeUint32ToFloat64, MachineRepresentation::kWord32, | 541 CheckChange(IrOpcode::kChangeUint32ToFloat64, MachineRepresentation::kWord32, |
542 Type::Unsigned32(), MachineRepresentation::kFloat64); | 542 Type::Unsigned32(), MachineRepresentation::kFloat64); |
543 CheckChange(IrOpcode::kChangeFloat64ToInt32, MachineRepresentation::kFloat64, | 543 CheckChange(IrOpcode::kChangeFloat64ToInt32, MachineRepresentation::kFloat64, |
544 Type::Signed32(), MachineRepresentation::kWord32); | 544 Type::Signed32(), MachineRepresentation::kWord32); |
545 CheckChange(IrOpcode::kChangeFloat64ToUint32, MachineRepresentation::kFloat64, | 545 CheckChange(IrOpcode::kChangeFloat64ToUint32, MachineRepresentation::kFloat64, |
546 Type::Unsigned32(), MachineRepresentation::kWord32); | 546 Type::Unsigned32(), MachineRepresentation::kWord32); |
547 | 547 |
548 CheckChange(IrOpcode::kTruncateFloat64ToFloat32, | 548 CheckChange(IrOpcode::kTruncateFloat64ToFloat32, |
549 MachineRepresentation::kFloat64, Type::None(), | 549 MachineRepresentation::kFloat64, Type::Number(), |
550 MachineRepresentation::kFloat32); | 550 MachineRepresentation::kFloat32); |
551 | 551 |
552 // Int32,Uint32 <-> Float32 require two changes. | 552 // Int32,Uint32 <-> Float32 require two changes. |
553 CheckTwoChanges(IrOpcode::kChangeInt32ToFloat64, | 553 CheckTwoChanges(IrOpcode::kChangeInt32ToFloat64, |
554 IrOpcode::kTruncateFloat64ToFloat32, | 554 IrOpcode::kTruncateFloat64ToFloat32, |
555 MachineRepresentation::kWord32, Type::Signed32(), | 555 MachineRepresentation::kWord32, Type::Signed32(), |
556 MachineRepresentation::kFloat32); | 556 MachineRepresentation::kFloat32); |
557 CheckTwoChanges(IrOpcode::kChangeUint32ToFloat64, | 557 CheckTwoChanges(IrOpcode::kChangeUint32ToFloat64, |
558 IrOpcode::kTruncateFloat64ToFloat32, | 558 IrOpcode::kTruncateFloat64ToFloat32, |
559 MachineRepresentation::kWord32, Type::Unsigned32(), | 559 MachineRepresentation::kWord32, Type::Unsigned32(), |
560 MachineRepresentation::kFloat32); | 560 MachineRepresentation::kFloat32); |
561 CheckTwoChanges(IrOpcode::kChangeFloat32ToFloat64, | 561 CheckTwoChanges(IrOpcode::kChangeFloat32ToFloat64, |
562 IrOpcode::kChangeFloat64ToInt32, | 562 IrOpcode::kChangeFloat64ToInt32, |
563 MachineRepresentation::kFloat32, Type::Signed32(), | 563 MachineRepresentation::kFloat32, Type::Signed32(), |
564 MachineRepresentation::kWord32); | 564 MachineRepresentation::kWord32); |
565 CheckTwoChanges(IrOpcode::kChangeFloat32ToFloat64, | 565 CheckTwoChanges(IrOpcode::kChangeFloat32ToFloat64, |
566 IrOpcode::kChangeFloat64ToUint32, | 566 IrOpcode::kChangeFloat64ToUint32, |
567 MachineRepresentation::kFloat32, Type::Unsigned32(), | 567 MachineRepresentation::kFloat32, Type::Unsigned32(), |
568 MachineRepresentation::kWord32); | 568 MachineRepresentation::kWord32); |
569 | 569 |
570 // Float32 <-> Tagged require two changes. | 570 // Float32 <-> Tagged require two changes. |
571 CheckTwoChanges(IrOpcode::kChangeFloat32ToFloat64, | 571 CheckTwoChanges(IrOpcode::kChangeFloat32ToFloat64, |
572 IrOpcode::kChangeFloat64ToTagged, | 572 IrOpcode::kChangeFloat64ToTagged, |
573 MachineRepresentation::kFloat32, Type::None(), | 573 MachineRepresentation::kFloat32, Type::Number(), |
574 MachineRepresentation::kTagged); | 574 MachineRepresentation::kTagged); |
575 CheckTwoChanges(IrOpcode::kChangeTaggedToFloat64, | 575 CheckTwoChanges(IrOpcode::kChangeTaggedToFloat64, |
576 IrOpcode::kTruncateFloat64ToFloat32, | 576 IrOpcode::kTruncateFloat64ToFloat32, |
577 MachineRepresentation::kTagged, Type::None(), | 577 MachineRepresentation::kTagged, Type::Number(), |
578 MachineRepresentation::kFloat32); | 578 MachineRepresentation::kFloat32); |
579 } | 579 } |
580 | 580 |
581 | 581 |
582 TEST(SignednessInWord32) { | 582 TEST(SignednessInWord32) { |
583 RepresentationChangerTester r; | 583 RepresentationChangerTester r; |
584 | 584 |
585 CheckChange(IrOpcode::kChangeTaggedToInt32, MachineRepresentation::kTagged, | 585 CheckChange(IrOpcode::kChangeTaggedToInt32, MachineRepresentation::kTagged, |
586 Type::Signed32(), MachineRepresentation::kWord32); | 586 Type::Signed32(), MachineRepresentation::kWord32); |
587 CheckChange(IrOpcode::kChangeTaggedToUint32, MachineRepresentation::kTagged, | 587 CheckChange(IrOpcode::kChangeTaggedToUint32, MachineRepresentation::kTagged, |
588 Type::Unsigned32(), MachineRepresentation::kWord32); | 588 Type::Unsigned32(), MachineRepresentation::kWord32); |
589 CheckChange(IrOpcode::kChangeInt32ToFloat64, MachineRepresentation::kWord32, | 589 CheckChange(IrOpcode::kChangeInt32ToFloat64, MachineRepresentation::kWord32, |
590 Type::None(), MachineRepresentation::kFloat64); | 590 Type::Signed32(), MachineRepresentation::kFloat64); |
591 CheckChange(IrOpcode::kChangeFloat64ToInt32, MachineRepresentation::kFloat64, | 591 CheckChange(IrOpcode::kChangeFloat64ToInt32, MachineRepresentation::kFloat64, |
592 Type::Signed32(), MachineRepresentation::kWord32); | 592 Type::Signed32(), MachineRepresentation::kWord32); |
593 CheckChange(IrOpcode::kTruncateFloat64ToWord32, | 593 CheckChange(IrOpcode::kTruncateFloat64ToWord32, |
594 MachineRepresentation::kFloat64, Type::Number(), | 594 MachineRepresentation::kFloat64, Type::Number(), |
595 MachineRepresentation::kWord32); | 595 MachineRepresentation::kWord32); |
596 CheckChange(IrOpcode::kCheckedTruncateTaggedToWord32, | 596 CheckChange(IrOpcode::kCheckedTruncateTaggedToWord32, |
597 MachineRepresentation::kTagged, Type::NumberOrOddball(), | 597 MachineRepresentation::kTagged, Type::NumberOrOddball(), |
598 MachineRepresentation::kWord32, | 598 MachineRepresentation::kWord32, |
599 UseInfo::CheckedNumberOrOddballAsWord32()); | 599 UseInfo::CheckedNumberOrOddballAsWord32()); |
600 | 600 |
601 CheckTwoChanges(IrOpcode::kChangeInt32ToFloat64, | 601 CheckTwoChanges(IrOpcode::kChangeInt32ToFloat64, |
602 IrOpcode::kTruncateFloat64ToFloat32, | 602 IrOpcode::kTruncateFloat64ToFloat32, |
603 MachineRepresentation::kWord32, Type::None(), | 603 MachineRepresentation::kWord32, Type::Signed32(), |
604 MachineRepresentation::kFloat32); | 604 MachineRepresentation::kFloat32); |
605 CheckTwoChanges(IrOpcode::kChangeFloat32ToFloat64, | 605 CheckTwoChanges(IrOpcode::kChangeFloat32ToFloat64, |
606 IrOpcode::kTruncateFloat64ToWord32, | 606 IrOpcode::kTruncateFloat64ToWord32, |
607 MachineRepresentation::kFloat32, Type::Number(), | 607 MachineRepresentation::kFloat32, Type::Number(), |
608 MachineRepresentation::kWord32); | 608 MachineRepresentation::kWord32); |
609 } | 609 } |
610 | 610 |
611 | 611 |
612 TEST(Nops) { | 612 TEST(Nops) { |
613 RepresentationChangerTester r; | 613 RepresentationChangerTester r; |
614 | 614 |
615 // X -> X is always a nop for any single representation X. | 615 // X -> X is always a nop for any single representation X. |
616 for (size_t i = 0; i < arraysize(kMachineTypes); i++) { | 616 for (size_t i = 0; i < arraysize(kMachineTypes); i++) { |
617 r.CheckNop(kMachineTypes[i].representation(), Type::None(), | 617 r.CheckNop(kMachineTypes[i].representation(), Type::Number(), |
618 kMachineTypes[i].representation()); | 618 kMachineTypes[i].representation()); |
619 } | 619 } |
620 | 620 |
621 // 32-bit floats. | 621 // 32-bit floats. |
622 r.CheckNop(MachineRepresentation::kFloat32, Type::None(), | |
623 MachineRepresentation::kFloat32); | |
624 r.CheckNop(MachineRepresentation::kFloat32, Type::Number(), | 622 r.CheckNop(MachineRepresentation::kFloat32, Type::Number(), |
625 MachineRepresentation::kFloat32); | 623 MachineRepresentation::kFloat32); |
626 | 624 |
627 // 32-bit words can be used as smaller word sizes and vice versa, because | 625 // 32-bit words can be used as smaller word sizes and vice versa, because |
628 // loads from memory implicitly sign or zero extend the value to the | 626 // loads from memory implicitly sign or zero extend the value to the |
629 // full machine word size, and stores implicitly truncate. | 627 // full machine word size, and stores implicitly truncate. |
630 r.CheckNop(MachineRepresentation::kWord32, Type::Signed32(), | 628 r.CheckNop(MachineRepresentation::kWord32, Type::Signed32(), |
631 MachineRepresentation::kWord8); | 629 MachineRepresentation::kWord8); |
632 r.CheckNop(MachineRepresentation::kWord32, Type::Signed32(), | 630 r.CheckNop(MachineRepresentation::kWord32, Type::Signed32(), |
633 MachineRepresentation::kWord16); | 631 MachineRepresentation::kWord16); |
634 r.CheckNop(MachineRepresentation::kWord32, Type::Signed32(), | 632 r.CheckNop(MachineRepresentation::kWord32, Type::Signed32(), |
635 MachineRepresentation::kWord32); | 633 MachineRepresentation::kWord32); |
636 r.CheckNop(MachineRepresentation::kWord8, Type::Signed32(), | 634 r.CheckNop(MachineRepresentation::kWord8, Type::Signed32(), |
637 MachineRepresentation::kWord32); | 635 MachineRepresentation::kWord32); |
638 r.CheckNop(MachineRepresentation::kWord16, Type::Signed32(), | 636 r.CheckNop(MachineRepresentation::kWord16, Type::Signed32(), |
639 MachineRepresentation::kWord32); | 637 MachineRepresentation::kWord32); |
640 | 638 |
641 // kRepBit (result of comparison) is implicitly a wordish thing. | 639 // kRepBit (result of comparison) is implicitly a wordish thing. |
642 r.CheckNop(MachineRepresentation::kBit, Type::None(), | |
643 MachineRepresentation::kWord8); | |
644 r.CheckNop(MachineRepresentation::kBit, Type::None(), | |
645 MachineRepresentation::kWord16); | |
646 r.CheckNop(MachineRepresentation::kBit, Type::None(), | |
647 MachineRepresentation::kWord32); | |
648 r.CheckNop(MachineRepresentation::kBit, Type::None(), | |
649 MachineRepresentation::kWord64); | |
650 r.CheckNop(MachineRepresentation::kBit, Type::Boolean(), | 640 r.CheckNop(MachineRepresentation::kBit, Type::Boolean(), |
651 MachineRepresentation::kWord8); | 641 MachineRepresentation::kWord8); |
652 r.CheckNop(MachineRepresentation::kBit, Type::Boolean(), | 642 r.CheckNop(MachineRepresentation::kBit, Type::Boolean(), |
653 MachineRepresentation::kWord16); | 643 MachineRepresentation::kWord16); |
654 r.CheckNop(MachineRepresentation::kBit, Type::Boolean(), | 644 r.CheckNop(MachineRepresentation::kBit, Type::Boolean(), |
655 MachineRepresentation::kWord32); | 645 MachineRepresentation::kWord32); |
656 r.CheckNop(MachineRepresentation::kBit, Type::Boolean(), | 646 r.CheckNop(MachineRepresentation::kBit, Type::Boolean(), |
657 MachineRepresentation::kWord64); | 647 MachineRepresentation::kWord64); |
658 } | 648 } |
659 | 649 |
660 | 650 |
661 TEST(TypeErrors) { | 651 TEST(TypeErrors) { |
662 RepresentationChangerTester r; | 652 RepresentationChangerTester r; |
663 | 653 |
664 // Wordish cannot be implicitly converted to/from comparison conditions. | 654 // Wordish cannot be implicitly converted to/from comparison conditions. |
665 r.CheckTypeError(MachineRepresentation::kWord8, Type::None(), | 655 r.CheckTypeError(MachineRepresentation::kWord8, Type::Number(), |
666 MachineRepresentation::kBit); | 656 MachineRepresentation::kBit); |
667 r.CheckTypeError(MachineRepresentation::kWord16, Type::None(), | 657 r.CheckTypeError(MachineRepresentation::kWord16, Type::Number(), |
668 MachineRepresentation::kBit); | 658 MachineRepresentation::kBit); |
669 r.CheckTypeError(MachineRepresentation::kWord32, Type::None(), | 659 r.CheckTypeError(MachineRepresentation::kWord32, Type::Number(), |
670 MachineRepresentation::kBit); | 660 MachineRepresentation::kBit); |
671 r.CheckTypeError(MachineRepresentation::kWord64, Type::None(), | 661 r.CheckTypeError(MachineRepresentation::kWord64, Type::Number(), |
672 MachineRepresentation::kBit); | 662 MachineRepresentation::kBit); |
673 | 663 |
674 // Floats cannot be implicitly converted to/from comparison conditions. | 664 // Floats cannot be implicitly converted to/from comparison conditions. |
675 r.CheckTypeError(MachineRepresentation::kFloat64, Type::None(), | 665 r.CheckTypeError(MachineRepresentation::kFloat64, Type::Number(), |
676 MachineRepresentation::kBit); | 666 MachineRepresentation::kBit); |
677 | 667 |
678 // Floats cannot be implicitly converted to/from comparison conditions. | 668 // Floats cannot be implicitly converted to/from comparison conditions. |
679 r.CheckTypeError(MachineRepresentation::kFloat32, Type::None(), | 669 r.CheckTypeError(MachineRepresentation::kFloat32, Type::Number(), |
680 MachineRepresentation::kBit); | 670 MachineRepresentation::kBit); |
681 r.CheckTypeError(MachineRepresentation::kBit, Type::None(), | 671 r.CheckTypeError(MachineRepresentation::kBit, Type::Number(), |
682 MachineRepresentation::kFloat32); | 672 MachineRepresentation::kFloat32); |
683 r.CheckTypeError(MachineRepresentation::kBit, Type::Boolean(), | 673 r.CheckTypeError(MachineRepresentation::kBit, Type::Boolean(), |
684 MachineRepresentation::kFloat32); | 674 MachineRepresentation::kFloat32); |
685 | 675 |
686 // Word64 is internal and shouldn't be implicitly converted. | 676 // Word64 is internal and shouldn't be implicitly converted. |
687 r.CheckTypeError(MachineRepresentation::kWord64, Type::None(), | 677 r.CheckTypeError(MachineRepresentation::kWord64, Type::Internal(), |
688 MachineRepresentation::kTagged); | 678 MachineRepresentation::kTagged); |
689 r.CheckTypeError(MachineRepresentation::kTagged, Type::None(), | 679 r.CheckTypeError(MachineRepresentation::kTagged, Type::Number(), |
690 MachineRepresentation::kWord64); | 680 MachineRepresentation::kWord64); |
691 r.CheckTypeError(MachineRepresentation::kTagged, Type::Boolean(), | 681 r.CheckTypeError(MachineRepresentation::kTagged, Type::Boolean(), |
692 MachineRepresentation::kWord64); | 682 MachineRepresentation::kWord64); |
693 | 683 |
694 // Word64 / Word32 shouldn't be implicitly converted. | 684 // Word64 / Word32 shouldn't be implicitly converted. |
695 r.CheckTypeError(MachineRepresentation::kWord64, Type::None(), | 685 r.CheckTypeError(MachineRepresentation::kWord64, Type::Internal(), |
696 MachineRepresentation::kWord32); | 686 MachineRepresentation::kWord32); |
697 r.CheckTypeError(MachineRepresentation::kWord32, Type::None(), | 687 r.CheckTypeError(MachineRepresentation::kWord32, Type::Number(), |
698 MachineRepresentation::kWord64); | 688 MachineRepresentation::kWord64); |
699 r.CheckTypeError(MachineRepresentation::kWord32, Type::Signed32(), | 689 r.CheckTypeError(MachineRepresentation::kWord32, Type::Signed32(), |
700 MachineRepresentation::kWord64); | 690 MachineRepresentation::kWord64); |
701 r.CheckTypeError(MachineRepresentation::kWord32, Type::Unsigned32(), | 691 r.CheckTypeError(MachineRepresentation::kWord32, Type::Unsigned32(), |
702 MachineRepresentation::kWord64); | 692 MachineRepresentation::kWord64); |
703 } | 693 } |
704 | 694 |
705 } // namespace compiler | 695 } // namespace compiler |
706 } // namespace internal | 696 } // namespace internal |
707 } // namespace v8 | 697 } // namespace v8 |
OLD | NEW |