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

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 726 matching lines...) Expand 10 before | Expand all | Expand 10 after
737 EXPECT_FALSE(expected_decoder.d_lo.reg(inst).Equals(kRegisterPc)) 737 EXPECT_FALSE(expected_decoder.d_lo.reg(inst).Equals(kRegisterPc))
738 << "Expected Unpredictable for " << InstContents(); 738 << "Expected Unpredictable for " << InstContents();
739 EXPECT_FALSE(expected_decoder.m.reg(inst).Equals(kRegisterPc)) 739 EXPECT_FALSE(expected_decoder.m.reg(inst).Equals(kRegisterPc))
740 << "Expected Unpredictable for " << InstContents(); 740 << "Expected Unpredictable for " << InstContents();
741 EXPECT_FALSE(expected_decoder.n.reg(inst).Equals(kRegisterPc)) 741 EXPECT_FALSE(expected_decoder.n.reg(inst).Equals(kRegisterPc))
742 << "Expected Unpredictable for " << InstContents(); 742 << "Expected Unpredictable for " << InstContents();
743 743
744 return true; 744 return true;
745 } 745 }
746 746
747 // LoadStore2RegisterImmediateOpTester 747 // LoadStore2RegisterImm8OpTester
748 LoadStore2RegisterImmediateOpTester::LoadStore2RegisterImmediateOpTester( 748 LoadStore2RegisterImm8OpTester::LoadStore2RegisterImm8OpTester(
749 const NamedClassDecoder& decoder) : Arm32DecoderTester(decoder) {} 749 const NamedClassDecoder& decoder) : Arm32DecoderTester(decoder) {}
750 750
751 bool LoadStore2RegisterImmediateOpTester:: 751 bool LoadStore2RegisterImm8OpTester::
752 ApplySanityChecks(Instruction inst, 752 ApplySanityChecks(Instruction inst,
753 const NamedClassDecoder& decoder) { 753 const NamedClassDecoder& decoder) {
754 nacl_arm_dec::LoadStore2RegisterImmediateOp expected_decoder; 754 nacl_arm_dec::LoadStore2RegisterImm8Op expected_decoder;
755 // Check that condition is defined correctly. 755 // Check that condition is defined correctly.
756 EXPECT_EQ(expected_decoder.cond.value(inst), inst.Bits(31, 28)); 756 EXPECT_EQ(expected_decoder.cond.value(inst), inst.Bits(31, 28));
757 757
758 // Didn't parse undefined conditional. 758 // Didn't parse undefined conditional.
759 if (expected_decoder.cond.undefined(inst)) { 759 if (expected_decoder.cond.undefined(inst)) {
760 NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder); 760 NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder);
761 } 761 }
762 762
763 // Should not parse if P=0 && W=1. 763 // Should not parse if P=0 && W=1.
764 if (expected_decoder.indexing.IsPostIndexing(inst) && 764 if (expected_decoder.indexing.IsPostIndexing(inst) &&
765 expected_decoder.writes.IsDefined(inst)) { 765 expected_decoder.writes.IsDefined(inst)) {
766 NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder); 766 NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder);
767 } 767 }
768 768
769 // Check if expected class name found. 769 // Check if expected class name found.
770 NC_PRECOND(Arm32DecoderTester::ApplySanityChecks(inst, decoder)); 770 NC_PRECOND(Arm32DecoderTester::ApplySanityChecks(inst, decoder));
771 771
772 // Check Registers and flags used. 772 // Check Registers and flags used.
773 EXPECT_TRUE(expected_decoder.t.reg(inst).Equals(inst.Reg(15, 12))); 773 EXPECT_TRUE(expected_decoder.t.reg(inst).Equals(inst.Reg(15, 12)));
774 EXPECT_TRUE(expected_decoder.n.reg(inst).Equals(inst.Reg(19, 16))); 774 EXPECT_TRUE(expected_decoder.n.reg(inst).Equals(inst.Reg(19, 16)));
775 EXPECT_EQ(expected_decoder.writes.IsDefined(inst), inst.Bit(21)); 775 EXPECT_EQ(expected_decoder.writes.IsDefined(inst), inst.Bit(21));
776 EXPECT_EQ(expected_decoder.direction.IsAdd(inst), inst.Bit(23)); 776 EXPECT_EQ(expected_decoder.direction.IsAdd(inst), inst.Bit(23));
777 EXPECT_EQ(expected_decoder.indexing.IsPreIndexing(inst), inst.Bit(24)); 777 EXPECT_EQ(expected_decoder.indexing.IsPreIndexing(inst), inst.Bit(24));
778 778
779 // Other ARM constraints about this instruction. 779 // Other ARM constraints about this instruction.
780 EXPECT_FALSE(expected_decoder.t.reg(inst).Equals(kRegisterPc)) 780 EXPECT_FALSE(expected_decoder.t.reg(inst).Equals(kRegisterPc))
781 << "Expected UNPREDICTABLE for " << InstContents(); 781 << "Expected UNPREDICTABLE for " << InstContents();
782 782
783 EXPECT_FALSE(expected_decoder.HasWriteBack(inst) && 783 // NOTE: The manual states that that it is also unpredictable
784 (expected_decoder.n.reg(inst).Equals(kRegisterPc) || 784 // when HasWriteBack(i) and Rn=Rt. However, the compilers
785 expected_decoder.n.reg(inst).Equals( 785 // may not check for this. For the moment, we are changing
786 expected_decoder.t.reg(inst)))) 786 // the code to ignore this case for loads and store.
787 << "Expected UNPREDICTABLE for " << InstContents(); 787 // TODO(karl): Should we not allow this?
788 // EXPECT_FALSE(expected_decoder.HasWriteBack(inst) &&
789 // (expected_decoder.n.reg(inst).Equals(kRegisterPc) ||
790 // expected_decoder.n.reg(inst).Equals(
791 // expected_decoder.t.reg(inst))))
792 // << "Expected UNPREDICTABLE for " << InstContents();
788 793
789 // Other NaCl constraints about this instruction. 794 // Other NaCl constraints about this instruction.
790 EXPECT_FALSE(ExpectedDecoder().defs(inst).Contains(kRegisterPc)) 795 EXPECT_FALSE(ExpectedDecoder().defs(inst).Contains(kRegisterPc))
791 << "Expected FORBIDDEN_OPERANDS for " << InstContents(); 796 << "Expected FORBIDDEN_OPERANDS for " << InstContents();
792 797
793 return true; 798 return true;
794 } 799 }
795 800
796 // LoadStore2RegisterImmediateOpTesterNotRnIsPc 801 // LoadStore2RegisterImm8OpTesterNotRnIsPc
797 LoadStore2RegisterImmediateOpTesterNotRnIsPc:: 802 LoadStore2RegisterImm8OpTesterNotRnIsPc::
798 LoadStore2RegisterImmediateOpTesterNotRnIsPc( 803 LoadStore2RegisterImm8OpTesterNotRnIsPc(
799 const NamedClassDecoder& decoder) 804 const NamedClassDecoder& decoder)
800 : LoadStore2RegisterImmediateOpTester(decoder) {} 805 : LoadStore2RegisterImm8OpTester(decoder) {}
801 806
802 bool LoadStore2RegisterImmediateOpTesterNotRnIsPc:: 807 bool LoadStore2RegisterImm8OpTesterNotRnIsPc::
803 ApplySanityChecks(Instruction inst, 808 ApplySanityChecks(Instruction inst,
804 const NamedClassDecoder& decoder) { 809 const NamedClassDecoder& decoder) {
805 nacl_arm_dec::LoadStore2RegisterImmediateOp expected_decoder; 810 nacl_arm_dec::LoadStore2RegisterImm8Op expected_decoder;
806 811
807 // Check that we don't parse when Rn=15. 812 // Check that we don't parse when Rn=15.
808 if (expected_decoder.n.reg(inst).Equals(kRegisterPc)) { 813 if (expected_decoder.n.reg(inst).Equals(kRegisterPc)) {
809 NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder); 814 NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder);
810 } 815 }
811 816
812 return LoadStore2RegisterImmediateOpTester::ApplySanityChecks(inst, decoder); 817 return LoadStore2RegisterImm8OpTester::ApplySanityChecks(inst, decoder);
813 } 818 }
814 819
815 // LoadStore2RegisterImmediateDoubleOpTester 820 // LoadStore2RegisterImm8DoubleOpTester
816 LoadStore2RegisterImmediateDoubleOpTester:: 821 LoadStore2RegisterImm8DoubleOpTester::
817 LoadStore2RegisterImmediateDoubleOpTester(const NamedClassDecoder& decoder) 822 LoadStore2RegisterImm8DoubleOpTester(const NamedClassDecoder& decoder)
818 : LoadStore2RegisterImmediateOpTester(decoder) {} 823 : LoadStore2RegisterImm8OpTester(decoder) {}
819 824
820 bool LoadStore2RegisterImmediateDoubleOpTester:: 825 bool LoadStore2RegisterImm8DoubleOpTester::
821 ApplySanityChecks(Instruction inst, 826 ApplySanityChecks(Instruction inst,
822 const NamedClassDecoder& decoder) { 827 const NamedClassDecoder& decoder) {
823 NC_PRECOND(LoadStore2RegisterImmediateOpTester:: 828 NC_PRECOND(LoadStore2RegisterImm8OpTester::
824 ApplySanityChecks(inst, decoder)); 829 ApplySanityChecks(inst, decoder));
825 830
826 // Check Registers and flags used. 831 // Check Registers and flags used.
827 nacl_arm_dec::LoadStore2RegisterImmediateDoubleOp expected_decoder; 832 nacl_arm_dec::LoadStore2RegisterImm8DoubleOp expected_decoder;
828 EXPECT_EQ(expected_decoder.t.number(inst) + 1, 833 EXPECT_EQ(expected_decoder.t.number(inst) + 1,
829 expected_decoder.t2.number(inst)); 834 expected_decoder.t2.number(inst));
830 835
831 // Other ARM constraints about this instruction. 836 // Other ARM constraints about this instruction.
832 EXPECT_TRUE(expected_decoder.t.IsEven(inst)); 837 EXPECT_TRUE(expected_decoder.t.IsEven(inst));
833 EXPECT_NE(expected_decoder.t2.number(inst), static_cast<uint32_t>(15)) 838 EXPECT_NE(expected_decoder.t2.number(inst), static_cast<uint32_t>(15))
834 << "Expected UNPREDICTABLE for " << InstContents(); 839 << "Expected UNPREDICTABLE for " << InstContents();
835 EXPECT_FALSE(expected_decoder.HasWriteBack(inst) && 840
836 expected_decoder.n.reg(inst).Equals( 841 // NOTE: The manual states that that it is also unpredictable
837 expected_decoder.t2.reg(inst))) 842 // when HasWriteBack(i) and Rn=Rt. However, the compilers
838 << "Expected UNPREDICTABLE for " << InstContents(); 843 // may not check for this. For the moment, we are changing
844 // the code to ignore this case for loads and store.
845 // TODO(karl): Should we not allow this?
846 // EXPECT_FALSE(expected_decoder.HasWriteBack(inst) &&
847 // expected_decoder.n.reg(inst).Equals(
848 // expected_decoder.t2.reg(inst)))
849 // << "Expected UNPREDICTABLE for " << InstContents();
839 850
840 return true; 851 return true;
841 } 852 }
842 853
843 // LoadStore2RegisterImmediateDoubleOpTesterNotRnIsPc 854 // LoadStore2RegisterImm8DoubleOpTesterNotRnIsPc
844 LoadStore2RegisterImmediateDoubleOpTesterNotRnIsPc:: 855 LoadStore2RegisterImm8DoubleOpTesterNotRnIsPc::
845 LoadStore2RegisterImmediateDoubleOpTesterNotRnIsPc( 856 LoadStore2RegisterImm8DoubleOpTesterNotRnIsPc(
846 const NamedClassDecoder& decoder) 857 const NamedClassDecoder& decoder)
847 : LoadStore2RegisterImmediateDoubleOpTester(decoder) {} 858 : LoadStore2RegisterImm8DoubleOpTester(decoder) {}
848 859
849 bool LoadStore2RegisterImmediateDoubleOpTesterNotRnIsPc:: 860 bool LoadStore2RegisterImm8DoubleOpTesterNotRnIsPc::
850 ApplySanityChecks(Instruction inst, 861 ApplySanityChecks(Instruction inst,
851 const NamedClassDecoder& decoder) { 862 const NamedClassDecoder& decoder) {
852 nacl_arm_dec::LoadStore2RegisterImmediateDoubleOp expected_decoder; 863 nacl_arm_dec::LoadStore2RegisterImm8DoubleOp expected_decoder;
853 864
854 // Check that we don't parse when Rn=15. 865 // Check that we don't parse when Rn=15.
855 if (expected_decoder.n.reg(inst).Equals(kRegisterPc)) { 866 if (expected_decoder.n.reg(inst).Equals(kRegisterPc)) {
856 NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder); 867 NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder);
857 } 868 }
858 869
859 return LoadStore2RegisterImmediateDoubleOpTester:: 870 return LoadStore2RegisterImm8DoubleOpTester::
860 ApplySanityChecks(inst, decoder); 871 ApplySanityChecks(inst, decoder);
861 } 872 }
862 873
874 // LoadStore2RegisterImm12OpTester
875 LoadStore2RegisterImm12OpTester::LoadStore2RegisterImm12OpTester(
876 const NamedClassDecoder& decoder) : Arm32DecoderTester(decoder) {}
877
878 bool LoadStore2RegisterImm12OpTester::
879 ApplySanityChecks(Instruction inst,
880 const NamedClassDecoder& decoder) {
881 nacl_arm_dec::LoadStore2RegisterImm12Op expected_decoder;
882 // Check that condition is defined correctly.
883 EXPECT_EQ(expected_decoder.cond.value(inst), inst.Bits(31, 28));
884
885 // Didn't parse undefined conditional.
886 if (expected_decoder.cond.undefined(inst)) {
887 NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder);
888 }
889
890 // Should not parse if P=0 && W=1.
891 if (expected_decoder.indexing.IsPostIndexing(inst) &&
892 expected_decoder.writes.IsDefined(inst)) {
893 NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder);
894 }
895
896 // Check if expected class name found.
897 NC_PRECOND(Arm32DecoderTester::ApplySanityChecks(inst, decoder));
898
899 // Check Registers and flags used.
900 EXPECT_EQ(expected_decoder.imm12.value(inst), inst.Bits(11, 0));
901 EXPECT_TRUE(expected_decoder.t.reg(inst).Equals(inst.Reg(15, 12)));
902 EXPECT_TRUE(expected_decoder.n.reg(inst).Equals(inst.Reg(19, 16)));
903 EXPECT_EQ(expected_decoder.writes.IsDefined(inst), inst.Bit(21));
904 EXPECT_EQ(expected_decoder.direction.IsAdd(inst), inst.Bit(23));
905 EXPECT_EQ(expected_decoder.indexing.IsPreIndexing(inst), inst.Bit(24));
906
907 // Other ARM constraints about this instruction.
908 EXPECT_FALSE(expected_decoder.t.reg(inst).Equals(kRegisterPc))
909 << "Expected UNPREDICTABLE for " << InstContents();
910
911 // NOTE: The manual states that that it is also unpredictable
912 // when HasWriteBack(i) and Rn=Rt. However, the compilers
913 // may not check for this. For the moment, we are changing
914 // the code to ignore this case for loads and store.
915 // TODO(karl): Should we not allow this?
916 // EXPECT_FALSE(expected_decoder.HasWriteBack(inst) &&
917 // (expected_decoder.n.reg(inst).Equals(kRegisterPc) ||
918 // expected_decoder.n.reg(inst).Equals(
919 // expected_decoder.t.reg(inst))))
920 // << "Expected UNPREDICTABLE for " << InstContents();
921
922 // Other NaCl constraints about this instruction.
923 EXPECT_FALSE(ExpectedDecoder().defs(inst).Contains(kRegisterPc))
924 << "Expected FORBIDDEN_OPERANDS for " << InstContents();
925
926 return true;
927 }
928
929 // LoadStore2RegisterImm12OpTesterNotRnIsPc
930 LoadStore2RegisterImm12OpTesterNotRnIsPc::
931 LoadStore2RegisterImm12OpTesterNotRnIsPc(
932 const NamedClassDecoder& decoder)
933 : LoadStore2RegisterImm12OpTester(decoder) {}
934
935 bool LoadStore2RegisterImm12OpTesterNotRnIsPc::
936 ApplySanityChecks(Instruction inst,
937 const NamedClassDecoder& decoder) {
938 nacl_arm_dec::LoadStore2RegisterImm12Op expected_decoder;
939
940 // Check that we don't parse when Rn=15.
941 if (expected_decoder.n.reg(inst).Equals(kRegisterPc)) {
942 NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder);
943 }
944
945 return LoadStore2RegisterImm12OpTester::ApplySanityChecks(inst, decoder);
946 }
947
948
863 // LoadStore3RegisterOpTester 949 // LoadStore3RegisterOpTester
864 LoadStore3RegisterOpTester::LoadStore3RegisterOpTester( 950 LoadStore3RegisterOpTester::LoadStore3RegisterOpTester(
865 const NamedClassDecoder& decoder) : Arm32DecoderTester(decoder) {} 951 const NamedClassDecoder& decoder) : Arm32DecoderTester(decoder) {}
866 952
867 bool LoadStore3RegisterOpTester:: 953 bool LoadStore3RegisterOpTester::
868 ApplySanityChecks(Instruction inst, 954 ApplySanityChecks(Instruction inst,
869 const NamedClassDecoder& decoder) { 955 const NamedClassDecoder& decoder) {
870 nacl_arm_dec::LoadStore3RegisterOp expected_decoder; 956 nacl_arm_dec::LoadStore3RegisterOp expected_decoder;
871 957
872 // Check that condition is defined correctly. 958 // Check that condition is defined correctly.
(...skipping 19 matching lines...) Expand all
892 EXPECT_TRUE(expected_decoder.n.reg(inst).Equals(inst.Reg(19, 16))); 978 EXPECT_TRUE(expected_decoder.n.reg(inst).Equals(inst.Reg(19, 16)));
893 EXPECT_EQ(expected_decoder.writes.IsDefined(inst), inst.Bit(21)); 979 EXPECT_EQ(expected_decoder.writes.IsDefined(inst), inst.Bit(21));
894 EXPECT_EQ(expected_decoder.direction.IsAdd(inst), inst.Bit(23)); 980 EXPECT_EQ(expected_decoder.direction.IsAdd(inst), inst.Bit(23));
895 EXPECT_EQ(expected_decoder.indexing.IsPreIndexing(inst), inst.Bit(24)); 981 EXPECT_EQ(expected_decoder.indexing.IsPreIndexing(inst), inst.Bit(24));
896 982
897 // Other ARM constraints about this instruction. 983 // Other ARM constraints about this instruction.
898 EXPECT_FALSE(expected_decoder.n.reg(inst).Equals(kRegisterPc)) 984 EXPECT_FALSE(expected_decoder.n.reg(inst).Equals(kRegisterPc))
899 << "Expected UNPREDICTABLE for " << InstContents(); 985 << "Expected UNPREDICTABLE for " << InstContents();
900 EXPECT_FALSE(expected_decoder.t.reg(inst).Equals(kRegisterPc)) 986 EXPECT_FALSE(expected_decoder.t.reg(inst).Equals(kRegisterPc))
901 << "Expected UNPREDICTABLE for " << InstContents(); 987 << "Expected UNPREDICTABLE for " << InstContents();
902 EXPECT_FALSE(expected_decoder.HasWriteBack(inst) && 988
903 (expected_decoder.n.reg(inst).Equals(kRegisterPc) || 989 // NOTE: The manual states that that it is also unpredictable
904 expected_decoder.n.reg(inst).Equals( 990 // when HasWriteBack(i) and Rn=Rt. However, the compilers
905 expected_decoder.t.reg(inst)))) 991 // may not check for this. For the moment, we are changing
906 << "Expected UNPREDICTABLE for " << InstContents(); 992 // the code to ignore this case for loads and stores.
993 // TODO(karl): Should we not allow this?
994 // EXPECT_FALSE(expected_decoder.HasWriteBack(inst) &&
995 // (expected_decoder.n.reg(inst).Equals(kRegisterPc) ||
996 // expected_decoder.n.reg(inst).Equals(
997 // expected_decoder.t.reg(inst))))
998 // << "Expected UNPREDICTABLE for " << InstContents();
907 999
908 // Other NaCl constraints about this instruction. 1000 // Other NaCl constraints about this instruction.
909 EXPECT_FALSE(expected_decoder.indexing.IsPreIndexing(inst)) 1001 EXPECT_FALSE(expected_decoder.indexing.IsPreIndexing(inst))
910 << "Expected FORBIDDEN for " << InstContents(); 1002 << "Expected FORBIDDEN for " << InstContents();
911 1003
912 EXPECT_FALSE(ExpectedDecoder().defs(inst).Contains(kRegisterPc)) 1004 EXPECT_FALSE(ExpectedDecoder().defs(inst).Contains(kRegisterPc))
913 << "Expected FORBIDDEN_OPERANDS for " << InstContents(); 1005 << "Expected FORBIDDEN_OPERANDS for " << InstContents();
914 1006
915 return true; 1007 return true;
916 } 1008 }
(...skipping 11 matching lines...) Expand all
928 1020
929 // Check Registers and flags used. 1021 // Check Registers and flags used.
930 nacl_arm_dec::LoadStore3RegisterDoubleOp expected_decoder; 1022 nacl_arm_dec::LoadStore3RegisterDoubleOp expected_decoder;
931 EXPECT_EQ(expected_decoder.t.number(inst) + 1, 1023 EXPECT_EQ(expected_decoder.t.number(inst) + 1,
932 expected_decoder.t2.number(inst)); 1024 expected_decoder.t2.number(inst));
933 1025
934 // Other ARM constraints about this instruction. 1026 // Other ARM constraints about this instruction.
935 EXPECT_TRUE(expected_decoder.t.IsEven(inst)); 1027 EXPECT_TRUE(expected_decoder.t.IsEven(inst));
936 EXPECT_NE(expected_decoder.t2.number(inst), static_cast<uint32_t>(15)) 1028 EXPECT_NE(expected_decoder.t2.number(inst), static_cast<uint32_t>(15))
937 << "Expected UNPREDICTABLE for " << InstContents(); 1029 << "Expected UNPREDICTABLE for " << InstContents();
938 EXPECT_FALSE(expected_decoder.HasWriteBack(inst) && 1030
939 expected_decoder.n.reg(inst).Equals( 1031 // NOTE: The manual states that that it is also unpredictable
940 expected_decoder.t2.reg(inst))) 1032 // when HasWriteBack(i) and Rn=Rt. However, the compilers
941 << "Expected UNPREDICTABLE for " << InstContents(); 1033 // may not check for this. For the moment, we are changing
1034 // the code to ignore this case for loads and stores.
1035 // TODO(karl): Should we not allow this?
1036 // EXPECT_FALSE(expected_decoder.HasWriteBack(inst) &&
1037 // expected_decoder.n.reg(inst).Equals(
1038 // expected_decoder.t2.reg(inst)))
1039 // << "Expected UNPREDICTABLE for " << InstContents();
942 1040
943 return true; 1041 return true;
944 } 1042 }
945 1043
1044 // LoadStore3RegisterImm5OpTester
1045 LoadStore3RegisterImm5OpTester::LoadStore3RegisterImm5OpTester(
1046 const NamedClassDecoder& decoder) : Arm32DecoderTester(decoder) {}
1047
1048 bool LoadStore3RegisterImm5OpTester::
1049 ApplySanityChecks(Instruction inst,
1050 const NamedClassDecoder& decoder) {
1051 nacl_arm_dec::LoadStore3RegisterImm5Op expected_decoder;
1052 // Check that condition is defined correctly.
1053 EXPECT_EQ(expected_decoder.cond.value(inst), inst.Bits(31, 28));
1054
1055 // Didn't parse undefined conditional.
1056 if (expected_decoder.cond.undefined(inst)) {
1057 NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder);
1058 }
1059
1060 // Should not parse if P=0 && W=1.
1061 if (expected_decoder.indexing.IsPostIndexing(inst) &&
1062 expected_decoder.writes.IsDefined(inst)) {
1063 NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder);
1064 }
1065
1066 // Check if expected class name found.
1067 NC_PRECOND(Arm32DecoderTester::ApplySanityChecks(inst, decoder));
1068
1069 // Check Registers and flags used.
1070 EXPECT_TRUE(expected_decoder.m.reg(inst).Equals(inst.Reg(3, 0)));
1071 EXPECT_TRUE(expected_decoder.t.reg(inst).Equals(inst.Reg(15, 12)));
1072 EXPECT_TRUE(expected_decoder.n.reg(inst).Equals(inst.Reg(19, 16)));
1073 EXPECT_EQ(expected_decoder.writes.IsDefined(inst), inst.Bit(21));
1074 EXPECT_EQ(expected_decoder.direction.IsAdd(inst), inst.Bit(23));
1075 EXPECT_EQ(expected_decoder.indexing.IsPreIndexing(inst), inst.Bit(24));
1076
1077 // Check that immediate value is computed correctly.
1078 EXPECT_EQ(expected_decoder.imm.value(inst), inst.Bits(11, 7));
1079 EXPECT_EQ(expected_decoder.shift_type.value(inst), inst.Bits(6, 5));
1080
1081 // Other ARM constraints about this instruction.
1082 EXPECT_FALSE(expected_decoder.t.reg(inst).Equals(kRegisterPc))
1083 << "Expected UNPREDICTABLE for " << InstContents();
1084
1085 // NOTE: The manual states that that it is also unpredictable
1086 // when HasWriteBack(i) and Rn=Rt. However, the compilers
1087 // may not check for this. For the moment, we are changing
1088 // the code to ignore this case for loads and store.
1089 // TODO(karl): Should we not allow this?
1090 // EXPECT_FALSE(expected_decoder.HasWriteBack(inst) &&
1091 // (expected_decoder.n.reg(inst).Equals(kRegisterPc) ||
1092 // expected_decoder.n.reg(inst).Equals(
1093 // expected_decoder.t.reg(inst))))
1094 // << "Expected UNPREDICTABLE for " << InstContents();
1095
1096 // Other NaCl constraints about this instruction.
1097 EXPECT_FALSE(ExpectedDecoder().defs(inst).Contains(kRegisterPc))
1098 << "Expected FORBIDDEN_OPERANDS for " << InstContents();
1099
1100 return true;
1101 }
1102
946 // Unary2RegisterImmedShiftedOpTester 1103 // Unary2RegisterImmedShiftedOpTester
947 Unary2RegisterImmedShiftedOpTester::Unary2RegisterImmedShiftedOpTester( 1104 Unary2RegisterImmedShiftedOpTester::Unary2RegisterImmedShiftedOpTester(
948 const NamedClassDecoder& decoder) 1105 const NamedClassDecoder& decoder)
949 : Arm32DecoderTester(decoder) {} 1106 : Arm32DecoderTester(decoder) {}
950 1107
951 bool Unary2RegisterImmedShiftedOpTester:: 1108 bool Unary2RegisterImmedShiftedOpTester::
952 ApplySanityChecks(Instruction inst, 1109 ApplySanityChecks(Instruction inst,
953 const NamedClassDecoder& decoder) { 1110 const NamedClassDecoder& decoder) {
954 nacl_arm_dec::Unary2RegisterImmedShiftedOp expected_decoder; 1111 nacl_arm_dec::Unary2RegisterImmedShiftedOp expected_decoder;
955 1112
(...skipping 373 matching lines...) Expand 10 before | Expand all | Expand 10 after
1329 << "Expected Unpredictable for " << InstContents(); 1486 << "Expected Unpredictable for " << InstContents();
1330 EXPECT_FALSE(expected_decoder.s.reg(inst).Equals(kRegisterPc)) 1487 EXPECT_FALSE(expected_decoder.s.reg(inst).Equals(kRegisterPc))
1331 << "Expected Unpredictable for " << InstContents(); 1488 << "Expected Unpredictable for " << InstContents();
1332 EXPECT_FALSE(expected_decoder.m.reg(inst).Equals(kRegisterPc)) 1489 EXPECT_FALSE(expected_decoder.m.reg(inst).Equals(kRegisterPc))
1333 << "Expected Unpredictable for " << InstContents(); 1490 << "Expected Unpredictable for " << InstContents();
1334 1491
1335 return true; 1492 return true;
1336 } 1493 }
1337 1494
1338 } // namespace 1495 } // namespace
OLDNEW
« no previous file with comments | « src/trusted/validator_arm/inst_classes_testers.h ('k') | src/trusted/validator_arm/testdata/test_loads.err » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698