| 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 625 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |