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

Side by Side Diff: src/trusted/validator_arm/inst_classes_testers.cc

Issue 10459058: Define a baseline and testing patterns for ARM load_store_word_byte table. (Closed) Base URL: svn://svn.chromium.org/native_client/trunk/src/native_client/
Patch Set: Created 8 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2012 The Native Client Authors. All rights reserved. 2 * Copyright (c) 2012 The Native Client Authors. All rights reserved.
3 * Use of this source code is governed by a BSD-style license that can be 3 * Use of this source code is governed by a BSD-style license that can be
4 * found in the LICENSE file. 4 * found in the LICENSE file.
5 */ 5 */
6 #ifndef NACL_TRUSTED_BUT_NOT_TCB 6 #ifndef NACL_TRUSTED_BUT_NOT_TCB
7 #error This file is not meant for use in the TCB 7 #error This file is not meant for use in the TCB
8 #endif 8 #endif
9 9
10 #include "native_client/src/trusted/validator_arm/inst_classes_testers.h" 10 #include "native_client/src/trusted/validator_arm/inst_classes_testers.h"
(...skipping 625 matching lines...) Expand 10 before | Expand all | Expand 10 after
636 EXPECT_FALSE(expected_decoder.d_lo.reg(inst).Equals(kRegisterPc)) 636 EXPECT_FALSE(expected_decoder.d_lo.reg(inst).Equals(kRegisterPc))
637 << "Expected Unpredictable for " << InstContents(); 637 << "Expected Unpredictable for " << InstContents();
638 EXPECT_FALSE(expected_decoder.m.reg(inst).Equals(kRegisterPc)) 638 EXPECT_FALSE(expected_decoder.m.reg(inst).Equals(kRegisterPc))
639 << "Expected Unpredictable for " << InstContents(); 639 << "Expected Unpredictable for " << InstContents();
640 EXPECT_FALSE(expected_decoder.n.reg(inst).Equals(kRegisterPc)) 640 EXPECT_FALSE(expected_decoder.n.reg(inst).Equals(kRegisterPc))
641 << "Expected Unpredictable for " << InstContents(); 641 << "Expected Unpredictable for " << InstContents();
642 642
643 return true; 643 return true;
644 } 644 }
645 645
646 // LoadStore2RegisterImmediateOpTester 646 // LoadStore2RegisterImm8OpTester
647 LoadStore2RegisterImmediateOpTester::LoadStore2RegisterImmediateOpTester( 647 LoadStore2RegisterImm8OpTester::LoadStore2RegisterImm8OpTester(
648 const NamedClassDecoder& decoder) : Arm32DecoderTester(decoder) {} 648 const NamedClassDecoder& decoder) : Arm32DecoderTester(decoder) {}
649 649
650 bool LoadStore2RegisterImmediateOpTester:: 650 bool LoadStore2RegisterImm8OpTester::
651 ApplySanityChecks(Instruction inst, 651 ApplySanityChecks(Instruction inst,
652 const NamedClassDecoder& decoder) { 652 const NamedClassDecoder& decoder) {
653 nacl_arm_dec::LoadStore2RegisterImmediateOp expected_decoder; 653 nacl_arm_dec::LoadStore2RegisterImm8Op expected_decoder;
654 // Check that condition is defined correctly. 654 // Check that condition is defined correctly.
655 EXPECT_EQ(expected_decoder.cond.value(inst), inst.Bits(31, 28)); 655 EXPECT_EQ(expected_decoder.cond.value(inst), inst.Bits(31, 28));
656 656
657 // Didn't parse undefined conditional. 657 // Didn't parse undefined conditional.
658 if (expected_decoder.cond.undefined(inst)) { 658 if (expected_decoder.cond.undefined(inst)) {
659 NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder); 659 NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder);
660 } 660 }
661 661
662 // Should not parse if P=0 && W=1. 662 // Should not parse if P=0 && W=1.
663 if (expected_decoder.indexing.IsPostIndexing(inst) && 663 if (expected_decoder.indexing.IsPostIndexing(inst) &&
664 expected_decoder.writes.IsDefined(inst)) { 664 expected_decoder.writes.IsDefined(inst)) {
665 NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder); 665 NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder);
666 } 666 }
667 667
668 // Check if expected class name found. 668 // Check if expected class name found.
669 NC_PRECOND(Arm32DecoderTester::ApplySanityChecks(inst, decoder)); 669 NC_PRECOND(Arm32DecoderTester::ApplySanityChecks(inst, decoder));
670 670
671 // Check Registers and flags used. 671 // Check Registers and flags used.
672 EXPECT_TRUE(expected_decoder.t.reg(inst).Equals(inst.Reg(15, 12))); 672 EXPECT_TRUE(expected_decoder.t.reg(inst).Equals(inst.Reg(15, 12)));
673 EXPECT_TRUE(expected_decoder.n.reg(inst).Equals(inst.Reg(19, 16))); 673 EXPECT_TRUE(expected_decoder.n.reg(inst).Equals(inst.Reg(19, 16)));
674 EXPECT_EQ(expected_decoder.writes.IsDefined(inst), inst.Bit(21)); 674 EXPECT_EQ(expected_decoder.writes.IsDefined(inst), inst.Bit(21));
675 EXPECT_EQ(expected_decoder.direction.IsAdd(inst), inst.Bit(23)); 675 EXPECT_EQ(expected_decoder.direction.IsAdd(inst), inst.Bit(23));
676 EXPECT_EQ(expected_decoder.indexing.IsPreIndexing(inst), inst.Bit(24)); 676 EXPECT_EQ(expected_decoder.indexing.IsPreIndexing(inst), inst.Bit(24));
677 677
678 // Other ARM constraints about this instruction. 678 // Other ARM constraints about this instruction.
679 EXPECT_FALSE(expected_decoder.t.reg(inst).Equals(kRegisterPc)) 679 EXPECT_FALSE(expected_decoder.t.reg(inst).Equals(kRegisterPc))
680 << "Expected UNPREDICTABLE for " << InstContents(); 680 << "Expected UNPREDICTABLE for " << InstContents();
681 681
682 EXPECT_FALSE(expected_decoder.HasWriteBack(inst) && 682 // NOTE: The manual states that that it is also unpredictable
683 (expected_decoder.n.reg(inst).Equals(kRegisterPc) || 683 // when HasWriteBack(i) and Rn=Rt. However, the compilers
684 expected_decoder.n.reg(inst).Equals( 684 // may not check for this. For the moment, we are changing
685 expected_decoder.t.reg(inst)))) 685 // the code to ignore this case for loads and store.
686 << "Expected UNPREDICTABLE for " << InstContents(); 686 // TODO(karl): Should we not allow this?
687 // EXPECT_FALSE(expected_decoder.HasWriteBack(inst) &&
688 // (expected_decoder.n.reg(inst).Equals(kRegisterPc) ||
689 // expected_decoder.n.reg(inst).Equals(
690 // expected_decoder.t.reg(inst))))
691 // << "Expected UNPREDICTABLE for " << InstContents();
687 692
688 // Other NaCl constraints about this instruction. 693 // Other NaCl constraints about this instruction.
689 EXPECT_FALSE(ExpectedDecoder().defs(inst).Contains(kRegisterPc)) 694 EXPECT_FALSE(ExpectedDecoder().defs(inst).Contains(kRegisterPc))
690 << "Expected FORBIDDEN_OPERANDS for " << InstContents(); 695 << "Expected FORBIDDEN_OPERANDS for " << InstContents();
691 696
692 return true; 697 return true;
693 } 698 }
694 699
695 // LoadStore2RegisterImmediateOpTesterNotRnIsPc 700 // LoadStore2RegisterImm8OpTesterNotRnIsPc
696 LoadStore2RegisterImmediateOpTesterNotRnIsPc:: 701 LoadStore2RegisterImm8OpTesterNotRnIsPc::
697 LoadStore2RegisterImmediateOpTesterNotRnIsPc( 702 LoadStore2RegisterImm8OpTesterNotRnIsPc(
698 const NamedClassDecoder& decoder) 703 const NamedClassDecoder& decoder)
699 : LoadStore2RegisterImmediateOpTester(decoder) {} 704 : LoadStore2RegisterImm8OpTester(decoder) {}
700 705
701 bool LoadStore2RegisterImmediateOpTesterNotRnIsPc:: 706 bool LoadStore2RegisterImm8OpTesterNotRnIsPc::
702 ApplySanityChecks(Instruction inst, 707 ApplySanityChecks(Instruction inst,
703 const NamedClassDecoder& decoder) { 708 const NamedClassDecoder& decoder) {
704 nacl_arm_dec::LoadStore2RegisterImmediateOp expected_decoder; 709 nacl_arm_dec::LoadStore2RegisterImm8Op expected_decoder;
705 710
706 // Check that we don't parse when Rn=15. 711 // Check that we don't parse when Rn=15.
707 if (expected_decoder.n.reg(inst).Equals(kRegisterPc)) { 712 if (expected_decoder.n.reg(inst).Equals(kRegisterPc)) {
708 NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder); 713 NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder);
709 } 714 }
710 715
711 return LoadStore2RegisterImmediateOpTester::ApplySanityChecks(inst, decoder); 716 return LoadStore2RegisterImm8OpTester::ApplySanityChecks(inst, decoder);
712 } 717 }
713 718
714 // LoadStore2RegisterImmediateDoubleOpTester 719 // LoadStore2RegisterImm8DoubleOpTester
715 LoadStore2RegisterImmediateDoubleOpTester:: 720 LoadStore2RegisterImm8DoubleOpTester::
716 LoadStore2RegisterImmediateDoubleOpTester(const NamedClassDecoder& decoder) 721 LoadStore2RegisterImm8DoubleOpTester(const NamedClassDecoder& decoder)
717 : LoadStore2RegisterImmediateOpTester(decoder) {} 722 : LoadStore2RegisterImm8OpTester(decoder) {}
718 723
719 bool LoadStore2RegisterImmediateDoubleOpTester:: 724 bool LoadStore2RegisterImm8DoubleOpTester::
720 ApplySanityChecks(Instruction inst, 725 ApplySanityChecks(Instruction inst,
721 const NamedClassDecoder& decoder) { 726 const NamedClassDecoder& decoder) {
722 NC_PRECOND(LoadStore2RegisterImmediateOpTester:: 727 NC_PRECOND(LoadStore2RegisterImm8OpTester::
723 ApplySanityChecks(inst, decoder)); 728 ApplySanityChecks(inst, decoder));
724 729
725 // Check Registers and flags used. 730 // Check Registers and flags used.
726 nacl_arm_dec::LoadStore2RegisterImmediateDoubleOp expected_decoder; 731 nacl_arm_dec::LoadStore2RegisterImm8DoubleOp expected_decoder;
727 EXPECT_EQ(expected_decoder.t.number(inst) + 1, 732 EXPECT_EQ(expected_decoder.t.number(inst) + 1,
728 expected_decoder.t2.number(inst)); 733 expected_decoder.t2.number(inst));
729 734
730 // Other ARM constraints about this instruction. 735 // Other ARM constraints about this instruction.
731 EXPECT_TRUE(expected_decoder.t.IsEven(inst)); 736 EXPECT_TRUE(expected_decoder.t.IsEven(inst));
732 EXPECT_NE(expected_decoder.t2.number(inst), static_cast<uint32_t>(15)) 737 EXPECT_NE(expected_decoder.t2.number(inst), static_cast<uint32_t>(15))
733 << "Expected UNPREDICTABLE for " << InstContents(); 738 << "Expected UNPREDICTABLE for " << InstContents();
734 EXPECT_FALSE(expected_decoder.HasWriteBack(inst) && 739
735 expected_decoder.n.reg(inst).Equals( 740 // NOTE: The manual states that that it is also unpredictable
736 expected_decoder.t2.reg(inst))) 741 // when HasWriteBack(i) and Rn=Rt. However, the compilers
737 << "Expected UNPREDICTABLE for " << InstContents(); 742 // may not check for this. For the moment, we are changing
743 // the code to ignore this case for loads and store.
744 // TODO(karl): Should we not allow this?
745 // EXPECT_FALSE(expected_decoder.HasWriteBack(inst) &&
746 // expected_decoder.n.reg(inst).Equals(
747 // expected_decoder.t2.reg(inst)))
748 // << "Expected UNPREDICTABLE for " << InstContents();
738 749
739 return true; 750 return true;
740 } 751 }
741 752
742 // LoadStore2RegisterImmediateDoubleOpTesterNotRnIsPc 753 // LoadStore2RegisterImm8DoubleOpTesterNotRnIsPc
743 LoadStore2RegisterImmediateDoubleOpTesterNotRnIsPc:: 754 LoadStore2RegisterImm8DoubleOpTesterNotRnIsPc::
744 LoadStore2RegisterImmediateDoubleOpTesterNotRnIsPc( 755 LoadStore2RegisterImm8DoubleOpTesterNotRnIsPc(
745 const NamedClassDecoder& decoder) 756 const NamedClassDecoder& decoder)
746 : LoadStore2RegisterImmediateDoubleOpTester(decoder) {} 757 : LoadStore2RegisterImm8DoubleOpTester(decoder) {}
747 758
748 bool LoadStore2RegisterImmediateDoubleOpTesterNotRnIsPc:: 759 bool LoadStore2RegisterImm8DoubleOpTesterNotRnIsPc::
749 ApplySanityChecks(Instruction inst, 760 ApplySanityChecks(Instruction inst,
750 const NamedClassDecoder& decoder) { 761 const NamedClassDecoder& decoder) {
751 nacl_arm_dec::LoadStore2RegisterImmediateDoubleOp expected_decoder; 762 nacl_arm_dec::LoadStore2RegisterImm8DoubleOp expected_decoder;
752 763
753 // Check that we don't parse when Rn=15. 764 // Check that we don't parse when Rn=15.
754 if (expected_decoder.n.reg(inst).Equals(kRegisterPc)) { 765 if (expected_decoder.n.reg(inst).Equals(kRegisterPc)) {
755 NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder); 766 NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder);
756 } 767 }
757 768
758 return LoadStore2RegisterImmediateDoubleOpTester:: 769 return LoadStore2RegisterImm8DoubleOpTester::
759 ApplySanityChecks(inst, decoder); 770 ApplySanityChecks(inst, decoder);
760 } 771 }
761 772
773 // LoadStore2RegisterImm12OpTester
774 LoadStore2RegisterImm12OpTester::LoadStore2RegisterImm12OpTester(
775 const NamedClassDecoder& decoder) : Arm32DecoderTester(decoder) {}
776
777 bool LoadStore2RegisterImm12OpTester::
778 ApplySanityChecks(Instruction inst,
779 const NamedClassDecoder& decoder) {
780 nacl_arm_dec::LoadStore2RegisterImm12Op expected_decoder;
781 // Check that condition is defined correctly.
782 EXPECT_EQ(expected_decoder.cond.value(inst), inst.Bits(31, 28));
783
784 // Didn't parse undefined conditional.
785 if (expected_decoder.cond.undefined(inst)) {
786 NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder);
787 }
788
789 // Should not parse if P=0 && W=1.
790 if (expected_decoder.indexing.IsPostIndexing(inst) &&
791 expected_decoder.writes.IsDefined(inst)) {
792 NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder);
793 }
794
795 // Check if expected class name found.
796 NC_PRECOND(Arm32DecoderTester::ApplySanityChecks(inst, decoder));
797
798 // Check Registers and flags used.
799 EXPECT_EQ(expected_decoder.imm12.value(inst), inst.Bits(11, 0));
800 EXPECT_TRUE(expected_decoder.t.reg(inst).Equals(inst.Reg(15, 12)));
801 EXPECT_TRUE(expected_decoder.n.reg(inst).Equals(inst.Reg(19, 16)));
802 EXPECT_EQ(expected_decoder.writes.IsDefined(inst), inst.Bit(21));
803 EXPECT_EQ(expected_decoder.direction.IsAdd(inst), inst.Bit(23));
804 EXPECT_EQ(expected_decoder.indexing.IsPreIndexing(inst), inst.Bit(24));
805
806 // Other ARM constraints about this instruction.
807 EXPECT_FALSE(expected_decoder.t.reg(inst).Equals(kRegisterPc))
808 << "Expected UNPREDICTABLE for " << InstContents();
809
810 // NOTE: The manual states that that it is also unpredictable
811 // when HasWriteBack(i) and Rn=Rt. However, the compilers
812 // may not check for this. For the moment, we are changing
813 // the code to ignore this case for loads and store.
814 // TODO(karl): Should we not allow this?
815 // EXPECT_FALSE(expected_decoder.HasWriteBack(inst) &&
816 // (expected_decoder.n.reg(inst).Equals(kRegisterPc) ||
817 // expected_decoder.n.reg(inst).Equals(
818 // expected_decoder.t.reg(inst))))
819 // << "Expected UNPREDICTABLE for " << InstContents();
820
821 // Other NaCl constraints about this instruction.
822 EXPECT_FALSE(ExpectedDecoder().defs(inst).Contains(kRegisterPc))
823 << "Expected FORBIDDEN_OPERANDS for " << InstContents();
824
825 return true;
826 }
827
828 // LoadStore2RegisterImm12OpTesterNotRnIsPc
829 LoadStore2RegisterImm12OpTesterNotRnIsPc::
830 LoadStore2RegisterImm12OpTesterNotRnIsPc(
831 const NamedClassDecoder& decoder)
832 : LoadStore2RegisterImm12OpTester(decoder) {}
833
834 bool LoadStore2RegisterImm12OpTesterNotRnIsPc::
835 ApplySanityChecks(Instruction inst,
836 const NamedClassDecoder& decoder) {
837 nacl_arm_dec::LoadStore2RegisterImm12Op expected_decoder;
838
839 // Check that we don't parse when Rn=15.
840 if (expected_decoder.n.reg(inst).Equals(kRegisterPc)) {
841 NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder);
842 }
843
844 return LoadStore2RegisterImm12OpTester::ApplySanityChecks(inst, decoder);
845 }
846
847
762 // LoadStore3RegisterOpTester 848 // LoadStore3RegisterOpTester
763 LoadStore3RegisterOpTester::LoadStore3RegisterOpTester( 849 LoadStore3RegisterOpTester::LoadStore3RegisterOpTester(
764 const NamedClassDecoder& decoder) : Arm32DecoderTester(decoder) {} 850 const NamedClassDecoder& decoder) : Arm32DecoderTester(decoder) {}
765 851
766 bool LoadStore3RegisterOpTester:: 852 bool LoadStore3RegisterOpTester::
767 ApplySanityChecks(Instruction inst, 853 ApplySanityChecks(Instruction inst,
768 const NamedClassDecoder& decoder) { 854 const NamedClassDecoder& decoder) {
769 nacl_arm_dec::LoadStore3RegisterOp expected_decoder; 855 nacl_arm_dec::LoadStore3RegisterOp expected_decoder;
770 856
771 // Check that condition is defined correctly. 857 // Check that condition is defined correctly.
(...skipping 19 matching lines...) Expand all
791 EXPECT_TRUE(expected_decoder.n.reg(inst).Equals(inst.Reg(19, 16))); 877 EXPECT_TRUE(expected_decoder.n.reg(inst).Equals(inst.Reg(19, 16)));
792 EXPECT_EQ(expected_decoder.writes.IsDefined(inst), inst.Bit(21)); 878 EXPECT_EQ(expected_decoder.writes.IsDefined(inst), inst.Bit(21));
793 EXPECT_EQ(expected_decoder.direction.IsAdd(inst), inst.Bit(23)); 879 EXPECT_EQ(expected_decoder.direction.IsAdd(inst), inst.Bit(23));
794 EXPECT_EQ(expected_decoder.indexing.IsPreIndexing(inst), inst.Bit(24)); 880 EXPECT_EQ(expected_decoder.indexing.IsPreIndexing(inst), inst.Bit(24));
795 881
796 // Other ARM constraints about this instruction. 882 // Other ARM constraints about this instruction.
797 EXPECT_FALSE(expected_decoder.n.reg(inst).Equals(kRegisterPc)) 883 EXPECT_FALSE(expected_decoder.n.reg(inst).Equals(kRegisterPc))
798 << "Expected UNPREDICTABLE for " << InstContents(); 884 << "Expected UNPREDICTABLE for " << InstContents();
799 EXPECT_FALSE(expected_decoder.t.reg(inst).Equals(kRegisterPc)) 885 EXPECT_FALSE(expected_decoder.t.reg(inst).Equals(kRegisterPc))
800 << "Expected UNPREDICTABLE for " << InstContents(); 886 << "Expected UNPREDICTABLE for " << InstContents();
801 EXPECT_FALSE(expected_decoder.HasWriteBack(inst) && 887
802 (expected_decoder.n.reg(inst).Equals(kRegisterPc) || 888 // NOTE: The manual states that that it is also unpredictable
803 expected_decoder.n.reg(inst).Equals( 889 // when HasWriteBack(i) and Rn=Rt. However, the compilers
804 expected_decoder.t.reg(inst)))) 890 // may not check for this. For the moment, we are changing
805 << "Expected UNPREDICTABLE for " << InstContents(); 891 // the code to ignore this case for loads and stores.
892 // TODO(karl): Should we not allow this?
893 // EXPECT_FALSE(expected_decoder.HasWriteBack(inst) &&
894 // (expected_decoder.n.reg(inst).Equals(kRegisterPc) ||
895 // expected_decoder.n.reg(inst).Equals(
896 // expected_decoder.t.reg(inst))))
897 // << "Expected UNPREDICTABLE for " << InstContents();
806 898
807 // Other NaCl constraints about this instruction. 899 // Other NaCl constraints about this instruction.
808 EXPECT_FALSE(expected_decoder.indexing.IsPreIndexing(inst)) 900 EXPECT_FALSE(expected_decoder.indexing.IsPreIndexing(inst))
809 << "Expected FORBIDDEN for " << InstContents(); 901 << "Expected FORBIDDEN for " << InstContents();
810 902
811 EXPECT_FALSE(ExpectedDecoder().defs(inst).Contains(kRegisterPc)) 903 EXPECT_FALSE(ExpectedDecoder().defs(inst).Contains(kRegisterPc))
812 << "Expected FORBIDDEN_OPERANDS for " << InstContents(); 904 << "Expected FORBIDDEN_OPERANDS for " << InstContents();
813 905
814 return true; 906 return true;
815 } 907 }
(...skipping 11 matching lines...) Expand all
827 919
828 // Check Registers and flags used. 920 // Check Registers and flags used.
829 nacl_arm_dec::LoadStore3RegisterDoubleOp expected_decoder; 921 nacl_arm_dec::LoadStore3RegisterDoubleOp expected_decoder;
830 EXPECT_EQ(expected_decoder.t.number(inst) + 1, 922 EXPECT_EQ(expected_decoder.t.number(inst) + 1,
831 expected_decoder.t2.number(inst)); 923 expected_decoder.t2.number(inst));
832 924
833 // Other ARM constraints about this instruction. 925 // Other ARM constraints about this instruction.
834 EXPECT_TRUE(expected_decoder.t.IsEven(inst)); 926 EXPECT_TRUE(expected_decoder.t.IsEven(inst));
835 EXPECT_NE(expected_decoder.t2.number(inst), static_cast<uint32_t>(15)) 927 EXPECT_NE(expected_decoder.t2.number(inst), static_cast<uint32_t>(15))
836 << "Expected UNPREDICTABLE for " << InstContents(); 928 << "Expected UNPREDICTABLE for " << InstContents();
837 EXPECT_FALSE(expected_decoder.HasWriteBack(inst) && 929
838 expected_decoder.n.reg(inst).Equals( 930 // NOTE: The manual states that that it is also unpredictable
839 expected_decoder.t2.reg(inst))) 931 // when HasWriteBack(i) and Rn=Rt. However, the compilers
840 << "Expected UNPREDICTABLE for " << InstContents(); 932 // may not check for this. For the moment, we are changing
933 // the code to ignore this case for loads and stores.
934 // TODO(karl): Should we not allow this?
935 // EXPECT_FALSE(expected_decoder.HasWriteBack(inst) &&
936 // expected_decoder.n.reg(inst).Equals(
937 // expected_decoder.t2.reg(inst)))
938 // << "Expected UNPREDICTABLE for " << InstContents();
841 939
842 return true; 940 return true;
843 } 941 }
844 942
943 // LoadStore3RegisterImm5OpTester
944 LoadStore3RegisterImm5OpTester::LoadStore3RegisterImm5OpTester(
945 const NamedClassDecoder& decoder) : Arm32DecoderTester(decoder) {}
946
947 bool LoadStore3RegisterImm5OpTester::
948 ApplySanityChecks(Instruction inst,
949 const NamedClassDecoder& decoder) {
950 nacl_arm_dec::LoadStore3RegisterImm5Op expected_decoder;
951 // Check that condition is defined correctly.
952 EXPECT_EQ(expected_decoder.cond.value(inst), inst.Bits(31, 28));
953
954 // Didn't parse undefined conditional.
955 if (expected_decoder.cond.undefined(inst)) {
956 NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder);
957 }
958
959 // Should not parse if P=0 && W=1.
960 if (expected_decoder.indexing.IsPostIndexing(inst) &&
961 expected_decoder.writes.IsDefined(inst)) {
962 NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder);
963 }
964
965 // Check if expected class name found.
966 NC_PRECOND(Arm32DecoderTester::ApplySanityChecks(inst, decoder));
967
968 // Check Registers and flags used.
969 EXPECT_TRUE(expected_decoder.m.reg(inst).Equals(inst.Reg(3, 0)));
970 EXPECT_TRUE(expected_decoder.t.reg(inst).Equals(inst.Reg(15, 12)));
971 EXPECT_TRUE(expected_decoder.n.reg(inst).Equals(inst.Reg(19, 16)));
972 EXPECT_EQ(expected_decoder.writes.IsDefined(inst), inst.Bit(21));
973 EXPECT_EQ(expected_decoder.direction.IsAdd(inst), inst.Bit(23));
974 EXPECT_EQ(expected_decoder.indexing.IsPreIndexing(inst), inst.Bit(24));
975
976 // Check that immediate value is computed correctly.
977 EXPECT_EQ(expected_decoder.imm.value(inst), inst.Bits(11, 7));
978 EXPECT_EQ(expected_decoder.shift_type.value(inst), inst.Bits(6, 5));
979
980 // Other ARM constraints about this instruction.
981 EXPECT_FALSE(expected_decoder.t.reg(inst).Equals(kRegisterPc))
982 << "Expected UNPREDICTABLE for " << InstContents();
983
984 // NOTE: The manual states that that it is also unpredictable
985 // when HasWriteBack(i) and Rn=Rt. However, the compilers
986 // may not check for this. For the moment, we are changing
987 // the code to ignore this case for loads and store.
988 // TODO(karl): Should we not allow this?
989 // EXPECT_FALSE(expected_decoder.HasWriteBack(inst) &&
990 // (expected_decoder.n.reg(inst).Equals(kRegisterPc) ||
991 // expected_decoder.n.reg(inst).Equals(
992 // expected_decoder.t.reg(inst))))
993 // << "Expected UNPREDICTABLE for " << InstContents();
994
995 // Other NaCl constraints about this instruction.
996 EXPECT_FALSE(ExpectedDecoder().defs(inst).Contains(kRegisterPc))
997 << "Expected FORBIDDEN_OPERANDS for " << InstContents();
998
999 return true;
1000 }
1001
845 // Unary2RegisterImmedShiftedOpTester 1002 // Unary2RegisterImmedShiftedOpTester
846 Unary2RegisterImmedShiftedOpTester::Unary2RegisterImmedShiftedOpTester( 1003 Unary2RegisterImmedShiftedOpTester::Unary2RegisterImmedShiftedOpTester(
847 const NamedClassDecoder& decoder) 1004 const NamedClassDecoder& decoder)
848 : Arm32DecoderTester(decoder) {} 1005 : Arm32DecoderTester(decoder) {}
849 1006
850 bool Unary2RegisterImmedShiftedOpTester:: 1007 bool Unary2RegisterImmedShiftedOpTester::
851 ApplySanityChecks(Instruction inst, 1008 ApplySanityChecks(Instruction inst,
852 const NamedClassDecoder& decoder) { 1009 const NamedClassDecoder& decoder) {
853 nacl_arm_dec::Unary2RegisterImmedShiftedOp expected_decoder; 1010 nacl_arm_dec::Unary2RegisterImmedShiftedOp expected_decoder;
854 1011
(...skipping 373 matching lines...) Expand 10 before | Expand all | Expand 10 after
1228 << "Expected Unpredictable for " << InstContents(); 1385 << "Expected Unpredictable for " << InstContents();
1229 EXPECT_FALSE(expected_decoder.s.reg(inst).Equals(kRegisterPc)) 1386 EXPECT_FALSE(expected_decoder.s.reg(inst).Equals(kRegisterPc))
1230 << "Expected Unpredictable for " << InstContents(); 1387 << "Expected Unpredictable for " << InstContents();
1231 EXPECT_FALSE(expected_decoder.m.reg(inst).Equals(kRegisterPc)) 1388 EXPECT_FALSE(expected_decoder.m.reg(inst).Equals(kRegisterPc))
1232 << "Expected Unpredictable for " << InstContents(); 1389 << "Expected Unpredictable for " << InstContents();
1233 1390
1234 return true; 1391 return true;
1235 } 1392 }
1236 1393
1237 } // namespace 1394 } // namespace
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698