aarch64.isa (14150:1391e94a7b95) | aarch64.isa (14157:0f836da31d9c) |
---|---|
1// Copyright (c) 2011-2019 ARM Limited 2// All rights reserved 3// 4// The license below extends only to copyright in the software and shall 5// not be construed as granting a license to any other intellectual 6// property including but not limited to intellectual property relating 7// to a hardware implementation of the functionality of the software 8// licensed hereunder. You may use the software subject to the license --- 527 unchanged lines hidden (view full) --- 536 } 537} 538}}; 539 540output decoder {{ 541namespace Aarch64 542{ 543 StaticInstPtr | 1// Copyright (c) 2011-2019 ARM Limited 2// All rights reserved 3// 4// The license below extends only to copyright in the software and shall 5// not be construed as granting a license to any other intellectual 6// property including but not limited to intellectual property relating 7// to a hardware implementation of the functionality of the software 8// licensed hereunder. You may use the software subject to the license --- 527 unchanged lines hidden (view full) --- 536 } 537} 538}}; 539 540output decoder {{ 541namespace Aarch64 542{ 543 StaticInstPtr |
544 decodeAtomicArithOp(ExtMachInst machInst) 545 { 546 uint8_t opc = bits(machInst, 14, 12); 547 uint8_t o3 = bits(machInst, 15); 548 uint8_t size_ar = bits(machInst, 23, 22)<<0 | bits(machInst, 31, 30)<<2; 549 IntRegIndex rt = (IntRegIndex)(uint8_t)bits(machInst, 4, 0); 550 IntRegIndex rn = (IntRegIndex)(uint8_t)bits(machInst, 9, 5); 551 IntRegIndex rnsp = makeSP(rn); 552 IntRegIndex rs = (IntRegIndex)(uint8_t)bits(machInst, 20, 16); 553 uint8_t A_rt = bits(machInst, 4, 0)<<0 | bits(machInst, 23)<<5; 554 555 switch(opc) { 556 case 0x0: 557 switch(size_ar){ 558 case 0x0: 559 if (o3 == 1) 560 return new SWPB(machInst, rt, rnsp, rs); 561 else if (A_rt == 0x1f) 562 return new STADDB(machInst, rt, rnsp, rs); 563 else 564 return new LDADDB(machInst, rt, rnsp, rs); 565 case 0x1 : 566 if (o3 == 1) 567 return new SWPLB(machInst, rt, rnsp, rs); 568 else if (A_rt == 0x1f) 569 return new STADDLB(machInst, rt, rnsp, rs); 570 else 571 return new LDADDLB(machInst, rt, rnsp, rs); 572 case 0x2: 573 if (o3 == 1) 574 return new SWPAB(machInst, rt, rnsp, rs); 575 else 576 return new LDADDAB(machInst, rt, rnsp, rs); 577 case 0x3: 578 if (o3 == 1) 579 return new SWPLAB(machInst, rt, rnsp, rs); 580 else 581 return new LDADDLAB(machInst, rt, rnsp, rs); 582 case 0x4: 583 if (o3 == 1) 584 return new SWPH(machInst, rt, rnsp, rs); 585 else if (A_rt == 0x1f) 586 return new STADDH(machInst, rt, rnsp, rs); 587 else 588 return new LDADDH(machInst, rt, rnsp, rs); 589 case 0x5 : 590 if (o3 == 1) 591 return new SWPLH(machInst, rt, rnsp, rs); 592 else if (A_rt == 0x1f) 593 return new STADDLH(machInst, rt, rnsp, rs); 594 else 595 return new LDADDLH(machInst, rt, rnsp, rs); 596 case 0x6: 597 if (o3 == 1) 598 return new SWPAH(machInst, rt, rnsp, rs); 599 else 600 return new LDADDAH(machInst, rt, rnsp, rs); 601 case 0x7: 602 if (o3 == 1) 603 return new SWPLAH(machInst, rt, rnsp, rs); 604 else 605 return new LDADDLAH(machInst, rt, rnsp, rs); 606 case 0x8: 607 if (o3 == 1) 608 return new SWP(machInst, rt, rnsp, rs); 609 else if (A_rt == 0x1f) 610 return new STADD(machInst, rt, rnsp, rs); 611 else 612 return new LDADD(machInst, rt, rnsp, rs); 613 case 0x9 : 614 if (o3 == 1) 615 return new SWPL(machInst, rt, rnsp, rs); 616 else if (A_rt == 0x1f) 617 return new STADDL(machInst, rt, rnsp, rs); 618 else 619 return new LDADDL(machInst, rt, rnsp, rs); 620 case 0xa: 621 if (o3 == 1) 622 return new SWPA(machInst, rt, rnsp, rs); 623 else 624 return new LDADDA(machInst, rt, rnsp, rs); 625 case 0xb: 626 if (o3 == 1) 627 return new SWPLA(machInst, rt, rnsp, rs); 628 else 629 return new LDADDLA(machInst, rt, rnsp, rs); 630 case 0xc: 631 if (o3 == 1) 632 return new SWP64(machInst, rt, rnsp, rs); 633 634 else if (A_rt == 0x1f) 635 return new STADD64(machInst, rt, rnsp, rs); 636 else 637 return new LDADD64(machInst, rt, rnsp, rs); 638 case 0xd : 639 if (o3 == 1) 640 return new SWPL64(machInst, rt, rnsp, rs); 641 else if (A_rt == 0x1f) 642 return new STADDL64(machInst, rt, rnsp, rs); 643 else 644 return new LDADDL64(machInst, rt, rnsp, rs); 645 case 0xe: 646 if (o3 == 1) 647 return new SWPA64(machInst, rt, rnsp, rs); 648 else 649 return new LDADDA64(machInst, rt, rnsp, rs); 650 case 0xf: 651 if (o3 == 1) 652 return new SWPLA64(machInst, rt, rnsp, rs); 653 else 654 return new LDADDLA64(machInst, rt, rnsp, rs); 655 } 656 case 0x1: 657 switch(size_ar){ 658 case 0x0: 659 if (A_rt == 0x1f) 660 return new STCLRB(machInst, rt, rnsp, rs); 661 else 662 return new LDCLRB(machInst, rt, rnsp, rs); 663 case 0x1 : 664 if (A_rt == 0x1f) 665 return new STCLRLB(machInst, rt, rnsp, rs); 666 else 667 return new LDCLRLB(machInst, rt, rnsp, rs); 668 case 0x2: 669 return new LDCLRAB(machInst, rt, rnsp, rs); 670 case 0x3: 671 return new LDCLRLAB(machInst, rt, rnsp, rs); 672 case 0x4: 673 if (A_rt == 0x1f) 674 return new STCLRH(machInst, rt, rnsp, rs); 675 else 676 return new LDCLRH(machInst, rt, rnsp, rs); 677 case 0x5 : 678 if (A_rt == 0x1f) 679 return new STCLRLH(machInst, rt, rnsp, rs); 680 else 681 return new LDCLRLH(machInst, rt, rnsp, rs); 682 case 0x6: 683 return new LDCLRAH(machInst, rt, rnsp, rs); 684 case 0x7: 685 return new LDCLRLAH(machInst, rt, rnsp, rs); 686 case 0x8: 687 if (A_rt == 0x1f) 688 return new STCLR(machInst, rt, rnsp, rs); 689 else 690 return new LDCLR(machInst, rt, rnsp, rs); 691 case 0x9 : 692 if (A_rt == 0x1f) 693 return new STCLRL(machInst, rt, rnsp, rs); 694 else 695 return new LDCLRL(machInst, rt, rnsp, rs); 696 case 0xa: 697 return new LDCLRA(machInst, rt, rnsp, rs); 698 case 0xb: 699 return new LDCLRLA(machInst, rt, rnsp, rs); 700 case 0xc: 701 if (A_rt == 0x1f) 702 return new STCLR64(machInst, rt, rnsp, rs); 703 else 704 return new LDCLR64(machInst, rt, rnsp, rs); 705 case 0xd : 706 if (A_rt == 0x1f) 707 return new STCLRL64(machInst, rt, rnsp, rs); 708 else 709 return new LDCLRL64(machInst, rt, rnsp, rs); 710 case 0xe: 711 return new LDCLRA64(machInst, rt, rnsp, rs); 712 case 0xf: 713 return new LDCLRLA64(machInst, rt, rnsp, rs); 714 } 715 case 0x2: 716 switch(size_ar){ 717 case 0x0: 718 if (A_rt == 0x1f) 719 return new STEORB(machInst, rt, rnsp, rs); 720 else 721 return new LDEORB(machInst, rt, rnsp, rs); 722 case 0x1 : 723 if (A_rt == 0x1f) 724 return new STEORLB(machInst, rt, rnsp, rs); 725 else 726 return new LDEORLB(machInst, rt, rnsp, rs); 727 case 0x2: 728 return new LDEORAB(machInst, rt, rnsp, rs); 729 case 0x3: 730 return new LDEORLAB(machInst, rt, rnsp, rs); 731 case 0x4: 732 if (A_rt == 0x1f) 733 return new STEORH(machInst, rt, rnsp, rs); 734 else 735 return new LDEORH(machInst, rt, rnsp, rs); 736 case 0x5 : 737 if (A_rt == 0x1f) 738 return new STEORLH(machInst, rt, rnsp, rs); 739 else 740 return new LDEORLH(machInst, rt, rnsp, rs); 741 case 0x6: 742 return new LDEORAH(machInst, rt, rnsp, rs); 743 case 0x7: 744 return new LDEORLAH(machInst, rt, rnsp, rs); 745 case 0x8: 746 if (A_rt == 0x1f) 747 return new STEOR(machInst, rt, rnsp, rs); 748 else 749 return new LDEOR(machInst, rt, rnsp, rs); 750 case 0x9 : 751 if (A_rt == 0x1f) 752 return new STEORL(machInst, rt, rnsp, rs); 753 else 754 return new LDEORL(machInst, rt, rnsp, rs); 755 case 0xa: 756 return new LDEORA(machInst, rt, rnsp, rs); 757 case 0xb: 758 return new LDEORLA(machInst, rt, rnsp, rs); 759 case 0xc: 760 if (A_rt == 0x1f) 761 return new STEOR64(machInst, rt, rnsp, rs); 762 else 763 return new LDEOR64(machInst, rt, rnsp, rs); 764 case 0xd : 765 if (A_rt == 0x1f) 766 return new STEORL64(machInst, rt, rnsp, rs); 767 else 768 return new LDEORL64(machInst, rt, rnsp, rs); 769 case 0xe: 770 return new LDEORA64(machInst, rt, rnsp, rs); 771 case 0xf: 772 return new LDEORLA64(machInst, rt, rnsp, rs); 773 } 774 case 0x3: 775 switch(size_ar){ 776 case 0x0: 777 if (A_rt == 0x1f) 778 return new STSETB(machInst, rt, rnsp, rs); 779 else 780 return new LDSETB(machInst, rt, rnsp, rs); 781 case 0x1 : 782 if (A_rt == 0x1f) 783 return new STSETLB(machInst, rt, rnsp, rs); 784 else 785 return new LDSETLB(machInst, rt, rnsp, rs); 786 case 0x2: 787 return new LDSETAB(machInst, rt, rnsp, rs); 788 case 0x3: 789 return new LDSETLAB(machInst, rt, rnsp, rs); 790 case 0x4: 791 if (A_rt == 0x1f) 792 return new STSETH(machInst, rt, rnsp, rs); 793 else 794 return new LDSETH(machInst, rt, rnsp, rs); 795 case 0x5 : 796 if (A_rt == 0x1f) 797 return new STSETLH(machInst, rt, rnsp, rs); 798 else 799 return new LDSETLH(machInst, rt, rnsp, rs); 800 case 0x6: 801 return new LDSETAH(machInst, rt, rnsp, rs); 802 case 0x7: 803 return new LDSETLAH(machInst, rt, rnsp, rs); 804 case 0x8: 805 if (A_rt == 0x1f) 806 return new STSET(machInst, rt, rnsp, rs); 807 else 808 return new LDSET(machInst, rt, rnsp, rs); 809 case 0x9 : 810 if (A_rt == 0x1f) 811 return new STSETL(machInst, rt, rnsp, rs); 812 else 813 return new LDSETL(machInst, rt, rnsp, rs); 814 case 0xa: 815 return new LDSETA(machInst, rt, rnsp, rs); 816 case 0xb: 817 return new LDSETLA(machInst, rt, rnsp, rs); 818 case 0xc: 819 if (A_rt == 0x1f) 820 return new STSET64(machInst, rt, rnsp, rs); 821 else 822 return new LDSET64(machInst, rt, rnsp, rs); 823 case 0xd : 824 if (A_rt == 0x1f) 825 return new STSETL64(machInst, rt, rnsp, rs); 826 else 827 return new LDSETL64(machInst, rt, rnsp, rs); 828 case 0xe: 829 return new LDSETA64(machInst, rt, rnsp, rs); 830 case 0xf: 831 return new LDSETLA64(machInst, rt, rnsp, rs); 832 } 833 case 0x4: 834 switch(size_ar){ 835 case 0x0: 836 if (A_rt == 0x1f) 837 return new STSMAXB(machInst, rt, rnsp, rs); 838 else 839 return new LDSMAXB(machInst, rt, rnsp, rs); 840 case 0x1 : 841 if (A_rt == 0x1f) 842 return new STSMAXLB(machInst, rt, rnsp, rs); 843 else 844 return new LDSMAXLB(machInst, rt, rnsp, rs); 845 case 0x2: 846 return new LDSMAXAB(machInst, rt, rnsp, rs); 847 case 0x3: 848 return new LDSMAXLAB(machInst, rt, rnsp, rs); 849 case 0x4: 850 if (A_rt == 0x1f) 851 return new STSMAXH(machInst, rt, rnsp, rs); 852 else 853 return new LDSMAXH(machInst, rt, rnsp, rs); 854 case 0x5 : 855 if (A_rt == 0x1f) 856 return new STSMAXLH(machInst, rt, rnsp, rs); 857 else 858 return new LDSMAXLH(machInst, rt, rnsp, rs); 859 case 0x6: 860 return new LDSMAXAH(machInst, rt, rnsp, rs); 861 case 0x7: 862 return new LDSMAXLAH(machInst, rt, rnsp, rs); 863 case 0x8: 864 if (A_rt == 0x1f) 865 return new STSMAX(machInst, rt, rnsp, rs); 866 else 867 return new LDSMAX(machInst, rt, rnsp, rs); 868 case 0x9 : 869 if (A_rt == 0x1f) 870 return new STSMAXL(machInst, rt, rnsp, rs); 871 else 872 return new LDSMAXL(machInst, rt, rnsp, rs); 873 case 0xa: 874 return new LDSMAXA(machInst, rt, rnsp, rs); 875 case 0xb: 876 return new LDSMAXLA(machInst, rt, rnsp, rs); 877 case 0xc: 878 if (A_rt == 0x1f) 879 return new STSMAX64(machInst, rt, rnsp, rs); 880 else 881 return new LDSMAX64(machInst, rt, rnsp, rs); 882 case 0xd : 883 if (A_rt == 0x1f) 884 return new STSMAXL64(machInst, rt, rnsp, rs); 885 else 886 return new LDSMAXL64(machInst, rt, rnsp, rs); 887 case 0xe: 888 return new LDSMAXA64(machInst, rt, rnsp, rs); 889 case 0xf: 890 return new LDSMAXLA64(machInst, rt, rnsp, rs); 891 } 892 case 0x5: 893 switch(size_ar){ 894 case 0x0: 895 if (A_rt == 0x1f) 896 return new STSMINB(machInst, rt, rnsp, rs); 897 else 898 return new LDSMINB(machInst, rt, rnsp, rs); 899 case 0x1 : 900 if (A_rt == 0x1f) 901 return new STSMINLB(machInst, rt, rnsp, rs); 902 else 903 return new LDSMINLB(machInst, rt, rnsp, rs); 904 case 0x2: 905 return new LDSMINAB(machInst, rt, rnsp, rs); 906 case 0x3: 907 return new LDSMINLAB(machInst, rt, rnsp, rs); 908 case 0x4: 909 if (A_rt == 0x1f) 910 return new STSMINH(machInst, rt, rnsp, rs); 911 else 912 return new LDSMINH(machInst, rt, rnsp, rs); 913 case 0x5 : 914 if (A_rt == 0x1f) 915 return new STSMINLH(machInst, rt, rnsp, rs); 916 else 917 return new LDSMINLH(machInst, rt, rnsp, rs); 918 case 0x6: 919 return new LDSMINAH(machInst, rt, rnsp, rs); 920 case 0x7: 921 return new LDSMINLAH(machInst, rt, rnsp, rs); 922 case 0x8: 923 if (A_rt == 0x1f) 924 return new STSMIN(machInst, rt, rnsp, rs); 925 else 926 return new LDSMIN(machInst, rt, rnsp, rs); 927 case 0x9 : 928 if (A_rt == 0x1f) 929 return new STSMINL(machInst, rt, rnsp, rs); 930 else 931 return new LDSMINL(machInst, rt, rnsp, rs); 932 case 0xa: 933 return new LDSMINA(machInst, rt, rnsp, rs); 934 case 0xb: 935 return new LDSMINLA(machInst, rt, rnsp, rs); 936 case 0xc: 937 if (A_rt == 0x1f) 938 return new STSMIN64(machInst, rt, rnsp, rs); 939 else 940 return new LDSMIN64(machInst, rt, rnsp, rs); 941 case 0xd : 942 if (A_rt == 0x1f) 943 return new STSMINL64(machInst, rt, rnsp, rs); 944 else 945 return new LDSMINL64(machInst, rt, rnsp, rs); 946 case 0xe: 947 return new LDSMINA64(machInst, rt, rnsp, rs); 948 case 0xf: 949 return new LDSMINLA64(machInst, rt, rnsp, rs); 950 } 951 case 0x6: 952 switch(size_ar){ 953 case 0x0: 954 if (A_rt == 0x1f) 955 return new STUMAXB(machInst, rt, rnsp, rs); 956 else 957 return new LDUMAXB(machInst, rt, rnsp, rs); 958 case 0x1 : 959 if (A_rt == 0x1f) 960 return new STUMAXLB(machInst, rt, rnsp, rs); 961 else 962 return new LDUMAXLB(machInst, rt, rnsp, rs); 963 case 0x2: 964 return new LDUMAXAB(machInst, rt, rnsp, rs); 965 case 0x3: 966 return new LDUMAXLAB(machInst, rt, rnsp, rs); 967 case 0x4: 968 if (A_rt == 0x1f) 969 return new STUMAXH(machInst, rt, rnsp, rs); 970 else 971 return new LDUMAXH(machInst, rt, rnsp, rs); 972 case 0x5 : 973 if (A_rt == 0x1f) 974 return new STUMAXLH(machInst, rt, rnsp, rs); 975 else 976 return new LDUMAXLH(machInst, rt, rnsp, rs); 977 case 0x6: 978 return new LDUMAXAH(machInst, rt, rnsp, rs); 979 case 0x7: 980 return new LDUMAXLAH(machInst, rt, rnsp, rs); 981 case 0x8: 982 if (A_rt == 0x1f) 983 return new STUMAX(machInst, rt, rnsp, rs); 984 else 985 return new LDUMAX(machInst, rt, rnsp, rs); 986 case 0x9 : 987 if (A_rt == 0x1f) 988 return new STUMAXL(machInst, rt, rnsp, rs); 989 else 990 return new LDUMAXL(machInst, rt, rnsp, rs); 991 case 0xa: 992 return new LDUMAXA(machInst, rt, rnsp, rs); 993 case 0xb: 994 return new LDUMAXLA(machInst, rt, rnsp, rs); 995 case 0xc: 996 if (A_rt == 0x1f) 997 return new STUMAX64(machInst, rt, rnsp, rs); 998 else 999 return new LDUMAX64(machInst, rt, rnsp, rs); 1000 case 0xd : 1001 if (A_rt == 0x1f) 1002 return new STUMAXL64(machInst, rt, rnsp, rs); 1003 else 1004 return new LDUMAXL64(machInst, rt, rnsp, rs); 1005 case 0xe: 1006 return new LDUMAXA64(machInst, rt, rnsp, rs); 1007 case 0xf: 1008 return new LDUMAXLA64(machInst, rt, rnsp, rs); 1009 } 1010 case 0x7: 1011 switch(size_ar){ 1012 case 0x0: 1013 if (A_rt == 0x1f) 1014 return new STUMINB(machInst, rt, rnsp, rs); 1015 else 1016 return new LDUMINB(machInst, rt, rnsp, rs); 1017 case 0x1 : 1018 if (A_rt == 0x1f) 1019 return new STUMINLB(machInst, rt, rnsp, rs); 1020 else 1021 return new LDUMINLB(machInst, rt, rnsp, rs); 1022 case 0x2: 1023 return new LDUMINAB(machInst, rt, rnsp, rs); 1024 case 0x3: 1025 return new LDUMINLAB(machInst, rt, rnsp, rs); 1026 case 0x4: 1027 if (A_rt == 0x1f) 1028 return new STUMINH(machInst, rt, rnsp, rs); 1029 else 1030 return new LDUMINH(machInst, rt, rnsp, rs); 1031 case 0x5 : 1032 if (A_rt == 0x1f) 1033 return new STUMINLH(machInst, rt, rnsp, rs); 1034 else 1035 return new LDUMINLH(machInst, rt, rnsp, rs); 1036 case 0x6: 1037 return new LDUMINAH(machInst, rt, rnsp, rs); 1038 case 0x7: 1039 return new LDUMINLAH(machInst, rt, rnsp, rs); 1040 case 0x8: 1041 if (A_rt == 0x1f) 1042 return new STUMIN(machInst, rt, rnsp, rs); 1043 else 1044 return new LDUMIN(machInst, rt, rnsp, rs); 1045 case 0x9 : 1046 if (A_rt == 0x1f) 1047 return new STUMINL(machInst, rt, rnsp, rs); 1048 else 1049 return new LDUMINL(machInst, rt, rnsp, rs); 1050 case 0xa: 1051 return new LDUMINA(machInst, rt, rnsp, rs); 1052 case 0xb: 1053 return new LDUMINLA(machInst, rt, rnsp, rs); 1054 case 0xc: 1055 if (A_rt == 0x1f) 1056 return new STUMIN64(machInst, rt, rnsp, rs); 1057 else 1058 return new LDUMIN64(machInst, rt, rnsp, rs); 1059 case 0xd : 1060 if (A_rt == 0x1f) 1061 return new STUMINL64(machInst, rt, rnsp, rs); 1062 else 1063 return new LDUMINL64(machInst, rt, rnsp, rs); 1064 case 0xe: 1065 return new LDUMINA64(machInst, rt, rnsp, rs); 1066 case 0xf: 1067 return new LDUMINLA64(machInst, rt, rnsp, rs); 1068 } 1069 default: 1070 return new Unknown64(machInst); 1071 } 1072 } 1073} 1074}}; 1075 1076 1077output decoder {{ 1078namespace Aarch64 1079{ 1080 1081 StaticInstPtr |
|
544 decodeLoadsStores(ExtMachInst machInst) 545 { 546 // bit 27,25=10 547 switch (bits(machInst, 29, 28)) { 548 case 0x0: 549 if (bits(machInst, 26) == 0) { 550 if (bits(machInst, 24) != 0) 551 return new Unknown64(machInst); --- 368 unchanged lines hidden (view full) --- 920 case 0x2: 921 return new LDAPRW64(machInst, rt, rnsp); 922 case 0x3: 923 return new LDAPRX64(machInst, rt, rnsp); 924 default: 925 M5_UNREACHABLE; 926 } 927 } else { | 1082 decodeLoadsStores(ExtMachInst machInst) 1083 { 1084 // bit 27,25=10 1085 switch (bits(machInst, 29, 28)) { 1086 case 0x0: 1087 if (bits(machInst, 26) == 0) { 1088 if (bits(machInst, 24) != 0) 1089 return new Unknown64(machInst); --- 368 unchanged lines hidden (view full) --- 1458 case 0x2: 1459 return new LDAPRW64(machInst, rt, rnsp); 1460 case 0x3: 1461 return new LDAPRX64(machInst, rt, rnsp); 1462 default: 1463 M5_UNREACHABLE; 1464 } 1465 } else { |
928 return new Unknown64(machInst); | 1466 return decodeAtomicArithOp(machInst); |
929 } 930 } 931 case 0x2: 932 { 933 if (!bits(machInst, 14)) 934 return new Unknown64(machInst); 935 IntRegIndex rt = (IntRegIndex)(uint32_t) 936 bits(machInst, 4, 0); --- 1442 unchanged lines hidden --- | 1467 } 1468 } 1469 case 0x2: 1470 { 1471 if (!bits(machInst, 14)) 1472 return new Unknown64(machInst); 1473 IntRegIndex rt = (IntRegIndex)(uint32_t) 1474 bits(machInst, 4, 0); --- 1442 unchanged lines hidden --- |