| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |