33#define DEBUG_TYPE "aarch64-disassembler"
42#define Success MCDisassembler::Success
43#define Fail MCDisassembler::Fail
44#define SoftFail MCDisassembler::SoftFail
46template <
unsigned RegClassID,
unsigned FirstReg,
unsigned NumRegsInClass>
50 if (RegNo > NumRegsInClass - 1)
54 AArch64MCRegisterClasses[RegClassID].getRegister(RegNo + FirstReg);
68 AArch64MCRegisterClasses[AArch64::GPR64x8ClassRegClassID].getRegister(
74template <
unsigned Min,
unsigned Max>
78 unsigned Reg = (RegNo * 2) + Min;
79 if (Reg < Min || Reg > Max || (Reg & 1))
82 AArch64MCRegisterClasses[AArch64::ZPRRegClassID].getRegister(Reg);
87template <
unsigned Min,
unsigned Max>
90 const void *Decoder) {
91 unsigned Reg = (RegNo * 2) + Min;
92 if (Reg < Min || Reg > Max || (Reg & 1))
96 AArch64MCRegisterClasses[AArch64::ZPR2RegClassID].getRegister(Reg);
107 AArch64MCRegisterClasses[AArch64::ZPR_KRegClassID].getRegister(RegNo);
114 const void *Decoder) {
118 AArch64MCRegisterClasses[AArch64::ZPR4RegClassID].getRegister(RegNo * 4);
135 {AArch64::ZAH0, AArch64::ZAH1},
136 {AArch64::ZAS0, AArch64::ZAS1, AArch64::ZAS2, AArch64::ZAS3},
137 {AArch64::ZAD0, AArch64::ZAD1, AArch64::ZAD2, AArch64::ZAD3, AArch64::ZAD4,
138 AArch64::ZAD5, AArch64::ZAD6, AArch64::ZAD7},
139 {AArch64::ZAQ0, AArch64::ZAQ1, AArch64::ZAQ2, AArch64::ZAQ3, AArch64::ZAQ4,
140 AArch64::ZAQ5, AArch64::ZAQ6, AArch64::ZAQ7, AArch64::ZAQ8, AArch64::ZAQ9,
141 AArch64::ZAQ10, AArch64::ZAQ11, AArch64::ZAQ12, AArch64::ZAQ13,
142 AArch64::ZAQ14, AArch64::ZAQ15}};
144template <
unsigned NumBitsForTile>
148 unsigned LastReg = (1 << NumBitsForTile) - 1;
158 const void *Decoder) {
159 if ((RegNo * 2) > 14)
162 AArch64MCRegisterClasses[AArch64::PPR2RegClassID].getRegister(RegNo * 2);
189 if (ImmVal > (1 << 16))
201 int64_t ImmVal = Imm;
204 if (ImmVal & (1 << (19 - 1)))
205 ImmVal |= ~((1LL << 19) - 1);
208 Inst, ImmVal * 4,
Addr, Inst.
getOpcode() != AArch64::LDRXl, 0, 0, 4))
215 int64_t ImmVal = Imm;
218 if (ImmVal & (1 << (9 - 1)))
219 ImmVal |= ~((1LL << 9) - 1);
263 DecodeSimpleRegisterClass<AArch64::FPR128RegClassID, 0, 32>(
265 DecodeSimpleRegisterClass<AArch64::GPR64RegClassID, 0, 32>(
268 DecodeSimpleRegisterClass<AArch64::GPR64RegClassID, 0, 32>(
270 DecodeSimpleRegisterClass<AArch64::FPR128RegClassID, 0, 32>(
366 unsigned shift = (shiftHi << 6) | shiftLo;
370 case AArch64::ADDWrs:
371 case AArch64::ADDSWrs:
372 case AArch64::SUBWrs:
373 case AArch64::SUBSWrs:
378 case AArch64::ANDWrs:
379 case AArch64::ANDSWrs:
380 case AArch64::BICWrs:
381 case AArch64::BICSWrs:
382 case AArch64::ORRWrs:
383 case AArch64::ORNWrs:
384 case AArch64::EORWrs:
385 case AArch64::EONWrs: {
387 if (shiftLo >> 5 == 1)
389 DecodeSimpleRegisterClass<AArch64::GPR32RegClassID, 0, 32>(Inst, Rd,
Addr,
391 DecodeSimpleRegisterClass<AArch64::GPR32RegClassID, 0, 32>(Inst, Rn,
Addr,
393 DecodeSimpleRegisterClass<AArch64::GPR32RegClassID, 0, 32>(Inst, Rm,
Addr,
397 case AArch64::ADDXrs:
398 case AArch64::ADDSXrs:
399 case AArch64::SUBXrs:
400 case AArch64::SUBSXrs:
405 case AArch64::ANDXrs:
406 case AArch64::ANDSXrs:
407 case AArch64::BICXrs:
408 case AArch64::BICSXrs:
409 case AArch64::ORRXrs:
410 case AArch64::ORNXrs:
411 case AArch64::EORXrs:
412 case AArch64::EONXrs:
413 DecodeSimpleRegisterClass<AArch64::GPR64RegClassID, 0, 32>(Inst, Rd,
Addr,
415 DecodeSimpleRegisterClass<AArch64::GPR64RegClassID, 0, 32>(Inst, Rn,
Addr,
417 DecodeSimpleRegisterClass<AArch64::GPR64RegClassID, 0, 32>(Inst, Rm,
Addr,
436 case AArch64::MOVZWi:
437 case AArch64::MOVNWi:
438 case AArch64::MOVKWi:
439 if (shift & (1U << 5))
441 DecodeSimpleRegisterClass<AArch64::GPR32RegClassID, 0, 32>(Inst, Rd,
Addr,
444 case AArch64::MOVZXi:
445 case AArch64::MOVNXi:
446 case AArch64::MOVKXi:
447 DecodeSimpleRegisterClass<AArch64::GPR64RegClassID, 0, 32>(Inst, Rd,
Addr,
452 if (Inst.
getOpcode() == AArch64::MOVKWi ||
474 case AArch64::PRFMui:
478 case AArch64::STRBBui:
479 case AArch64::LDRBBui:
480 case AArch64::LDRSBWui:
481 case AArch64::STRHHui:
482 case AArch64::LDRHHui:
483 case AArch64::LDRSHWui:
484 case AArch64::STRWui:
485 case AArch64::LDRWui:
486 DecodeSimpleRegisterClass<AArch64::GPR32RegClassID, 0, 32>(Inst, Rt,
Addr,
489 case AArch64::LDRSBXui:
490 case AArch64::LDRSHXui:
491 case AArch64::LDRSWui:
492 case AArch64::STRXui:
493 case AArch64::LDRXui:
494 DecodeSimpleRegisterClass<AArch64::GPR64RegClassID, 0, 32>(Inst, Rt,
Addr,
497 case AArch64::LDRQui:
498 case AArch64::STRQui:
499 DecodeSimpleRegisterClass<AArch64::FPR128RegClassID, 0, 32>(Inst, Rt,
Addr,
502 case AArch64::LDRDui:
503 case AArch64::STRDui:
504 DecodeSimpleRegisterClass<AArch64::FPR64RegClassID, 0, 32>(Inst, Rt,
Addr,
507 case AArch64::LDRSui:
508 case AArch64::STRSui:
509 DecodeSimpleRegisterClass<AArch64::FPR32RegClassID, 0, 32>(Inst, Rt,
Addr,
512 case AArch64::LDRHui:
513 case AArch64::STRHui:
514 DecodeSimpleRegisterClass<AArch64::FPR16RegClassID, 0, 32>(Inst, Rt,
Addr,
517 case AArch64::LDRBui:
518 case AArch64::STRBui:
519 DecodeSimpleRegisterClass<AArch64::FPR8RegClassID, 0, 32>(Inst, Rt,
Addr,
524 DecodeSimpleRegisterClass<AArch64::GPR64spRegClassID, 0, 32>(Inst, Rn,
Addr,
540 if (offset & (1 << (9 - 1)))
541 offset |= ~((1LL << 9) - 1);
547 case AArch64::LDRSBWpre:
548 case AArch64::LDRSHWpre:
549 case AArch64::STRBBpre:
550 case AArch64::LDRBBpre:
551 case AArch64::STRHHpre:
552 case AArch64::LDRHHpre:
553 case AArch64::STRWpre:
554 case AArch64::LDRWpre:
555 case AArch64::LDRSBWpost:
556 case AArch64::LDRSHWpost:
557 case AArch64::STRBBpost:
558 case AArch64::LDRBBpost:
559 case AArch64::STRHHpost:
560 case AArch64::LDRHHpost:
561 case AArch64::STRWpost:
562 case AArch64::LDRWpost:
563 case AArch64::LDRSBXpre:
564 case AArch64::LDRSHXpre:
565 case AArch64::STRXpre:
566 case AArch64::LDRSWpre:
567 case AArch64::LDRXpre:
568 case AArch64::LDRSBXpost:
569 case AArch64::LDRSHXpost:
570 case AArch64::STRXpost:
571 case AArch64::LDRSWpost:
572 case AArch64::LDRXpost:
573 case AArch64::LDRQpre:
574 case AArch64::STRQpre:
575 case AArch64::LDRQpost:
576 case AArch64::STRQpost:
577 case AArch64::LDRDpre:
578 case AArch64::STRDpre:
579 case AArch64::LDRDpost:
580 case AArch64::STRDpost:
581 case AArch64::LDRSpre:
582 case AArch64::STRSpre:
583 case AArch64::LDRSpost:
584 case AArch64::STRSpost:
585 case AArch64::LDRHpre:
586 case AArch64::STRHpre:
587 case AArch64::LDRHpost:
588 case AArch64::STRHpost:
589 case AArch64::LDRBpre:
590 case AArch64::STRBpre:
591 case AArch64::LDRBpost:
592 case AArch64::STRBpost:
593 DecodeSimpleRegisterClass<AArch64::GPR64spRegClassID, 0, 32>(Inst, Rn,
Addr,
601 case AArch64::PRFUMi:
605 case AArch64::STURBBi:
606 case AArch64::LDURBBi:
607 case AArch64::LDURSBWi:
608 case AArch64::STURHHi:
609 case AArch64::LDURHHi:
610 case AArch64::LDURSHWi:
611 case AArch64::STURWi:
612 case AArch64::LDURWi:
613 case AArch64::LDTRSBWi:
614 case AArch64::LDTRSHWi:
615 case AArch64::STTRWi:
616 case AArch64::LDTRWi:
617 case AArch64::STTRHi:
618 case AArch64::LDTRHi:
619 case AArch64::LDTRBi:
620 case AArch64::STTRBi:
621 case AArch64::LDRSBWpre:
622 case AArch64::LDRSHWpre:
623 case AArch64::STRBBpre:
624 case AArch64::LDRBBpre:
625 case AArch64::STRHHpre:
626 case AArch64::LDRHHpre:
627 case AArch64::STRWpre:
628 case AArch64::LDRWpre:
629 case AArch64::LDRSBWpost:
630 case AArch64::LDRSHWpost:
631 case AArch64::STRBBpost:
632 case AArch64::LDRBBpost:
633 case AArch64::STRHHpost:
634 case AArch64::LDRHHpost:
635 case AArch64::STRWpost:
636 case AArch64::LDRWpost:
637 case AArch64::STLURBi:
638 case AArch64::STLURHi:
639 case AArch64::STLURWi:
640 case AArch64::LDAPURBi:
641 case AArch64::LDAPURSBWi:
642 case AArch64::LDAPURHi:
643 case AArch64::LDAPURSHWi:
644 case AArch64::LDAPURi:
645 DecodeSimpleRegisterClass<AArch64::GPR32RegClassID, 0, 32>(Inst, Rt,
Addr,
648 case AArch64::LDURSBXi:
649 case AArch64::LDURSHXi:
650 case AArch64::LDURSWi:
651 case AArch64::STURXi:
652 case AArch64::LDURXi:
653 case AArch64::LDTRSBXi:
654 case AArch64::LDTRSHXi:
655 case AArch64::LDTRSWi:
656 case AArch64::STTRXi:
657 case AArch64::LDTRXi:
658 case AArch64::LDRSBXpre:
659 case AArch64::LDRSHXpre:
660 case AArch64::STRXpre:
661 case AArch64::LDRSWpre:
662 case AArch64::LDRXpre:
663 case AArch64::LDRSBXpost:
664 case AArch64::LDRSHXpost:
665 case AArch64::STRXpost:
666 case AArch64::LDRSWpost:
667 case AArch64::LDRXpost:
668 case AArch64::LDAPURSWi:
669 case AArch64::LDAPURSHXi:
670 case AArch64::LDAPURSBXi:
671 case AArch64::STLURXi:
672 case AArch64::LDAPURXi:
673 DecodeSimpleRegisterClass<AArch64::GPR64RegClassID, 0, 32>(Inst, Rt,
Addr,
676 case AArch64::LDURQi:
677 case AArch64::STURQi:
678 case AArch64::LDRQpre:
679 case AArch64::STRQpre:
680 case AArch64::LDRQpost:
681 case AArch64::STRQpost:
682 DecodeSimpleRegisterClass<AArch64::FPR128RegClassID, 0, 32>(Inst, Rt,
Addr,
685 case AArch64::LDURDi:
686 case AArch64::STURDi:
687 case AArch64::LDRDpre:
688 case AArch64::STRDpre:
689 case AArch64::LDRDpost:
690 case AArch64::STRDpost:
691 DecodeSimpleRegisterClass<AArch64::FPR64RegClassID, 0, 32>(Inst, Rt,
Addr,
694 case AArch64::LDURSi:
695 case AArch64::STURSi:
696 case AArch64::LDRSpre:
697 case AArch64::STRSpre:
698 case AArch64::LDRSpost:
699 case AArch64::STRSpost:
700 DecodeSimpleRegisterClass<AArch64::FPR32RegClassID, 0, 32>(Inst, Rt,
Addr,
703 case AArch64::LDURHi:
704 case AArch64::STURHi:
705 case AArch64::LDRHpre:
706 case AArch64::STRHpre:
707 case AArch64::LDRHpost:
708 case AArch64::STRHpost:
709 DecodeSimpleRegisterClass<AArch64::FPR16RegClassID, 0, 32>(Inst, Rt,
Addr,
712 case AArch64::LDURBi:
713 case AArch64::STURBi:
714 case AArch64::LDRBpre:
715 case AArch64::STRBpre:
716 case AArch64::LDRBpost:
717 case AArch64::STRBpost:
718 DecodeSimpleRegisterClass<AArch64::FPR8RegClassID, 0, 32>(Inst, Rt,
Addr,
723 DecodeSimpleRegisterClass<AArch64::GPR64spRegClassID, 0, 32>(Inst, Rn,
Addr,
732 if (IsLoad && IsIndexed && !IsFP && Rn != 31 && Rt == Rn)
750 case AArch64::STLXRW:
751 case AArch64::STLXRB:
752 case AArch64::STLXRH:
756 DecodeSimpleRegisterClass<AArch64::GPR32RegClassID, 0, 32>(Inst, Rs,
Addr,
762 case AArch64::LDAXRW:
763 case AArch64::LDAXRB:
764 case AArch64::LDAXRH:
771 case AArch64::STLLRW:
772 case AArch64::STLLRB:
773 case AArch64::STLLRH:
774 case AArch64::LDLARW:
775 case AArch64::LDLARB:
776 case AArch64::LDLARH:
777 DecodeSimpleRegisterClass<AArch64::GPR32RegClassID, 0, 32>(Inst, Rt,
Addr,
780 case AArch64::STLXRX:
782 DecodeSimpleRegisterClass<AArch64::GPR32RegClassID, 0, 32>(Inst, Rs,
Addr,
786 case AArch64::LDAXRX:
789 case AArch64::LDLARX:
790 case AArch64::STLLRX:
791 DecodeSimpleRegisterClass<AArch64::GPR64RegClassID, 0, 32>(Inst, Rt,
Addr,
794 case AArch64::STLXPW:
796 DecodeSimpleRegisterClass<AArch64::GPR32RegClassID, 0, 32>(Inst, Rs,
Addr,
799 case AArch64::LDAXPW:
801 DecodeSimpleRegisterClass<AArch64::GPR32RegClassID, 0, 32>(Inst, Rt,
Addr,
803 DecodeSimpleRegisterClass<AArch64::GPR32RegClassID, 0, 32>(Inst, Rt2,
Addr,
806 case AArch64::STLXPX:
808 DecodeSimpleRegisterClass<AArch64::GPR32RegClassID, 0, 32>(Inst, Rs,
Addr,
811 case AArch64::LDAXPX:
813 DecodeSimpleRegisterClass<AArch64::GPR64RegClassID, 0, 32>(Inst, Rt,
Addr,
815 DecodeSimpleRegisterClass<AArch64::GPR64RegClassID, 0, 32>(Inst, Rt2,
Addr,
820 DecodeSimpleRegisterClass<AArch64::GPR64spRegClassID, 0, 32>(Inst, Rn,
Addr,
824 if ((Opcode == AArch64::LDAXPW || Opcode == AArch64::LDXPW ||
825 Opcode == AArch64::LDAXPX || Opcode == AArch64::LDXPX) &&
843 if (offset & (1 << (7 - 1)))
844 offset |= ~((1LL << 7) - 1);
847 bool NeedsDisjointWritebackTransfer =
false;
853 case AArch64::LDPXpost:
854 case AArch64::STPXpost:
855 case AArch64::LDPSWpost:
856 case AArch64::LDPXpre:
857 case AArch64::STPXpre:
858 case AArch64::LDPSWpre:
859 case AArch64::LDPWpost:
860 case AArch64::STPWpost:
861 case AArch64::LDPWpre:
862 case AArch64::STPWpre:
863 case AArch64::LDPQpost:
864 case AArch64::STPQpost:
865 case AArch64::LDPQpre:
866 case AArch64::STPQpre:
867 case AArch64::LDPDpost:
868 case AArch64::STPDpost:
869 case AArch64::LDPDpre:
870 case AArch64::STPDpre:
871 case AArch64::LDPSpost:
872 case AArch64::STPSpost:
873 case AArch64::LDPSpre:
874 case AArch64::STPSpre:
875 case AArch64::STGPpre:
876 case AArch64::STGPpost:
877 case AArch64::LDTPpre:
878 case AArch64::LDTPpost:
879 case AArch64::LDTPQpost:
880 case AArch64::LDTPQpre:
881 case AArch64::STTPpost:
882 case AArch64::STTPpre:
883 case AArch64::STTPQpost:
884 case AArch64::STTPQpre:
885 DecodeSimpleRegisterClass<AArch64::GPR64spRegClassID, 0, 32>(Inst, Rn,
Addr,
893 case AArch64::LDPXpost:
894 case AArch64::STPXpost:
895 case AArch64::LDPSWpost:
896 case AArch64::LDPXpre:
897 case AArch64::STPXpre:
898 case AArch64::LDPSWpre:
899 case AArch64::STGPpre:
900 case AArch64::STGPpost:
901 case AArch64::LDTPpost:
902 case AArch64::LDTPpre:
903 case AArch64::STTPpost:
904 case AArch64::STTPpre:
905 NeedsDisjointWritebackTransfer =
true;
907 case AArch64::LDNPXi:
908 case AArch64::STNPXi:
911 case AArch64::LDPSWi:
915 case AArch64::STTNPXi:
916 case AArch64::LDTNPXi:
917 DecodeSimpleRegisterClass<AArch64::GPR64RegClassID, 0, 32>(Inst, Rt,
Addr,
919 DecodeSimpleRegisterClass<AArch64::GPR64RegClassID, 0, 32>(Inst, Rt2,
Addr,
922 case AArch64::LDPWpost:
923 case AArch64::STPWpost:
924 case AArch64::LDPWpre:
925 case AArch64::STPWpre:
926 NeedsDisjointWritebackTransfer =
true;
928 case AArch64::LDNPWi:
929 case AArch64::STNPWi:
932 DecodeSimpleRegisterClass<AArch64::GPR32RegClassID, 0, 32>(Inst, Rt,
Addr,
934 DecodeSimpleRegisterClass<AArch64::GPR32RegClassID, 0, 32>(Inst, Rt2,
Addr,
937 case AArch64::LDNPQi:
938 case AArch64::STNPQi:
939 case AArch64::LDPQpost:
940 case AArch64::STPQpost:
943 case AArch64::LDPQpre:
944 case AArch64::STPQpre:
945 case AArch64::LDTPQi:
946 case AArch64::LDTPQpost:
947 case AArch64::LDTPQpre:
948 case AArch64::LDTNPQi:
949 case AArch64::STTPQi:
950 case AArch64::STTPQpost:
951 case AArch64::STTPQpre:
952 case AArch64::STTNPQi:
953 DecodeSimpleRegisterClass<AArch64::FPR128RegClassID, 0, 32>(Inst, Rt,
Addr,
955 DecodeSimpleRegisterClass<AArch64::FPR128RegClassID, 0, 32>(Inst, Rt2,
Addr,
958 case AArch64::LDNPDi:
959 case AArch64::STNPDi:
960 case AArch64::LDPDpost:
961 case AArch64::STPDpost:
964 case AArch64::LDPDpre:
965 case AArch64::STPDpre:
966 DecodeSimpleRegisterClass<AArch64::FPR64RegClassID, 0, 32>(Inst, Rt,
Addr,
968 DecodeSimpleRegisterClass<AArch64::FPR64RegClassID, 0, 32>(Inst, Rt2,
Addr,
971 case AArch64::LDNPSi:
972 case AArch64::STNPSi:
973 case AArch64::LDPSpost:
974 case AArch64::STPSpost:
977 case AArch64::LDPSpre:
978 case AArch64::STPSpre:
979 DecodeSimpleRegisterClass<AArch64::FPR32RegClassID, 0, 32>(Inst, Rt,
Addr,
981 DecodeSimpleRegisterClass<AArch64::FPR32RegClassID, 0, 32>(Inst, Rt2,
Addr,
986 DecodeSimpleRegisterClass<AArch64::GPR64spRegClassID, 0, 32>(Inst, Rn,
Addr,
991 if (IsLoad && Rt == Rt2)
996 if (NeedsDisjointWritebackTransfer && Rn != 31 && (Rt == Rn || Rt2 == Rn))
1014 case AArch64::LDRAAwriteback:
1015 case AArch64::LDRABwriteback:
1016 DecodeSimpleRegisterClass<AArch64::GPR64spRegClassID, 0, 32>(
1017 Inst, Rn ,
Addr, Decoder);
1019 case AArch64::LDRAAindexed:
1020 case AArch64::LDRABindexed:
1024 DecodeSimpleRegisterClass<AArch64::GPR64RegClassID, 0, 32>(Inst, Rt,
Addr,
1026 DecodeSimpleRegisterClass<AArch64::GPR64spRegClassID, 0, 32>(Inst, Rn,
Addr,
1028 DecodeSImm<10>(Inst, offset,
Addr, Decoder);
1030 if (writeback && Rt == Rn && Rn != 31) {
1045 unsigned shift = extend & 0x7;
1052 case AArch64::ADDWrx:
1053 case AArch64::SUBWrx:
1054 DecodeSimpleRegisterClass<AArch64::GPR32spRegClassID, 0, 32>(Inst, Rd,
Addr,
1056 DecodeSimpleRegisterClass<AArch64::GPR32spRegClassID, 0, 32>(Inst, Rn,
Addr,
1058 DecodeSimpleRegisterClass<AArch64::GPR32RegClassID, 0, 32>(Inst, Rm,
Addr,
1061 case AArch64::ADDSWrx:
1062 case AArch64::SUBSWrx:
1063 DecodeSimpleRegisterClass<AArch64::GPR32RegClassID, 0, 32>(Inst, Rd,
Addr,
1065 DecodeSimpleRegisterClass<AArch64::GPR32spRegClassID, 0, 32>(Inst, Rn,
Addr,
1067 DecodeSimpleRegisterClass<AArch64::GPR32RegClassID, 0, 32>(Inst, Rm,
Addr,
1070 case AArch64::ADDXrx:
1071 case AArch64::SUBXrx:
1072 DecodeSimpleRegisterClass<AArch64::GPR64spRegClassID, 0, 32>(Inst, Rd,
Addr,
1074 DecodeSimpleRegisterClass<AArch64::GPR64spRegClassID, 0, 32>(Inst, Rn,
Addr,
1076 DecodeSimpleRegisterClass<AArch64::GPR32RegClassID, 0, 32>(Inst, Rm,
Addr,
1079 case AArch64::ADDSXrx:
1080 case AArch64::SUBSXrx:
1081 DecodeSimpleRegisterClass<AArch64::GPR64RegClassID, 0, 32>(Inst, Rd,
Addr,
1083 DecodeSimpleRegisterClass<AArch64::GPR64spRegClassID, 0, 32>(Inst, Rn,
Addr,
1085 DecodeSimpleRegisterClass<AArch64::GPR32RegClassID, 0, 32>(Inst, Rm,
Addr,
1088 case AArch64::ADDXrx64:
1089 case AArch64::SUBXrx64:
1090 DecodeSimpleRegisterClass<AArch64::GPR64spRegClassID, 0, 32>(Inst, Rd,
Addr,
1092 DecodeSimpleRegisterClass<AArch64::GPR64spRegClassID, 0, 32>(Inst, Rn,
Addr,
1094 DecodeSimpleRegisterClass<AArch64::GPR64RegClassID, 0, 32>(Inst, Rm,
Addr,
1097 case AArch64::SUBSXrx64:
1098 case AArch64::ADDSXrx64:
1099 DecodeSimpleRegisterClass<AArch64::GPR64RegClassID, 0, 32>(Inst, Rd,
Addr,
1101 DecodeSimpleRegisterClass<AArch64::GPR64spRegClassID, 0, 32>(Inst, Rn,
Addr,
1103 DecodeSimpleRegisterClass<AArch64::GPR64RegClassID, 0, 32>(Inst, Rm,
Addr,
1121 if (Inst.
getOpcode() == AArch64::ANDSXri)
1122 DecodeSimpleRegisterClass<AArch64::GPR64RegClassID, 0, 32>(Inst, Rd,
Addr,
1125 DecodeSimpleRegisterClass<AArch64::GPR64spRegClassID, 0, 32>(
1126 Inst, Rd,
Addr, Decoder);
1127 DecodeSimpleRegisterClass<AArch64::GPR64RegClassID, 0, 32>(Inst, Rn,
Addr,
1133 if (Inst.
getOpcode() == AArch64::ANDSWri)
1134 DecodeSimpleRegisterClass<AArch64::GPR32RegClassID, 0, 32>(Inst, Rd,
Addr,
1137 DecodeSimpleRegisterClass<AArch64::GPR32spRegClassID, 0, 32>(
1138 Inst, Rd,
Addr, Decoder);
1139 DecodeSimpleRegisterClass<AArch64::GPR32RegClassID, 0, 32>(Inst, Rn,
Addr,
1158 DecodeSimpleRegisterClass<AArch64::FPR64RegClassID, 0, 32>(Inst, Rd,
Addr,
1161 DecodeSimpleRegisterClass<AArch64::FPR128RegClassID, 0, 32>(Inst, Rd,
Addr,
1169 case AArch64::MOVIv4i16:
1170 case AArch64::MOVIv8i16:
1171 case AArch64::MVNIv4i16:
1172 case AArch64::MVNIv8i16:
1173 case AArch64::MOVIv2i32:
1174 case AArch64::MOVIv4i32:
1175 case AArch64::MVNIv2i32:
1176 case AArch64::MVNIv4i32:
1179 case AArch64::MOVIv2s_msl:
1180 case AArch64::MOVIv4s_msl:
1181 case AArch64::MVNIv2s_msl:
1182 case AArch64::MVNIv4s_msl:
1199 DecodeSimpleRegisterClass<AArch64::FPR128RegClassID, 0, 32>(Inst, Rd,
Addr,
1201 DecodeSimpleRegisterClass<AArch64::FPR128RegClassID, 0, 32>(Inst, Rd,
Addr,
1218 if (imm & (1 << (21 - 1)))
1219 imm |= ~((1LL << 21) - 1);
1221 DecodeSimpleRegisterClass<AArch64::GPR64RegClassID, 0, 32>(Inst, Rd,
Addr,
1238 unsigned ShifterVal = (Imm >> 12) & 3;
1239 unsigned ImmVal = Imm & 0xFFF;
1241 if (ShifterVal != 0 && ShifterVal != 1)
1246 DecodeSimpleRegisterClass<AArch64::GPR64spRegClassID, 0, 32>(
1247 Inst, Rd,
Addr, Decoder);
1249 DecodeSimpleRegisterClass<AArch64::GPR64RegClassID, 0, 32>(Inst, Rd,
Addr,
1251 DecodeSimpleRegisterClass<AArch64::GPR64spRegClassID, 0, 32>(Inst, Rn,
Addr,
1255 DecodeSimpleRegisterClass<AArch64::GPR32spRegClassID, 0, 32>(
1256 Inst, Rd,
Addr, Decoder);
1258 DecodeSimpleRegisterClass<AArch64::GPR32RegClassID, 0, 32>(Inst, Rd,
Addr,
1260 DecodeSimpleRegisterClass<AArch64::GPR32spRegClassID, 0, 32>(Inst, Rn,
Addr,
1276 if (imm & (1 << (26 - 1)))
1277 imm |= ~((1LL << 26) - 1);
1286 return Op1 == 0b000 && (Op2 == 0b000 ||
1297 uint64_t pstate_field = (op1 << 3) | op2;
1305 auto PState = AArch64PState::lookupPStateImm0_15ByEncoding(pstate_field);
1319 uint64_t pstate_field = (crm_high << 6) | (op1 << 3) | op2;
1327 auto PState = AArch64PState::lookupPStateImm0_1ByEncoding(pstate_field);
1343 if (dst & (1 << (14 - 1)))
1344 dst |= ~((1LL << 14) - 1);
1347 DecodeSimpleRegisterClass<AArch64::GPR32RegClassID, 0, 32>(Inst, Rt,
Addr,
1350 DecodeSimpleRegisterClass<AArch64::GPR64RegClassID, 0, 32>(Inst, Rt,
Addr,
1367 MCRegister Reg = AArch64MCRegisterClasses[RegClassID].getRegister(RegNo / 2);
1376 Inst, AArch64::WSeqPairsClassRegClassID, RegNo,
Addr, Decoder);
1383 Inst, AArch64::XSeqPairsClassRegClassID, RegNo,
Addr, Decoder);
1401 DecodeSimpleRegisterClass<AArch64::GPR64RegClassID, 0, 32>(Inst, Rt,
Addr,
1416 DecodeSimpleRegisterClass<AArch64::ZPRRegClassID, 0, 32>(Inst, Zdn,
Addr,
1418 if (Inst.
getOpcode() != AArch64::DUPM_ZI)
1419 DecodeSimpleRegisterClass<AArch64::ZPRRegClassID, 0, 32>(Inst, Zdn,
Addr,
1428 if (Imm & ~((1LL << Bits) - 1))
1432 if (Imm & (1 << (Bits - 1)))
1433 Imm |= ~((1LL << Bits) - 1);
1440template <
int ElementW
idth>
1444 unsigned Shift = (Imm & 0x100) ? 8 : 0;
1445 if (ElementWidth == 8 && Shift)
1462 if (AArch64SVCR::lookupSVCRByEncoding(Imm)) {
1478 if (Rd == Rs || Rs == Rn || Rd == Rn)
1483 if (!DecodeSimpleRegisterClass<AArch64::GPR64commonRegClassID, 0, 31>(
1484 Inst, Rd,
Addr, Decoder) ||
1485 !DecodeSimpleRegisterClass<AArch64::GPR64commonRegClassID, 0, 31>(
1486 Inst, Rs,
Addr, Decoder) ||
1487 !DecodeSimpleRegisterClass<AArch64::GPR64RegClassID, 0, 32>(
1488 Inst, Rn,
Addr, Decoder) ||
1489 !DecodeSimpleRegisterClass<AArch64::GPR64commonRegClassID, 0, 31>(
1490 Inst, Rd,
Addr, Decoder) ||
1491 !DecodeSimpleRegisterClass<AArch64::GPR64commonRegClassID, 0, 31>(
1492 Inst, Rs,
Addr, Decoder) ||
1493 !DecodeSimpleRegisterClass<AArch64::GPR64RegClassID, 0, 32>(
1494 Inst, Rn,
Addr, Decoder))
1509 if (Rd == Rm || Rm == Rn || Rd == Rn)
1514 if (!DecodeSimpleRegisterClass<AArch64::GPR64commonRegClassID, 0, 31>(
1515 Inst, Rd,
Addr, Decoder) ||
1516 !DecodeSimpleRegisterClass<AArch64::GPR64RegClassID, 0, 32>(
1517 Inst, Rn,
Addr, Decoder) ||
1518 !DecodeSimpleRegisterClass<AArch64::GPR64commonRegClassID, 0, 31>(
1519 Inst, Rd,
Addr, Decoder) ||
1520 !DecodeSimpleRegisterClass<AArch64::GPR64RegClassID, 0, 32>(
1521 Inst, Rn,
Addr, Decoder) ||
1522 !DecodeSimpleRegisterClass<AArch64::GPR64RegClassID, 0, 32>(
1523 Inst, Rm,
Addr, Decoder))
1534 unsigned Mask = 0x18;
1536 if ((Rt & Mask) == Mask)
1545 DecodeSimpleRegisterClass<AArch64::GPR64spRegClassID, 0, 32>(Inst, Rn,
Addr,
1551 case AArch64::PRFMroW:
1552 DecodeSimpleRegisterClass<AArch64::GPR32RegClassID, 0, 32>(Inst, Rm,
Addr,
1555 case AArch64::PRFMroX:
1556 DecodeSimpleRegisterClass<AArch64::GPR64RegClassID, 0, 32>(Inst, Rm,
Addr,
1566#include "AArch64GenDisassemblerTables.inc"
1567#include "AArch64GenInstrInfo.inc"
1584 if (Bytes.
size() < 4)
1590 (Bytes[3] << 24) | (Bytes[2] << 16) | (Bytes[1] << 8) | (Bytes[0] << 0);
1592 const uint8_t *Tables[] = {DecoderTable32, DecoderTableFallback32};
1594 for (
const auto *Table : Tables) {
1596 decodeInstruction(Table,
MI, Insn,
Address,
this,
STI);
1603 for (
unsigned i = 0; i <
Desc.getNumOperands(); i++) {
1605 switch (
Desc.operands()[i].RegClass) {
1608 case AArch64::MPRRegClassID:
1611 case AArch64::MPR8RegClassID:
1614 case AArch64::ZTRRegClassID:
1618 }
else if (
Desc.operands()[i].OperandType ==
1624 if (
MI.getOpcode() == AArch64::LDR_ZA ||
1625 MI.getOpcode() == AArch64::STR_ZA) {
1630 assert(Imm4Op.
isImm() &&
"Unexpected operand type!");
1631 MI.addOperand(Imm4Op);
1653 std::unique_ptr<MCRelocationInfo> &&RelInfo) {
1655 SymbolLookUp, DisInfo);
static DecodeStatus DecodeUnconditionalBranch(MCInst &Inst, uint32_t insn, uint64_t Addr, const MCDisassembler *Decoder)
static DecodeStatus DecodePCRelLabel16(MCInst &Inst, unsigned Imm, uint64_t Addr, const MCDisassembler *Decoder)
static DecodeStatus DecodeSystemPStateImm0_1Instruction(MCInst &Inst, uint32_t insn, uint64_t Addr, const MCDisassembler *Decoder)
static DecodeStatus DecodeZPRMul2_MinMax(MCInst &Inst, unsigned RegNo, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeVecShiftL64Imm(MCInst &Inst, unsigned Imm, uint64_t Addr, const MCDisassembler *Decoder)
static DecodeStatus DecodeVecShiftL32Imm(MCInst &Inst, unsigned Imm, uint64_t Addr, const MCDisassembler *Decoder)
static MCSymbolizer * createAArch64ExternalSymbolizer(const Triple &TT, LLVMOpInfoCallback GetOpInfo, LLVMSymbolLookupCallback SymbolLookUp, void *DisInfo, MCContext *Ctx, std::unique_ptr< MCRelocationInfo > &&RelInfo)
static DecodeStatus DecodeCPYMemOpInstruction(MCInst &Inst, uint32_t insn, uint64_t Addr, const MCDisassembler *Decoder)
static DecodeStatus DecodeVecShiftR8Imm(MCInst &Inst, unsigned Imm, uint64_t Addr, const MCDisassembler *Decoder)
static DecodeStatus DecodeUnsignedLdStInstruction(MCInst &Inst, uint32_t insn, uint64_t Addr, const MCDisassembler *Decoder)
static DecodeStatus DecodeModImmTiedInstruction(MCInst &Inst, uint32_t insn, uint64_t Addr, const MCDisassembler *Decoder)
static DecodeStatus DecodeFixedPointScaleImm64(MCInst &Inst, unsigned Imm, uint64_t Addr, const MCDisassembler *Decoder)
static DecodeStatus DecodeSystemPStateImm0_15Instruction(MCInst &Inst, uint32_t insn, uint64_t Addr, const MCDisassembler *Decoder)
static DecodeStatus DecodeModImmInstruction(MCInst &Inst, uint32_t insn, uint64_t Addr, const MCDisassembler *Decoder)
static MCDisassembler * createAArch64Disassembler(const Target &T, const MCSubtargetInfo &STI, MCContext &Ctx)
static DecodeStatus DecodeGPR64x8ClassRegisterClass(MCInst &Inst, unsigned RegNo, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeThreeAddrSRegInstruction(MCInst &Inst, uint32_t insn, uint64_t Addr, const MCDisassembler *Decoder)
static const MCPhysReg MatrixZATileDecoderTable[5][16]
static DecodeStatus DecodeXSeqPairsClassRegisterClass(MCInst &Inst, unsigned RegNo, uint64_t Addr, const MCDisassembler *Decoder)
static DecodeStatus DecodeExclusiveLdStInstruction(MCInst &Inst, uint32_t insn, uint64_t Addr, const MCDisassembler *Decoder)
static DecodeStatus DecodeVecShiftL16Imm(MCInst &Inst, unsigned Imm, uint64_t Addr, const MCDisassembler *Decoder)
static DecodeStatus DecodeTestAndBranch(MCInst &Inst, uint32_t insn, uint64_t Addr, const MCDisassembler *Decoder)
static DecodeStatus DecodeMatrixTile(MCInst &Inst, unsigned RegNo, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeSImm(MCInst &Inst, uint64_t Imm, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeVecShiftR32ImmNarrow(MCInst &Inst, unsigned Imm, uint64_t Addr, const MCDisassembler *Decoder)
static DecodeStatus DecodeZK(MCInst &Inst, unsigned RegNo, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeAdrInstruction(MCInst &Inst, uint32_t insn, uint64_t Addr, const MCDisassembler *Decoder)
static DecodeStatus DecodePPR2Mul2RegisterClass(MCInst &Inst, unsigned RegNo, uint64_t Address, const void *Decoder)
static DecodeStatus DecodePairLdStInstruction(MCInst &Inst, uint32_t insn, uint64_t Addr, const MCDisassembler *Decoder)
static DecodeStatus DecodeVecShiftL8Imm(MCInst &Inst, unsigned Imm, uint64_t Addr, const MCDisassembler *Decoder)
static DecodeStatus DecodeSVEIncDecImm(MCInst &Inst, unsigned Imm, uint64_t Addr, const MCDisassembler *Decoder)
static DecodeStatus DecodeVecShiftRImm(MCInst &Inst, unsigned Imm, unsigned Add)
static DecodeStatus DecodeFixedPointScaleImm32(MCInst &Inst, unsigned Imm, uint64_t Addr, const MCDisassembler *Decoder)
static DecodeStatus DecodeMoveImmInstruction(MCInst &Inst, uint32_t insn, uint64_t Addr, const MCDisassembler *Decoder)
static DecodeStatus DecodeVecShiftR64Imm(MCInst &Inst, unsigned Imm, uint64_t Addr, const MCDisassembler *Decoder)
static DecodeStatus DecodePCRelLabel9(MCInst &Inst, unsigned Imm, uint64_t Addr, const MCDisassembler *Decoder)
static DecodeStatus DecodeVecShiftLImm(MCInst &Inst, unsigned Imm, unsigned Add)
static DecodeStatus DecodeVecShiftR16ImmNarrow(MCInst &Inst, unsigned Imm, uint64_t Addr, const MCDisassembler *Decoder)
static DecodeStatus DecodeSVCROp(MCInst &Inst, unsigned Imm, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeWSeqPairsClassRegisterClass(MCInst &Inst, unsigned RegNo, uint64_t Addr, const MCDisassembler *Decoder)
static DecodeStatus DecodeVecShiftR64ImmNarrow(MCInst &Inst, unsigned Imm, uint64_t Addr, const MCDisassembler *Decoder)
static DecodeStatus DecodeZPR4Mul4RegisterClass(MCInst &Inst, unsigned RegNo, uint64_t Address, const void *Decoder)
static DecodeStatus DecodeLogicalImmInstruction(MCInst &Inst, uint32_t insn, uint64_t Addr, const MCDisassembler *Decoder)
static DecodeStatus DecodeMSRSystemRegister(MCInst &Inst, unsigned Imm, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeZPR2Mul2RegisterClass(MCInst &Inst, unsigned RegNo, uint64_t Address, const void *Decoder)
LLVM_ABI LLVM_EXTERNAL_VISIBILITY void LLVMInitializeAArch64Disassembler()
static DecodeStatus DecodeSETMemOpInstruction(MCInst &Inst, uint32_t insn, uint64_t Addr, const MCDisassembler *Decoder)
static DecodeStatus DecodeSVELogicalImmInstruction(MCInst &Inst, uint32_t insn, uint64_t Addr, const MCDisassembler *Decoder)
static DecodeStatus DecodeMemExtend(MCInst &Inst, unsigned Imm, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeSignedLdStInstruction(MCInst &Inst, uint32_t insn, uint64_t Addr, const MCDisassembler *Decoder)
static DecodeStatus DecodeAuthLoadInstruction(MCInst &Inst, uint32_t insn, uint64_t Addr, const MCDisassembler *Decoder)
static DecodeStatus DecodeSyspXzrInstruction(MCInst &Inst, uint32_t insn, uint64_t Addr, const MCDisassembler *Decoder)
static DecodeStatus DecodeFMOVLaneInstruction(MCInst &Inst, unsigned Insn, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeAddSubERegInstruction(MCInst &Inst, uint32_t insn, uint64_t Addr, const MCDisassembler *Decoder)
static bool isInvalidPState(uint64_t Op1, uint64_t Op2)
static DecodeStatus DecodeSimpleRegisterClass(MCInst &Inst, unsigned RegNo, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeMatrixTileListRegisterClass(MCInst &Inst, unsigned RegMask, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodeVecShiftR16Imm(MCInst &Inst, unsigned Imm, uint64_t Addr, const MCDisassembler *Decoder)
static DecodeStatus DecodeVecShiftR32Imm(MCInst &Inst, unsigned Imm, uint64_t Addr, const MCDisassembler *Decoder)
static DecodeStatus DecodeImm8OptLsl(MCInst &Inst, unsigned Imm, uint64_t Addr, const MCDisassembler *Decoder)
static DecodeStatus DecodePRFMRegInstruction(MCInst &Inst, uint32_t insn, uint64_t Addr, const MCDisassembler *Decoder)
static DecodeStatus DecodeAddSubImmShift(MCInst &Inst, uint32_t insn, uint64_t Addr, const MCDisassembler *Decoder)
static DecodeStatus DecodeGPRSeqPairsClassRegisterClass(MCInst &Inst, unsigned RegClassID, unsigned RegNo, uint64_t Addr, const MCDisassembler *Decoder)
static DecodeStatus DecodeMRSSystemRegister(MCInst &Inst, unsigned Imm, uint64_t Address, const MCDisassembler *Decoder)
static DecodeStatus DecodePCRelLabel19(MCInst &Inst, unsigned Imm, uint64_t Addr, const MCDisassembler *Decoder)
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
#define LLVM_EXTERNAL_VISIBILITY
MCDisassembler::DecodeStatus getInstruction(MCInst &Instr, uint64_t &Size, ArrayRef< uint8_t > Bytes, uint64_t Address, raw_ostream &CStream) const override
Returns the disassembly of a single instruction.
uint64_t suggestBytesToSkip(ArrayRef< uint8_t > Bytes, uint64_t Address) const override
Suggest a distance to skip in a buffer of data to find the next place to look for the start of an ins...
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
size_t size() const
size - Get the array size.
Context object for machine code objects.
Superclass for all disassemblers.
bool tryAddingSymbolicOperand(MCInst &Inst, int64_t Value, uint64_t Address, bool IsBranch, uint64_t Offset, uint64_t OpSize, uint64_t InstSize) const
const MCSubtargetInfo & getSubtargetInfo() const
const MCSubtargetInfo & STI
raw_ostream * CommentStream
DecodeStatus
Ternary decode status.
Instances of this class represent a single low-level machine instruction.
unsigned getOpcode() const
void addOperand(const MCOperand Op)
const MCOperand & getOperand(unsigned i) const
Describe properties that are true of each instruction in the target description file.
Instances of this class represent operands of the MCInst class.
static MCOperand createReg(MCRegister Reg)
static MCOperand createImm(int64_t Val)
Wrapper class representing physical registers. Should be passed by value.
Generic base class for all target subtargets.
const FeatureBitset & getFeatureBits() const
Symbolize and annotate disassembled instructions.
Wrapper class representing virtual and physical registers.
Target - Wrapper for Target specific information.
Triple - Helper class for working with autoconf configuration names.
This class implements an extremely fast bulk output stream that can only output to a stream.
const char *(* LLVMSymbolLookupCallback)(void *DisInfo, uint64_t ReferenceValue, uint64_t *ReferenceType, uint64_t ReferencePC, const char **ReferenceName)
The type for the symbol lookup function.
int(* LLVMOpInfoCallback)(void *DisInfo, uint64_t PC, uint64_t Offset, uint64_t OpSize, uint64_t InstSize, int TagType, void *TagBuf)
The type for the operand information call back function.
static bool isValidDecodeLogicalImmediate(uint64_t val, unsigned regSize)
isValidDecodeLogicalImmediate - Check to see if the logical immediate value in the form "N:immr:imms"...
std::enable_if_t< std::is_integral_v< IntType >, IntType > fieldFromInstruction(const IntType &Insn, unsigned StartBit, unsigned NumBits)
This is an optimization pass for GlobalISel generic memory operations.
Target & getTheAArch64beTarget()
Target & getTheAArch64leTarget()
Target & getTheAArch64_32Target()
Target & getTheARM64_32Target()
Target & getTheARM64Target()
Description of the encoding of one expression Op.
static void RegisterMCSymbolizer(Target &T, Target::MCSymbolizerCtorTy Fn)
RegisterMCSymbolizer - Register an MCSymbolizer implementation for the given target.
static void RegisterMCDisassembler(Target &T, Target::MCDisassemblerCtorTy Fn)
RegisterMCDisassembler - Register a MCDisassembler implementation for the given target.