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 ---