519 } 520}}; 521 522def format Thumb32LoadWord() {{ 523 decode = ''' 524 { 525 uint32_t op1 = bits(machInst, 24, 23); 526 if (bits(op1, 1) == 0) { 527 uint32_t op2 = bits(machInst, 11, 6); 528 if (HTRN == 0xF) { 529 if (UP) { 530 return new %(literal_u)s(machInst, RT, INTREG_PC, 531 true, IMMED_11_0); 532 } else { 533 return new %(literal)s(machInst, RT, INTREG_PC, 534 false, IMMED_11_0); 535 } 536 } else if (op1 == 0x1) { 537 return new %(imm_pu)s(machInst, RT, RN, true, IMMED_11_0); 538 } else if (op2 == 0) { 539 return new %(register)s(machInst, RT, RN, UP, 540 bits(machInst, 5, 4), LSL, RM); 541 } else if ((op2 & 0x3c) == 0x38) { 542 return new %(ldrt)s(machInst, RT, RN, true, IMMED_7_0); 543 } else if ((op2 & 0x3c) == 0x30 || //P 544 (op2 & 0x24) == 0x24) { //W 545 uint32_t puw = bits(machInst, 10, 8); 546 uint32_t imm = IMMED_7_0; 547 switch (puw) { 548 case 0: 549 case 2: 550 // If we're here, either P or W must have been set. 551 panic("Neither P or W set, but that " 552 "shouldn't be possible.\\n"); 553 case 1: 554 return new %(imm_w)s(machInst, RT, RN, false, imm); 555 case 3: 556 return new %(imm_uw)s(machInst, RT, RN, true, imm); 557 case 4: 558 return new %(imm_p)s(machInst, RT, RN, false, imm); 559 case 5: 560 return new %(imm_pw)s(machInst, RT, RN, false, imm); 561 case 6: 562 return new %(imm_pu)s(machInst, RT, RN, true, imm); 563 case 7: 564 return new %(imm_puw)s(machInst, RT, RN, true, imm); 565 } 566 } 567 return new Unknown(machInst); 568 } else { 569 return new Unknown(machInst); 570 } 571 } 572 ''' 573 classNames = { 574 "literal_u" : loadImmClassName(False, True, False), 575 "literal" : loadImmClassName(False, False, False), 576 "register" : loadRegClassName(False, True, False), 577 "ldrt" : loadImmClassName(False, True, False, user=True), 578 "imm_w" : loadImmClassName(True, False, True), 579 "imm_uw" : loadImmClassName(True, True, True), 580 "imm_p" : loadImmClassName(False, False, False), 581 "imm_pw" : loadImmClassName(False, False, True), 582 "imm_pu" : loadImmClassName(False, True, False), 583 "imm_puw" : loadImmClassName(False, True, True) 584 } 585 decode_block = decode % classNames 586}}; 587 588def format Thumb32StoreSingle() {{ 589 def buildPuwDecode(size): 590 puwDecode = ''' 591 { 592 uint32_t puw = bits(machInst, 10, 8); 593 uint32_t imm = IMMED_7_0; 594 switch (puw) { 595 case 0: 596 case 2: 597 // If we're here, either P or W must have been set. 598 panic("Neither P or W set, but that " 599 "shouldn't be possible.\\n"); 600 case 1: 601 return new %(imm_w)s(machInst, RT, RN, false, imm); 602 case 3: 603 return new %(imm_uw)s(machInst, RT, RN, true, imm); 604 case 4: 605 return new %(imm_p)s(machInst, RT, RN, false, imm); 606 case 5: 607 return new %(imm_pw)s(machInst, RT, RN, false, imm); 608 case 6: 609 return new %(imm_pu)s(machInst, RT, RN, true, imm); 610 case 7: 611 return new %(imm_puw)s(machInst, RT, RN, true, imm); 612 default: 613 M5_UNREACHABLE; 614 } 615 } 616 ''' 617 return puwDecode % { 618 "imm_w" : storeImmClassName(True, False, True, size=size), 619 "imm_uw" : storeImmClassName(True, True, True, size=size), 620 "imm_p" : storeImmClassName(False, False, False, size=size), 621 "imm_pw" : storeImmClassName(False, False, True, size=size), 622 "imm_pu" : storeImmClassName(False, True, False, size=size), 623 "imm_puw" : storeImmClassName(False, True, True, size=size) 624 } 625 decode = ''' 626 { 627 uint32_t op1 = bits(machInst, 23, 21); 628 uint32_t op2 = bits(machInst, 11, 6); 629 bool op2Puw = ((op2 & 0x24) == 0x24 || 630 (op2 & 0x3c) == 0x30); 631 if (RN == 0xf) { 632 return new Unknown(machInst); 633 } 634 if (op1 == 4) { 635 return new %(strb_imm)s(machInst, RT, RN, true, IMMED_11_0); 636 } else if (op1 == 0 && op2Puw) { 637 %(strb_puw)s; 638 } else if (op1 == 0 && ((op2 & 0x3c) == 0x38)) { 639 return new %(strbt)s(machInst, RT, RN, true, IMMED_7_0); 640 } else if (op1 == 0 && op2 == 0) { 641 return new %(strb_reg)s(machInst, RT, RN, true, 642 bits(machInst, 5, 4), LSL, RM); 643 } else if (op1 == 5) { 644 return new %(strh_imm)s(machInst, RT, RN, true, IMMED_11_0); 645 } else if (op1 == 1 && op2Puw) { 646 %(strh_puw)s; 647 } else if (op1 == 1 && ((op2 & 0x3c) == 0x38)) { 648 return new %(strht)s(machInst, RT, RN, true, IMMED_7_0); 649 } else if (op1 == 1 && op2 == 0) { 650 return new %(strh_reg)s(machInst, RT, RN, true, 651 bits(machInst, 5, 4), LSL, RM); 652 } else if (op1 == 6) { 653 return new %(str_imm)s(machInst, RT, RN, true, IMMED_11_0); 654 } else if (op1 == 2 && op2Puw) { 655 %(str_puw)s; 656 } else if (op1 == 2 && ((op2 & 0x3c) == 0x38)) { 657 return new %(strt)s(machInst, RT, RN, true, IMMED_7_0); 658 } else if (op1 == 2 && op2 == 0) { 659 return new %(str_reg)s(machInst, RT, RN, true, 660 bits(machInst, 5, 4), LSL, RM); 661 } else { 662 return new Unknown(machInst); 663 } 664 } 665 ''' 666 classNames = { 667 "strb_imm" : storeImmClassName(False, True, False, size=1), 668 "strb_puw" : buildPuwDecode(1), 669 "strbt" : storeImmClassName(False, True, False, user=True, size=1), 670 "strb_reg" : storeRegClassName(False, True, False, size=1), 671 "strh_imm" : storeImmClassName(False, True, False, size=2), 672 "strh_puw" : buildPuwDecode(2), 673 "strht" : storeImmClassName(False, True, False, user=True, size=2), 674 "strh_reg" : storeRegClassName(False, True, False, size=2), 675 "str_imm" : storeImmClassName(False, True, False), 676 "str_puw" : buildPuwDecode(4), 677 "strt" : storeImmClassName(False, True, False, user=True), 678 "str_reg" : storeRegClassName(False, True, False) 679 } 680 decode_block = decode % classNames 681}}; 682 683def format LoadByteMemoryHints() {{ 684 decode = ''' 685 { 686 const uint32_t op1 = bits(machInst, 24, 23); 687 const uint32_t op2 = bits(machInst, 11, 6); 688 const IntRegIndex rn = (IntRegIndex)(uint32_t)bits(machInst, 19, 16); 689 const IntRegIndex rt = (IntRegIndex)(uint32_t)bits(machInst, 15, 12); 690 const IntRegIndex rm = (IntRegIndex)(uint32_t)bits(machInst, 3, 0); 691 const uint32_t imm12 = bits(machInst, 11, 0); 692 const uint32_t imm8 = bits(machInst, 7, 0); 693 bool pldw = bits(machInst, 21); 694 const uint32_t imm2 = bits(machInst, 5, 4); 695 if (rn == 0xf) { 696 if (rt == 0xf) { 697 const bool add = bits(machInst, 23); 698 if (bits(op1, 1) == 1) { 699 if (add) { 700 return new %(pli_iulit)s(machInst, INTREG_ZERO, 701 INTREG_PC, true, imm12); 702 } else { 703 return new %(pli_ilit)s(machInst, INTREG_ZERO, 704 INTREG_PC, false, imm12); 705 } 706 } else { 707 if (add) { 708 return new %(pld_iulit)s(machInst, INTREG_ZERO, 709 INTREG_PC, true, imm12); 710 } else { 711 return new %(pld_ilit)s(machInst, INTREG_ZERO, 712 INTREG_PC, false, imm12); 713 } 714 } 715 } else { 716 if (bits(op1, 1) == 1) { 717 if (bits(machInst, 23)) { 718 return new %(ldrsb_lit_u)s(machInst, rt, INTREG_PC, 719 true, imm12); 720 } else { 721 return new %(ldrsb_lit)s(machInst, rt, INTREG_PC, 722 false, imm12); 723 } 724 } else { 725 if (bits(machInst, 23)) { 726 return new %(ldrb_lit_u)s(machInst, rt, INTREG_PC, 727 true, imm12); 728 } else { 729 return new %(ldrb_lit)s(machInst, rt, INTREG_PC, 730 false, imm12); 731 } 732 } 733 } 734 } else if (rt == 0xf) { 735 switch (op1) { 736 case 0x0: 737 if (op2 == 0x0) { 738 if (pldw) { 739 return new %(pldw_radd)s(machInst, INTREG_ZERO, 740 rn, true, imm2, LSL, rm); 741 } else { 742 return new %(pld_radd)s(machInst, INTREG_ZERO, 743 rn, true, imm2, LSL, rm); 744 } 745 } else if (bits(op2, 5, 2) == 0xc) { 746 if (pldw) { 747 return new %(pldw_isub)s(machInst, INTREG_ZERO, 748 rn, false, imm8); 749 } else { 750 return new %(pld_isub)s(machInst, INTREG_ZERO, 751 rn, false, imm8); 752 } 753 } 754 break; 755 case 0x1: 756 if (pldw) { 757 return new %(pldw_iadd)s(machInst, INTREG_ZERO, 758 rn, true, imm12); 759 } else { 760 return new %(pld_iadd)s(machInst, INTREG_ZERO, 761 rn, true, imm12); 762 } 763 case 0x2: 764 if (op2 == 0x0) { 765 return new %(pli_radd)s(machInst, INTREG_ZERO, rn, 766 true, imm2, LSL, rm); 767 } else if (bits(op2, 5, 2) == 0xc) { 768 return new %(pli_ilit)s(machInst, INTREG_ZERO, 769 INTREG_PC, false, imm8); 770 } 771 break; 772 case 0x3: 773 return new %(pli_iulit)s(machInst, INTREG_ZERO, 774 INTREG_PC, true, imm12); 775 } 776 return new Unknown(machInst); 777 } else { 778 switch (op1) { 779 case 0x0: 780 if (op2 == 0) { 781 return new %(ldrb_radd)s(machInst, rt, rn, true, 782 imm2, LSL, rm); 783 } else if (bits(op2, 5, 2) == 0xe) { 784 return new %(ldrbt)s(machInst, rt, rn, true, imm8); 785 } else if ((op2 & 0x24) == 0x24 || bits(op2, 5, 2) == 0xc) { 786 const uint32_t puw = bits(machInst, 10, 8); 787 switch (puw) { 788 case 0x1: 789 return new %(ldrb_iw)s(machInst, rt, 790 rn, false, imm8); 791 case 0x3: 792 return new %(ldrb_iuw)s(machInst, rt, 793 rn, true, imm8); 794 case 0x4: 795 return new %(ldrb_ip)s(machInst, rt, 796 rn, false, imm8); 797 case 0x5: 798 return new %(ldrb_ipw)s(machInst, rt, 799 rn, false, imm8); 800 case 0x7: 801 return new %(ldrb_ipuw)s(machInst, rt, 802 rn, true, imm8); 803 } 804 } 805 break; 806 case 0x1: 807 return new %(ldrb_iadd)s(machInst, rt, rn, true, imm12); 808 case 0x2: 809 if (op2 == 0) { 810 return new %(ldrsb_radd)s(machInst, rt, rn, true, 811 imm2, LSL, rm); 812 } else if (bits(op2, 5, 2) == 0xe) { 813 return new %(ldrsbt)s(machInst, rt, rn, true, imm8); 814 } else if ((op2 & 0x24) == 0x24 || bits(op2, 5, 2) == 0xc) { 815 const uint32_t puw = bits(machInst, 10, 8); 816 switch (puw) { 817 case 0x1: 818 return new %(ldrsb_iw)s(machInst, rt, 819 rn, false, imm8); 820 case 0x3: 821 return new %(ldrsb_iuw)s(machInst, rt, 822 rn, true, imm8); 823 case 0x4: 824 return new %(ldrsb_ip)s(machInst, rt, 825 rn, false, imm8); 826 case 0x5: 827 return new %(ldrsb_ipw)s(machInst, rt, 828 rn, false, imm8); 829 case 0x7: 830 return new %(ldrsb_ipuw)s(machInst, rt, 831 rn, true, imm8); 832 } 833 } 834 break; 835 case 0x3: 836 return new %(ldrsb_iadd)s(machInst, rt, rn, true, imm12); 837 } 838 return new Unknown(machInst); 839 } 840 } 841 ''' 842 substDict = { 843 "ldrsb_lit_u" : loadImmClassName(False, True, False, 1, True), 844 "ldrsb_lit" : loadImmClassName(False, False, False, 1, True), 845 "ldrb_lit_u" : loadImmClassName(False, True, False, 1), 846 "ldrb_lit" : loadImmClassName(False, False, False, 1), 847 "ldrsb_radd" : loadRegClassName(False, True, False, 1, True), 848 "ldrb_radd" : loadRegClassName(False, True, False, 1), 849 "ldrsb_iw" : loadImmClassName(True, False, True, 1, True), 850 "ldrsb_iuw" : loadImmClassName(True, True, True, 1, True), 851 "ldrsb_ip" : loadImmClassName(False, False, False, 1, True), 852 "ldrsb_ipw" : loadImmClassName(False, False, True, 1, True), 853 "ldrsb_ipuw" : loadImmClassName(False, True, True, 1, True), 854 "ldrsb_iadd" : loadImmClassName(False, True, False, 1, True), 855 "ldrb_iw" : loadImmClassName(True, False, True, 1), 856 "ldrb_iuw" : loadImmClassName(True, True, True, 1), 857 "ldrb_ip" : loadImmClassName(False, False, False, 1), 858 "ldrb_ipw" : loadImmClassName(False, False, True, 1), 859 "ldrb_ipuw" : loadImmClassName(False, True, True, 1), 860 "ldrb_iadd" : loadImmClassName(False, True, False, 1), 861 "ldrbt" : loadImmClassName(False, True, False, 1, user=True), 862 "ldrsbt" : loadImmClassName(False, True, False, 1, True, user=True), 863 "pldw_radd" : "PLDW_" + loadRegClassName(False, True, False, 1), 864 "pld_radd" : "PLD_" + loadRegClassName(False, True, False, 1), 865 "pldw_isub" : "PLDW_" + loadImmClassName(False, False, False, 1), 866 "pld_isub" : "PLD_" + loadImmClassName(False, False, False, 1), 867 "pldw_iadd" : "PLDW_" + loadImmClassName(False, True, False, 1), 868 "pld_iadd" : "PLD_" + loadImmClassName(False, True, False, 1), 869 "pld_iulit" : "PLD_" + loadImmClassName(False, True, False, 1), 870 "pld_ilit" : "PLD_" + loadImmClassName(False, False, False, 1), 871 "pli_iulit" : "PLI_" + loadImmClassName(False, True, False, 1), 872 "pli_ilit" : "PLI_" + loadImmClassName(False, False, False, 1), 873 "pli_radd" : "PLI_" + loadRegClassName(False, True, False, 1), 874 "pli_iulit" : "PLI_" + loadImmClassName(False, True, False, 1), 875 "pli_ilit" : "PLI_" + loadImmClassName(False, False, False, 1) 876 } 877 decode_block = decode % substDict 878}}; 879 880def format LoadHalfwordMemoryHints() {{ 881 decode = ''' 882 { 883 const uint32_t op1 = bits(machInst, 24, 23); 884 const uint32_t op2 = bits(machInst, 11, 6); 885 const IntRegIndex rn = (IntRegIndex)(uint32_t)bits(machInst, 19, 16); 886 const IntRegIndex rt = (IntRegIndex)(uint32_t)bits(machInst, 15, 12); 887 const IntRegIndex rm = (IntRegIndex)(uint32_t)bits(machInst, 3, 0); 888 const uint32_t imm12 = bits(machInst, 11, 0); 889 const uint32_t imm8 = bits(machInst, 7, 0); 890 bool pldw = bits(machInst, 21); 891 const uint32_t imm2 = bits(machInst, 5, 4); 892 if (rn == 0xf) { 893 if (rt == 0xf) { 894 if (bits(op1, 1) == 1) { 895 // Unallocated memory hint 896 return new NopInst(machInst); 897 } else { 898 return new Unknown(machInst); 899 } 900 } else { 901 if (bits(op1, 1) == 1) { 902 if (bits(machInst, 23)) { 903 return new %(ldrsh_lit_u)s(machInst, rt, INTREG_PC, 904 true, imm12); 905 } else { 906 return new %(ldrsh_lit)s(machInst, rt, INTREG_PC, 907 false, imm12); 908 } 909 } else { 910 if (bits(machInst, 23)) { 911 return new %(ldrh_lit_u)s(machInst, rt, INTREG_PC, 912 true, imm12); 913 } else { 914 return new %(ldrh_lit)s(machInst, rt, INTREG_PC, 915 false, imm12); 916 } 917 } 918 } 919 } else if (rt == 0xf) { 920 switch (op1) { 921 case 0x0: 922 if (op2 == 0x0) { 923 if (pldw) { 924 return new %(pldw_radd)s(machInst, INTREG_ZERO, 925 rn, true, imm2, LSL, rm); 926 } else { 927 return new %(pld_radd)s(machInst, INTREG_ZERO, 928 rn, true, imm2, LSL, rm); 929 } 930 } else if (bits(op2, 5, 2) == 0xc) { 931 if (pldw) { 932 return new %(pldw_isub)s(machInst, INTREG_ZERO, 933 rn, false, imm8); 934 } else { 935 return new %(pld_isub)s(machInst, INTREG_ZERO, 936 rn, false, imm8); 937 } 938 } 939 break; 940 case 0x1: 941 if (pldw) { 942 return new %(pldw_iadd)s(machInst, INTREG_ZERO, 943 rn, true, imm12); 944 } else { 945 return new %(pld_iadd)s(machInst, INTREG_ZERO, 946 rn, true, imm12); 947 } 948 case 0x2: 949 if (op2 == 0x0 || bits(op2, 5, 2) == 0xc) { 950 // Unallocated memory hint 951 return new NopInst(machInst); 952 } 953 break; 954 case 0x3: 955 return new NopInst(machInst); 956 } 957 return new Unknown(machInst); 958 } else { 959 switch (op1) { 960 case 0x0: 961 if (op2 == 0) { 962 return new %(ldrh_radd)s(machInst, rt, rn, true, 963 imm2, LSL, rm); 964 } else if (bits(op2, 5, 2) == 0xe) { 965 return new %(ldrht)s(machInst, rt, rn, true, imm8); 966 } else if ((op2 & 0x24) == 0x24 || bits(op2, 5, 2) == 0xc) { 967 const uint32_t puw = bits(machInst, 10, 8); 968 switch (puw) { 969 case 0x1: 970 return new %(ldrh_iw)s(machInst, rt, 971 rn, false, imm8); 972 case 0x3: 973 return new %(ldrh_iuw)s(machInst, rt, 974 rn, true, imm8); 975 case 0x4: 976 return new %(ldrh_ip)s(machInst, rt, 977 rn, false, imm8); 978 case 0x5: 979 return new %(ldrh_ipw)s(machInst, rt, 980 rn, false, imm8); 981 case 0x7: 982 return new %(ldrh_ipuw)s(machInst, rt, 983 rn, true, imm8); 984 } 985 } 986 break; 987 case 0x1: 988 return new %(ldrh_iadd)s(machInst, rt, rn, true, imm12); 989 case 0x2: 990 if (op2 == 0) { 991 return new %(ldrsh_radd)s(machInst, rt, rn, true, 992 imm2, LSL, rm); 993 } else if (bits(op2, 5, 2) == 0xe) { 994 return new %(ldrsht)s(machInst, rt, rn, true, imm8); 995 } else if ((op2 & 0x24) == 0x24 || bits(op2, 5, 2) == 0xc) { 996 const uint32_t puw = bits(machInst, 10, 8); 997 switch (puw) { 998 case 0x1: 999 return new %(ldrsh_iw)s(machInst, rt, 1000 rn, false, imm8); 1001 case 0x3: 1002 return new %(ldrsh_iuw)s(machInst, rt, 1003 rn, true, imm8); 1004 case 0x4: 1005 return new %(ldrsh_ip)s(machInst, rt, 1006 rn, false, imm8); 1007 case 0x5: 1008 return new %(ldrsh_ipw)s(machInst, rt, 1009 rn, false, imm8); 1010 case 0x7: 1011 return new %(ldrsh_ipuw)s(machInst, rt, 1012 rn, true, imm8); 1013 } 1014 } 1015 break; 1016 case 0x3: 1017 return new %(ldrsh_iadd)s(machInst, rt, rn, true, imm12); 1018 } 1019 return new Unknown(machInst); 1020 } 1021 } 1022 ''' 1023 substDict = { 1024 "ldrsh_lit_u" : loadImmClassName(False, True, False, 2, True), 1025 "ldrsh_lit" : loadImmClassName(False, False, False, 2, True), 1026 "ldrh_lit_u" : loadImmClassName(False, True, False, 2), 1027 "ldrh_lit" : loadImmClassName(False, False, False, 2), 1028 "ldrsh_radd" : loadRegClassName(False, True, False, 2, True), 1029 "ldrh_radd" : loadRegClassName(False, True, False, 2), 1030 "ldrsh_iw" : loadImmClassName(True, False, True, 2, True), 1031 "ldrsh_iuw" : loadImmClassName(True, True, True, 2, True), 1032 "ldrsh_ip" : loadImmClassName(False, False, False, 2, True), 1033 "ldrsh_ipw" : loadImmClassName(False, False, True, 2, True), 1034 "ldrsh_ipuw" : loadImmClassName(False, True, True, 2, True), 1035 "ldrsh_iadd" : loadImmClassName(False, True, False, 2, True), 1036 "ldrh_iw" : loadImmClassName(True, False, True, 2), 1037 "ldrh_iuw" : loadImmClassName(True, True, True, 2), 1038 "ldrh_ip" : loadImmClassName(False, False, False, 2), 1039 "ldrh_ipw" : loadImmClassName(False, False, True, 2), 1040 "ldrh_ipuw" : loadImmClassName(False, True, True, 2), 1041 "ldrh_iadd" : loadImmClassName(False, True, False, 2), 1042 "ldrht" : loadImmClassName(False, True, False, 2, user=True), 1043 "ldrsht" : loadImmClassName(False, True, False, 2, True, user=True), 1044 "pldw_radd" : "PLDW_" + loadRegClassName(False, True, False, 1), 1045 "pld_radd" : "PLD_" + loadRegClassName(False, True, False, 1), 1046 "pldw_isub" : "PLDW_" + loadImmClassName(False, False, False, 1), 1047 "pld_isub" : "PLD_" + loadImmClassName(False, False, False, 1), 1048 "pldw_iadd" : "PLDW_" + loadImmClassName(False, True, False, 1), 1049 "pld_iadd" : "PLD_" + loadImmClassName(False, True, False, 1) 1050 } 1051 decode_block = decode % substDict 1052}}; 1053 1054def format Thumb16MemReg() {{ 1055 decode = ''' 1056 { 1057 const uint32_t opb = bits(machInst, 11, 9); 1058 const uint32_t rt = bits(machInst, 2, 0); 1059 const uint32_t rn = bits(machInst, 5, 3); 1060 const uint32_t rm = bits(machInst, 8, 6); 1061 switch (opb) { 1062 case 0x0: 1063 return new %(str)s(machInst, rt, rn, true, 0, LSL, rm); 1064 case 0x1: 1065 return new %(strh)s(machInst, rt, rn, true, 0, LSL, rm); 1066 case 0x2: 1067 return new %(strb)s(machInst, rt, rn, true, 0, LSL, rm); 1068 case 0x3: 1069 return new %(ldrsb)s(machInst, rt, rn, true, 0, LSL, rm); 1070 case 0x4: 1071 return new %(ldr)s(machInst, rt, rn, true, 0, LSL, rm); 1072 case 0x5: 1073 return new %(ldrh)s(machInst, rt, rn, true, 0, LSL, rm); 1074 case 0x6: 1075 return new %(ldrb)s(machInst, rt, rn, true, 0, LSL, rm); 1076 case 0x7: 1077 return new %(ldrsh)s(machInst, rt, rn, true, 0, LSL, rm); 1078 default: 1079 M5_UNREACHABLE; 1080 } 1081 } 1082 ''' 1083 classNames = { 1084 "str" : storeRegClassName(False, True, False), 1085 "strh" : storeRegClassName(False, True, False, size=2), 1086 "strb" : storeRegClassName(False, True, False, size=1), 1087 "ldrsb" : loadRegClassName(False, True, False, sign=True, size=1), 1088 "ldr" : loadRegClassName(False, True, False), 1089 "ldrh" : loadRegClassName(False, True, False, size=2), 1090 "ldrb" : loadRegClassName(False, True, False, size=1), 1091 "ldrsh" : loadRegClassName(False, True, False, sign=True, size=2), 1092 } 1093 decode_block = decode % classNames 1094}}; 1095 1096def format Thumb16MemImm() {{ 1097 decode = ''' 1098 { 1099 const uint32_t opa = bits(machInst, 15, 12); 1100 const uint32_t opb = bits(machInst, 11, 9); 1101 const uint32_t lrt = bits(machInst, 2, 0); 1102 const uint32_t lrn = bits(machInst, 5, 3); 1103 const uint32_t hrt = bits(machInst, 10, 8); 1104 const uint32_t imm5 = bits(machInst, 10, 6); 1105 const uint32_t imm8 = bits(machInst, 7, 0); 1106 const bool load = bits(opb, 2); 1107 switch (opa) { 1108 case 0x6: 1109 if (load) { 1110 return new %(ldr)s(machInst, lrt, lrn, true, imm5 << 2); 1111 } else { 1112 return new %(str)s(machInst, lrt, lrn, true, imm5 << 2); 1113 } 1114 case 0x7: 1115 if (load) { 1116 return new %(ldrb)s(machInst, lrt, lrn, true, imm5); 1117 } else { 1118 return new %(strb)s(machInst, lrt, lrn, true, imm5); 1119 } 1120 case 0x8: 1121 if (load) { 1122 return new %(ldrh)s(machInst, lrt, lrn, true, imm5 << 1); 1123 } else { 1124 return new %(strh)s(machInst, lrt, lrn, true, imm5 << 1); 1125 } 1126 case 0x9: 1127 if (load) { 1128 return new %(ldr)s(machInst, hrt, INTREG_SP, true, imm8 << 2); 1129 } else { 1130 return new %(str)s(machInst, hrt, INTREG_SP, true, imm8 << 2); 1131 } 1132 default: 1133 return new Unknown(machInst); 1134 } 1135 } 1136 ''' 1137 classNames = { 1138 "ldr" : loadImmClassName(False, True, False), 1139 "str" : storeImmClassName(False, True, False), 1140 "ldrh" : loadImmClassName(False, True, False, size=2), 1141 "strh" : storeImmClassName(False, True, False, size=2), 1142 "ldrb" : loadImmClassName(False, True, False, size=1), 1143 "strb" : storeImmClassName(False, True, False, size=1), 1144 } 1145 decode_block = decode % classNames 1146}}; 1147 1148def format Thumb16MemLit() {{ 1149 decode_block = ''' 1150 { 1151 const uint32_t rt = bits(machInst, 10, 8); 1152 const uint32_t imm8 = bits(machInst, 7, 0); 1153 return new %s(machInst, rt, INTREG_PC, true, imm8 << 2); 1154 } 1155 ''' % loadImmClassName(False, True, False) 1156}}; 1157
|