12#if V8_TARGET_ARCH_ARM64
48void DisassemblingDecoder::VisitAddSubImmediate(Instruction*
instr) {
53 const char* mnemonic =
"";
54 const char* form =
"'Rds, 'Rns, 'IAddSub";
55 const char* form_cmp =
"'Rns, 'IAddSub";
56 const char* form_mov =
"'Rds, 'Rns";
96void DisassemblingDecoder::VisitAddSubShifted(Instruction*
instr) {
99 const char* mnemonic =
"";
100 const char* form =
"'Rd, 'Rn, 'Rm'NDP";
101 const char* form_cmp =
"'Rn, 'Rm'NDP";
102 const char* form_neg =
"'Rd, 'Rm'NDP";
133 }
else if (rn_is_zr) {
145void DisassemblingDecoder::VisitAddSubExtended(Instruction*
instr) {
147 const char* mnemonic =
"";
149 const char* form = ((mode ==
UXTX) || (mode ==
SXTX)) ?
"'Rds, 'Rns, 'Xm'Ext"
150 :
"'Rds, 'Rns, 'Wm'Ext";
151 const char* form_cmp =
152 ((mode ==
UXTX) || (mode ==
SXTX)) ?
"'Rns, 'Xm'Ext" :
"'Rns, 'Wm'Ext";
187void DisassemblingDecoder::VisitAddSubWithCarry(Instruction*
instr) {
189 const char* mnemonic =
"";
190 const char* form =
"'Rd, 'Rn, 'Rm";
191 const char* form_neg =
"'Rd, 'Rm";
226void DisassemblingDecoder::VisitLogicalImmediate(Instruction*
instr) {
229 const char* mnemonic =
"";
230 const char* form =
"'Rds, 'Rn, 'ITri";
232 if (
instr->ImmLogical() == 0) {
234 Format(
instr,
"unallocated",
"(LogicalImmediate)");
250 form =
"'Rds, 'ITri";
278 if (((value & 0xFFFFFFFFFFFF0000UL) == 0UL) ||
279 ((value & 0xFFFFFFFF0000FFFFUL) == 0UL) ||
280 ((value & 0xFFFF0000FFFFFFFFUL) == 0UL) ||
281 ((value & 0x0000FFFFFFFFFFFFUL) == 0UL)) {
287 (((value & 0xFFFFFFFFFFFF0000UL) == 0xFFFFFFFFFFFF0000UL) ||
288 ((value & 0xFFFFFFFF0000FFFFUL) == 0xFFFFFFFF0000FFFFUL) ||
289 ((value & 0xFFFF0000FFFFFFFFUL) == 0xFFFF0000FFFFFFFFUL) ||
290 ((value & 0x0000FFFFFFFFFFFFUL) == 0x0000FFFFFFFFFFFFUL))) {
293 if ((reg_size ==
kWRegSizeInBits) && (((value & 0xFFFF0000) == 0xFFFF0000) ||
294 ((value & 0x0000FFFF) == 0x0000FFFF))) {
300void DisassemblingDecoder::VisitLogicalShifted(Instruction*
instr) {
303 const char* mnemonic =
"";
304 const char* form =
"'Rd, 'Rn, 'Rm'NLo";
332 form =
"'Rn, 'Rm'NLo";
339 if (rn_is_zr && (
instr->ImmDPShift() == 0) && (
instr->ShiftDP() ==
LSL)) {
350 form =
"'Rd, 'Rm'NLo";
361void DisassemblingDecoder::VisitConditionalCompareRegister(Instruction*
instr) {
362 const char* mnemonic =
"";
363 const char* form =
"'Rn, 'Rm, 'INzcv, 'Cond";
380void DisassemblingDecoder::VisitConditionalCompareImmediate(
381 Instruction*
instr) {
382 const char* mnemonic =
"";
383 const char* form =
"'Rn, 'IP, 'INzcv, 'Cond";
400void DisassemblingDecoder::VisitConditionalSelect(Instruction*
instr) {
403 const char* mnemonic =
"";
404 const char* form =
"'Rd, 'Rn, 'Rm, 'Cond";
405 const char* form_test =
"'Rd, 'CInv";
406 const char* form_update =
"'Rd, 'Rn, 'CInv";
409 bool invertible_cond = (cond !=
al) && (cond !=
nv);
419 if (rnm_is_zr && invertible_cond) {
422 }
else if (rn_is_rm && invertible_cond) {
431 if (rnm_is_zr && invertible_cond) {
434 }
else if (rn_is_rm && invertible_cond) {
443 if (rn_is_rm && invertible_cond) {
455void DisassemblingDecoder::VisitBitfield(Instruction*
instr) {
456 unsigned s =
instr->ImmS();
457 unsigned r =
instr->ImmR();
458 unsigned rd_size_minus_1 =
460 const char* mnemonic =
"";
461 const char* form =
"";
462 const char* form_shift_right =
"'Rd, 'Rn, 'IBr";
463 const char* form_extend =
"'Rd, 'Wn";
464 const char* form_bfiz =
"'Rd, 'Rn, 'IBZ-r, 'IBs+1";
465 const char* form_bfx =
"'Rd, 'Rn, 'IBr, 'IBs-r+1";
466 const char* form_lsl =
"'Rd, 'Rn, 'IBZ-r";
477 }
else if (s == 15) {
479 }
else if ((s == 31) && (
instr->SixtyFourBits() == 1)) {
484 }
else if (s == rd_size_minus_1) {
486 form = form_shift_right;
501 }
else if (s == 15) {
507 if (s == rd_size_minus_1) {
509 form = form_shift_right;
510 }
else if (
r == s + 1) {
532void DisassemblingDecoder::VisitExtract(Instruction*
instr) {
533 const char* mnemonic =
"";
534 const char* form =
"'Rd, 'Rn, 'Rm, 'IExtract";
541 form =
"'Rd, 'Rn, 'IExtract";
553void DisassemblingDecoder::VisitPCRelAddressing(Instruction*
instr) {
560 Format(
instr,
"unimplemented",
"(PCRelAddressing)");
564void DisassemblingDecoder::VisitConditionalBranch(Instruction*
instr) {
574void DisassemblingDecoder::VisitUnconditionalBranchToRegister(
575 Instruction*
instr) {
576 const char* mnemonic =
"unimplemented";
577 const char* form =
"'Xn";
594 form =
"(UnconditionalBranchToRegister)";
599void DisassemblingDecoder::VisitUnconditionalBranch(Instruction*
instr) {
600 const char* mnemonic =
"";
601 const char* form =
"'TImmUncn";
616void DisassemblingDecoder::VisitDataProcessing1Source(Instruction*
instr) {
617 const char* mnemonic =
"";
618 const char* form =
"'Rd, 'Rn";
621#define FORMAT(A, B) \
626 FORMAT(
RBIT,
"rbit");
627 FORMAT(
REV16,
"rev16");
641void DisassemblingDecoder::VisitDataProcessing2Source(Instruction*
instr) {
642 const char* mnemonic =
"unimplemented";
643 const char* form =
"'Rd, 'Rn, 'Rm";
646#define FORMAT(A, B) \
651 FORMAT(
UDIV,
"udiv");
652 FORMAT(
SDIV,
"sdiv");
659 form =
"(DataProcessing2Source)";
664void DisassemblingDecoder::VisitDataProcessing3Source(Instruction*
instr) {
666 const char* mnemonic =
"";
667 const char* form =
"'Xd, 'Wn, 'Wm, 'Xa";
668 const char* form_rrr =
"'Rd, 'Rn, 'Rm";
669 const char* form_rrrr =
"'Rd, 'Rn, 'Rm, 'Ra";
670 const char* form_xww =
"'Xd, 'Wn, 'Wm";
671 const char* form_xxx =
"'Xd, 'Xn, 'Xm";
742void DisassemblingDecoder::VisitCompareBranch(Instruction*
instr) {
743 const char* mnemonic =
"";
744 const char* form =
"'Rt, 'TImmCmpa";
761void DisassemblingDecoder::VisitTestBranch(Instruction*
instr) {
762 const char* mnemonic =
"";
767 const char* form =
"'Rt, 'IS, 'TImmTest";
782void DisassemblingDecoder::VisitMoveWideImmediate(Instruction*
instr) {
783 const char* mnemonic =
"";
784 const char* form =
"'Rd, 'IMoveImm";
801 form =
"'Rd, 'IMoveLSL";
809#define LOAD_STORE_LIST(V) \
810 V(STRB_w, "strb", "'Wt") \
811 V(STRH_w, "strh", "'Wt") \
812 V(STR_w, "str", "'Wt") \
813 V(STR_x, "str", "'Xt") \
814 V(LDRB_w, "ldrb", "'Wt") \
815 V(LDRH_w, "ldrh", "'Wt") \
816 V(LDR_w, "ldr", "'Wt") \
817 V(LDR_x, "ldr", "'Xt") \
818 V(LDRSB_x, "ldrsb", "'Xt") \
819 V(LDRSH_x, "ldrsh", "'Xt") \
820 V(LDRSW_x, "ldrsw", "'Xt") \
821 V(LDRSB_w, "ldrsb", "'Wt") \
822 V(LDRSH_w, "ldrsh", "'Wt") \
823 V(STR_b, "str", "'Bt") \
824 V(STR_h, "str", "'Ht") \
825 V(STR_s, "str", "'St") \
826 V(STR_d, "str", "'Dt") \
827 V(LDR_b, "ldr", "'Bt") \
828 V(LDR_h, "ldr", "'Ht") \
829 V(LDR_s, "ldr", "'St") \
830 V(LDR_d, "ldr", "'Dt") \
831 V(STR_q, "str", "'Qt") \
832 V(LDR_q, "ldr", "'Qt")
834void DisassemblingDecoder::VisitLoadStorePreIndex(Instruction*
instr) {
835 const char* mnemonic =
"unimplemented";
836 const char* form =
"(LoadStorePreIndex)";
839#define LS_PREINDEX(A, B, C) \
842 form = C ", ['Xns'ILS]!"; \
844 LOAD_STORE_LIST(LS_PREINDEX)
850void DisassemblingDecoder::VisitLoadStorePostIndex(Instruction*
instr) {
851 const char* mnemonic =
"unimplemented";
852 const char* form =
"(LoadStorePostIndex)";
855#define LS_POSTINDEX(A, B, C) \
858 form = C ", ['Xns]'ILS"; \
860 LOAD_STORE_LIST(LS_POSTINDEX)
866void DisassemblingDecoder::VisitLoadStoreUnsignedOffset(Instruction*
instr) {
867 const char* mnemonic =
"unimplemented";
868 const char* form =
"(LoadStoreUnsignedOffset)";
871#define LS_UNSIGNEDOFFSET(A, B, C) \
874 form = C ", ['Xns'ILU]"; \
876 LOAD_STORE_LIST(LS_UNSIGNEDOFFSET)
877#undef LS_UNSIGNEDOFFSET
880 form =
"'PrefOp, ['Xn'ILU]";
885void DisassemblingDecoder::VisitLoadStoreRegisterOffset(Instruction*
instr) {
886 const char* mnemonic =
"unimplemented";
887 const char* form =
"(LoadStoreRegisterOffset)";
890#define LS_REGISTEROFFSET(A, B, C) \
893 form = C ", ['Xns, 'Offsetreg]"; \
895 LOAD_STORE_LIST(LS_REGISTEROFFSET)
896#undef LS_REGISTEROFFSET
899 form =
"'PrefOp, ['Xns, 'Offsetreg]";
904#undef LOAD_STORE_LIST
906#define LOAD_STORE_UNSCALED_LIST(V) \
907 V(STURB_w, "sturb", "'Wt") \
908 V(STURH_w, "sturh", "'Wt") \
909 V(STUR_w, "stur", "'Wt") \
910 V(STUR_x, "stur", "'Xt") \
911 V(LDURB_w, "ldurb", "'Wt") \
912 V(LDURH_w, "ldurh", "'Wt") \
913 V(LDUR_w, "ldur", "'Wt") \
914 V(LDUR_x, "ldur", "'Xt") \
915 V(LDURSB_x, "ldursb", "'Xt") \
916 V(LDURSH_x, "ldursh", "'Xt") \
917 V(LDURSW_x, "ldursw", "'Xt") \
918 V(LDURSB_w, "ldursb", "'Wt") \
919 V(LDURSH_w, "ldursh", "'Wt") \
920 V(STUR_b, "stur", "'Bt") \
921 V(STUR_h, "stur", "'Ht") \
922 V(STUR_s, "stur", "'St") \
923 V(STUR_d, "stur", "'Dt") \
924 V(LDUR_b, "ldur", "'Bt") \
925 V(LDUR_h, "ldur", "'Ht") \
926 V(LDUR_s, "ldur", "'St") \
927 V(LDUR_d, "ldur", "'Dt") \
928 V(STUR_q, "stur", "'Qt") \
929 V(LDUR_q, "ldur", "'Qt")
931void DisassemblingDecoder::VisitLoadStoreUnscaledOffset(Instruction*
instr) {
932 const char* mnemonic =
"unimplemented";
933 const char* form =
"(LoadStoreUnscaledOffset)";
936#define LS_UNSCALEDOFFSET(A, B, C) \
939 form = C ", ['Xns'ILS]"; \
941 LOAD_STORE_UNSCALED_LIST(LS_UNSCALEDOFFSET)
942#undef LS_UNSCALEDOFFSET
947#undef LOAD_STORE_UNSCALED_LIST
949void DisassemblingDecoder::VisitLoadLiteral(Instruction*
instr) {
950 const char* mnemonic =
"ldr";
951 const char* form =
"(LoadLiteral)";
955 form =
"'Wt, 'ILLiteral 'LValue";
958 form =
"'Xt, 'ILLiteral 'LValue";
961 form =
"'St, 'ILLiteral 'LValue";
964 form =
"'Dt, 'ILLiteral 'LValue";
967 mnemonic =
"unimplemented";
972#define LOAD_STORE_PAIR_LIST(V) \
973 V(STP_w, "stp", "'Wt, 'Wt2", "2") \
974 V(LDP_w, "ldp", "'Wt, 'Wt2", "2") \
975 V(LDPSW_x, "ldpsw", "'Xt, 'Xt2", "2") \
976 V(STP_x, "stp", "'Xt, 'Xt2", "3") \
977 V(LDP_x, "ldp", "'Xt, 'Xt2", "3") \
978 V(STP_s, "stp", "'St, 'St2", "2") \
979 V(LDP_s, "ldp", "'St, 'St2", "2") \
980 V(STP_d, "stp", "'Dt, 'Dt2", "3") \
981 V(LDP_d, "ldp", "'Dt, 'Dt2", "3") \
982 V(LDP_q, "ldp", "'Qt, 'Qt2", "4") \
983 V(STP_q, "stp", "'Qt, 'Qt2", "4")
985void DisassemblingDecoder::VisitLoadStorePairPostIndex(Instruction*
instr) {
986 const char* mnemonic =
"unimplemented";
987 const char* form =
"(LoadStorePairPostIndex)";
990#define LSP_POSTINDEX(A, B, C, D) \
993 form = C ", ['Xns]'ILP" D; \
995 LOAD_STORE_PAIR_LIST(LSP_POSTINDEX)
1001void DisassemblingDecoder::VisitLoadStorePairPreIndex(Instruction*
instr) {
1002 const char* mnemonic =
"unimplemented";
1003 const char* form =
"(LoadStorePairPreIndex)";
1006#define LSP_PREINDEX(A, B, C, D) \
1009 form = C ", ['Xns'ILP" D "]!"; \
1011 LOAD_STORE_PAIR_LIST(LSP_PREINDEX)
1017void DisassemblingDecoder::VisitLoadStorePairOffset(Instruction*
instr) {
1018 const char* mnemonic =
"unimplemented";
1019 const char* form =
"(LoadStorePairOffset)";
1022#define LSP_OFFSET(A, B, C, D) \
1025 form = C ", ['Xns'ILP" D "]"; \
1027 LOAD_STORE_PAIR_LIST(LSP_OFFSET)
1033#undef LOAD_STORE_PAIR_LIST
1035#define LOAD_STORE_ACQUIRE_RELEASE_LIST(V) \
1036 V(STLXR_b, "stlxrb", "'Ws, 'Wt") \
1037 V(STLXR_h, "stlxrh", "'Ws, 'Wt") \
1038 V(STLXR_w, "stlxr", "'Ws, 'Wt") \
1039 V(STLXR_x, "stlxr", "'Ws, 'Xt") \
1040 V(LDAXR_b, "ldaxrb", "'Wt") \
1041 V(LDAXR_h, "ldaxrh", "'Wt") \
1042 V(LDAXR_w, "ldaxr", "'Wt") \
1043 V(LDAXR_x, "ldaxr", "'Xt") \
1044 V(STLR_b, "stlrb", "'Wt") \
1045 V(STLR_h, "stlrh", "'Wt") \
1046 V(STLR_w, "stlr", "'Wt") \
1047 V(STLR_x, "stlr", "'Xt") \
1048 V(LDAR_b, "ldarb", "'Wt") \
1049 V(LDAR_h, "ldarh", "'Wt") \
1050 V(LDAR_w, "ldar", "'Wt") \
1051 V(LDAR_x, "ldar", "'Xt") \
1052 V(CAS_w, "cas", "'Ws, 'Wt") \
1053 V(CAS_x, "cas", "'Xs, 'Xt") \
1054 V(CASA_w, "casa", "'Ws, 'Wt") \
1055 V(CASA_x, "casa", "'Xs, 'Xt") \
1056 V(CASL_w, "casl", "'Ws, 'Wt") \
1057 V(CASL_x, "casl", "'Xs, 'Xt") \
1058 V(CASAL_w, "casal", "'Ws, 'Wt") \
1059 V(CASAL_x, "casal", "'Xs, 'Xt") \
1060 V(CASB, "casb", "'Ws, 'Wt") \
1061 V(CASAB, "casab", "'Ws, 'Wt") \
1062 V(CASLB, "caslb", "'Ws, 'Wt") \
1063 V(CASALB, "casalb", "'Ws, 'Wt") \
1064 V(CASH, "cash", "'Ws, 'Wt") \
1065 V(CASAH, "casah", "'Ws, 'Wt") \
1066 V(CASLH, "caslh", "'Ws, 'Wt") \
1067 V(CASALH, "casalh", "'Ws, 'Wt") \
1068 V(CASP_w, "casp", "'Ws, 'Ws+, 'Wt, 'Wt+") \
1069 V(CASP_x, "casp", "'Xs, 'Xs+, 'Xt, 'Xt+") \
1070 V(CASPA_w, "caspa", "'Ws, 'Ws+, 'Wt, 'Wt+") \
1071 V(CASPA_x, "caspa", "'Xs, 'Xs+, 'Xt, 'Xt+") \
1072 V(CASPL_w, "caspl", "'Ws, 'Ws+, 'Wt, 'Wt+") \
1073 V(CASPL_x, "caspl", "'Xs, 'Xs+, 'Xt, 'Xt+") \
1074 V(CASPAL_w, "caspal", "'Ws, 'Ws+, 'Wt, 'Wt+") \
1075 V(CASPAL_x, "caspal", "'Xs, 'Xs+, 'Xt, 'Xt+")
1077void DisassemblingDecoder::VisitLoadStoreAcquireRelease(Instruction*
instr) {
1078 const char* mnemonic =
"unimplemented";
1082#define LSAR(A, B, C) \
1085 form = C ", ['Xns]"; \
1087 LOAD_STORE_ACQUIRE_RELEASE_LIST(LSAR)
1090 form =
"(LoadStoreAcquireRelease)";
1102 if ((
instr->Rs() % 2 == 1) || (
instr->Rt() % 2 == 1)) {
1103 mnemonic =
"unallocated";
1104 form =
"(LoadStoreExclusive)";
1112#undef LOAD_STORE_ACQUIRE_RELEASE_LIST
1114#define ATOMIC_MEMORY_SIMPLE_LIST(V) \
1124void DisassemblingDecoder::VisitAtomicMemory(Instruction*
instr) {
1125 const int kMaxAtomicOpMnemonicLength = 16;
1126 const char* mnemonic;
1127 const char* form =
"'Ws, 'Wt, ['Xns]";
1132 mnemonic = MN "b"; \
1135 mnemonic = MN "ab"; \
1138 mnemonic = MN "lb"; \
1141 mnemonic = MN "alb"; \
1144 mnemonic = MN "h"; \
1147 mnemonic = MN "ah"; \
1150 mnemonic = MN "lh"; \
1153 mnemonic = MN "alh"; \
1159 mnemonic = MN "a"; \
1162 mnemonic = MN "l"; \
1165 mnemonic = MN "al"; \
1169 form = "'Xs, 'Xt, ['Xns]"; \
1172 mnemonic = MN "a"; \
1173 form = "'Xs, 'Xt, ['Xns]"; \
1176 mnemonic = MN "l"; \
1177 form = "'Xs, 'Xt, ['Xns]"; \
1180 mnemonic = MN "al"; \
1181 form = "'Xs, 'Xt, ['Xns]"; \
1183 ATOMIC_MEMORY_SIMPLE_LIST(AMS)
1190 mnemonic =
"unimplemented";
1191 form =
"(AtomicMemory)";
1194 const char* prefix =
"";
1214 unsigned rt = instr->Rt(); \
1215 if (rt == kZeroRegCode) { \
1217 form = "'Ws, ['Xns]"; \
1224 unsigned rt = instr->Rt(); \
1225 if (rt == kZeroRegCode) { \
1227 form = "'Xs, ['Xns]"; \
1231 ATOMIC_MEMORY_SIMPLE_LIST(AMS)
1235 char buffer[kMaxAtomicOpMnemonicLength];
1236 if (strlen(prefix) > 0) {
1237 snprintf(buffer, kMaxAtomicOpMnemonicLength,
"%s%s", prefix, mnemonic);
1244void DisassemblingDecoder::VisitFPCompare(Instruction*
instr) {
1245 const char* mnemonic =
"unimplemented";
1246 const char* form =
"'Fn, 'Fm";
1247 const char* form_zero =
"'Fn, #0.0";
1259 form =
"(FPCompare)";
1264void DisassemblingDecoder::VisitFPConditionalCompare(Instruction*
instr) {
1265 const char* mnemonic =
"unimplemented";
1266 const char* form =
"'Fn, 'Fm, 'INzcv, 'Cond";
1275 mnemonic =
"fccmpe";
1278 form =
"(FPConditionalCompare)";
1283void DisassemblingDecoder::VisitFPConditionalSelect(Instruction*
instr) {
1284 const char* mnemonic =
"";
1285 const char* form =
"'Fd, 'Fn, 'Fm, 'Cond";
1298void DisassemblingDecoder::VisitFPDataProcessing1Source(Instruction*
instr) {
1299 const char* mnemonic =
"unimplemented";
1300 const char* form =
"'Fd, 'Fn";
1303#define FORMAT(A, B) \
1308 FORMAT(
FMOV,
"fmov");
1309 FORMAT(
FABS,
"fabs");
1310 FORMAT(
FNEG,
"fneg");
1311 FORMAT(
FSQRT,
"fsqrt");
1312 FORMAT(
FRINTN,
"frintn");
1313 FORMAT(
FRINTP,
"frintp");
1314 FORMAT(
FRINTM,
"frintm");
1315 FORMAT(
FRINTZ,
"frintz");
1316 FORMAT(
FRINTA,
"frinta");
1317 FORMAT(
FRINTX,
"frintx");
1318 FORMAT(
FRINTI,
"frinti");
1345 form =
"(FPDataProcessing1Source)";
1350void DisassemblingDecoder::VisitFPDataProcessing2Source(Instruction*
instr) {
1351 const char* mnemonic =
"";
1352 const char* form =
"'Fd, 'Fn, 'Fm";
1355#define FORMAT(A, B) \
1360 FORMAT(
FMUL,
"fmul");
1361 FORMAT(
FDIV,
"fdiv");
1362 FORMAT(
FADD,
"fadd");
1363 FORMAT(
FSUB,
"fsub");
1364 FORMAT(
FMAX,
"fmax");
1365 FORMAT(
FMIN,
"fmin");
1366 FORMAT(
FMAXNM,
"fmaxnm");
1367 FORMAT(
FMINNM,
"fminnm");
1368 FORMAT(
FNMUL,
"fnmul");
1376void DisassemblingDecoder::VisitFPDataProcessing3Source(Instruction*
instr) {
1377 const char* mnemonic =
"";
1378 const char* form =
"'Fd, 'Fn, 'Fm, 'Fa";
1381#define FORMAT(A, B) \
1386 FORMAT(
FMADD,
"fmadd");
1387 FORMAT(
FMSUB,
"fmsub");
1388 FORMAT(FNMADD,
"fnmadd");
1389 FORMAT(FNMSUB,
"fnmsub");
1397void DisassemblingDecoder::VisitFPImmediate(Instruction*
instr) {
1398 const char* mnemonic =
"";
1399 const char* form =
"(FPImmediate)";
1404 form =
"'Sd, 'IFPSingle";
1408 form =
"'Dd, 'IFPDouble";
1416void DisassemblingDecoder::VisitFPIntegerConvert(Instruction*
instr) {
1417 const char* mnemonic =
"unimplemented";
1418 const char* form =
"(FPIntegerConvert)";
1419 const char* form_rf =
"'Rd, 'Fn";
1420 const char* form_fr =
"'Fd, 'Rn";
1435 form =
"'Vd.D[1], 'Rn";
1439 form =
"'Rd, 'Vn.D[1]";
1445 mnemonic =
"fcvtas";
1452 mnemonic =
"fcvtau";
1459 mnemonic =
"fcvtms";
1466 mnemonic =
"fcvtmu";
1473 mnemonic =
"fcvtns";
1480 mnemonic =
"fcvtnu";
1487 mnemonic =
"fcvtzu";
1494 mnemonic =
"fcvtzs";
1501 mnemonic =
"fcvtpu";
1508 mnemonic =
"fcvtps";
1526 mnemonic =
"fjcvtzs";
1533void DisassemblingDecoder::VisitFPFixedPointConvert(Instruction*
instr) {
1534 const char* mnemonic =
"";
1535 const char* form =
"'Rd, 'Fn, 'IFPFBits";
1536 const char* form_fr =
"'Fd, 'Rn, 'IFPFBits";
1543 mnemonic =
"fcvtzs";
1549 mnemonic =
"fcvtzu";
1570#define PAUTH_SYSTEM_MNEMONICS(V) \
1571 V(PACIB1716, "pacib1716") \
1572 V(AUTIB1716, "autib1716") \
1573 V(PACIBSP, "pacibsp") \
1574 V(AUTIBSP, "autibsp")
1577void DisassemblingDecoder::VisitSystem(Instruction*
instr) {
1581 const char* mnemonic =
"unimplemented";
1582 const char* form =
"(System)";
1585#define PAUTH_CASE(NAME, MN) \
1591 PAUTH_SYSTEM_MNEMONICS(PAUTH_CASE)
1593#undef PAUTH_SYSTEM_MNEMONICS
1599 switch (
instr->ImmSystemRegister()) {
1607 form =
"'Xt, (unknown)";
1614 switch (
instr->ImmSystemRegister()) {
1622 form =
"(unknown), 'Xt";
1631 switch (
instr->ImmHint()) {
1651 mnemonic =
"bti jc";
1681void DisassemblingDecoder::VisitException(Instruction*
instr) {
1682 const char* mnemonic =
"unimplemented";
1683 const char* form =
"'IDebug";
1714 form =
"(Exception)";
1719void DisassemblingDecoder::VisitNEON3Same(Instruction*
instr) {
1720 const char* mnemonic =
"unimplemented";
1721 const char* form =
"'Vd.%s, 'Vn.%s, 'Vm.%s";
1722 NEONFormatDecoder nfd(
instr);
1733 form =
"'Vd.%s, 'Vn.%s";
1755 form =
"(NEON3Same)";
1757 nfd.SetFormatMaps(nfd.LogicalFormatMap());
1759 static const char* mnemonics[] = {
1760 "shadd",
"uhadd",
"shadd",
"uhadd",
1761 "sqadd",
"uqadd",
"sqadd",
"uqadd",
1762 "srhadd",
"urhadd",
"srhadd",
"urhadd",
1763 nullptr,
nullptr,
nullptr,
1765 "shsub",
"uhsub",
"shsub",
"uhsub",
1766 "sqsub",
"uqsub",
"sqsub",
"uqsub",
1767 "cmgt",
"cmhi",
"cmgt",
"cmhi",
1768 "cmge",
"cmhs",
"cmge",
"cmhs",
1769 "sshl",
"ushl",
"sshl",
"ushl",
1770 "sqshl",
"uqshl",
"sqshl",
"uqshl",
1771 "srshl",
"urshl",
"srshl",
"urshl",
1772 "sqrshl",
"uqrshl",
"sqrshl",
"uqrshl",
1773 "smax",
"umax",
"smax",
"umax",
1774 "smin",
"umin",
"smin",
"umin",
1775 "sabd",
"uabd",
"sabd",
"uabd",
1776 "saba",
"uaba",
"saba",
"uaba",
1777 "add",
"sub",
"add",
"sub",
1778 "cmtst",
"cmeq",
"cmtst",
"cmeq",
1779 "mla",
"mls",
"mla",
"mls",
1780 "mul",
"pmul",
"mul",
"pmul",
1781 "smaxp",
"umaxp",
"smaxp",
"umaxp",
1782 "sminp",
"uminp",
"sminp",
"uminp",
1783 "sqdmulh",
"sqrdmulh",
"sqdmulh",
"sqrdmulh",
1784 "addp",
"unallocated",
"addp",
"unallocated",
1785 "fmaxnm",
"fmaxnmp",
"fminnm",
"fminnmp",
1786 "fmla",
"unallocated",
"fmls",
"unallocated",
1787 "fadd",
"faddp",
"fsub",
"fabd",
1788 "fmulx",
"fmul",
"unallocated",
"unallocated",
1789 "fcmeq",
"fcmge",
"unallocated",
"fcmgt",
1790 "unallocated",
"facge",
"unallocated",
"facgt",
1791 "fmax",
"fmaxp",
"fmin",
"fminp",
1792 "frecps",
"fdiv",
"frsqrts",
"unallocated"};
1799 mnemonic = mnemonics[
index];
1805 nfd.SetFormatMaps(nfd.FPFormatMap());
1811void DisassemblingDecoder::VisitNEON3SameHP(Instruction*
instr) {
1812 const char* mnemonic =
"unimplemented";
1813 const char* form =
"'Vd.%s, 'Vn.%s, 'Vm.%s";
1816 static const char* mnemonics[] = {
1817 "fmaxnm",
"fmaxnmp",
"fminnm",
"fminnmp",
"fmla",
"uqadd",
"fmls",
1818 "uqadd",
"fadd",
"faddp",
"fsub",
"fabd",
"fmulx",
"fmul",
1819 "fmul",
"fmul",
"fcmeq",
"fcmge",
"shsub",
"fcmgt",
"sqsub",
1820 "facge",
"sqsub",
"facgt",
"fmax",
"fmaxp",
"fmin",
"fminp",
1821 "frecps",
"fdiv",
"frsqrts",
"fdiv"};
1828 mnemonic = mnemonics[
index];
1833void DisassemblingDecoder::VisitNEON2RegMisc(Instruction*
instr) {
1834 const char* mnemonic =
"unimplemented";
1835 const char* form =
"'Vd.%s, 'Vn.%s";
1836 const char* form_cmp_zero =
"'Vd.%s, 'Vn.%s, #0";
1837 const char* form_fcmp_zero =
"'Vd.%s, 'Vn.%s, #0.0";
1838 NEONFormatDecoder nfd(
instr);
1840 static const NEONFormatMap map_lp_ta = {
1843 static const NEONFormatMap map_cvt_ta = {{22}, {
NF_4S,
NF_2D}};
1845 static const NEONFormatMap map_cvt_tb = {{22, 30},
1862 mnemonic =
"saddlp";
1863 nfd.SetFormatMap(0, &map_lp_ta);
1866 mnemonic =
"uaddlp";
1867 nfd.SetFormatMap(0, &map_lp_ta);
1870 mnemonic =
"suqadd";
1873 mnemonic =
"usqadd";
1885 mnemonic =
"sadalp";
1886 nfd.SetFormatMap(0, &map_lp_ta);
1889 mnemonic =
"uadalp";
1890 nfd.SetFormatMap(0, &map_lp_ta);
1900 form = form_cmp_zero;
1904 form = form_cmp_zero;
1908 form = form_cmp_zero;
1912 form = form_cmp_zero;
1916 form = form_cmp_zero;
1925 switch (
instr->FPType()) {
1933 form =
"(NEON2RegMisc)";
1935 nfd.SetFormatMaps(nfd.LogicalFormatMap());
1942 nfd.SetFormatMaps(nfd.FPHPFormatMap());
1944 nfd.SetFormatMaps(nfd.FPFormatMap());
1954 mnemonic =
instr->Mask(
NEON_Q) ?
"fcvtn2" :
"fcvtn";
1955 nfd.SetFormatMap(0, &map_cvt_tb);
1956 nfd.SetFormatMap(1, &map_cvt_ta);
1959 mnemonic =
instr->Mask(
NEON_Q) ?
"fcvtxn2" :
"fcvtxn";
1960 nfd.SetFormatMap(0, &map_cvt_tb);
1961 nfd.SetFormatMap(1, &map_cvt_ta);
1964 mnemonic =
instr->Mask(
NEON_Q) ?
"fcvtl2" :
"fcvtl";
1965 nfd.SetFormatMap(0, &map_cvt_ta);
1966 nfd.SetFormatMap(1, &map_cvt_tb);
1969 mnemonic =
"frintn";
1972 mnemonic =
"frinta";
1975 mnemonic =
"frintp";
1978 mnemonic =
"frintm";
1981 mnemonic =
"frintx";
1984 mnemonic =
"frintz";
1987 mnemonic =
"frinti";
1990 mnemonic =
"fcvtns";
1993 mnemonic =
"fcvtnu";
1996 mnemonic =
"fcvtps";
1999 mnemonic =
"fcvtpu";
2002 mnemonic =
"fcvtms";
2005 mnemonic =
"fcvtmu";
2008 mnemonic =
"fcvtzs";
2011 mnemonic =
"fcvtzu";
2014 mnemonic =
"fcvtas";
2017 mnemonic =
"fcvtau";
2029 mnemonic =
"ursqrte";
2032 mnemonic =
"urecpe";
2035 mnemonic =
"frsqrte";
2038 mnemonic =
"frecpe";
2042 form = form_fcmp_zero;
2046 form = form_fcmp_zero;
2050 form = form_fcmp_zero;
2054 form = form_fcmp_zero;
2058 form = form_fcmp_zero;
2063 nfd.SetFormatMap(0, nfd.IntegerFormatMap());
2064 nfd.SetFormatMap(1, nfd.LongIntegerFormatMap());
2077 mnemonic =
"sqxtun";
2081 nfd.SetFormatMap(0, nfd.LongIntegerFormatMap());
2082 nfd.SetFormatMap(1, nfd.IntegerFormatMap());
2083 switch (
instr->NEONSize()) {
2085 form =
"'Vd.%s, 'Vn.%s, #8";
2088 form =
"'Vd.%s, 'Vn.%s, #16";
2091 form =
"'Vd.%s, 'Vn.%s, #32";
2098 Format(
instr, nfd.Mnemonic(mnemonic), nfd.Substitute(form));
2101 form =
"(NEON2RegMisc)";
2108void DisassemblingDecoder::VisitNEON3Different(Instruction*
instr) {
2109 const char* mnemonic =
"unimplemented";
2110 const char* form =
"'Vd.%s, 'Vn.%s, 'Vm.%s";
2112 NEONFormatDecoder nfd(
instr);
2113 nfd.SetFormatMap(0, nfd.LongIntegerFormatMap());
2142 mnemonic =
"sqdmlal";
2145 mnemonic =
"sqdmlsl";
2148 mnemonic =
"sqdmull";
2173 nfd.SetFormatMap(1, nfd.LongIntegerFormatMap());
2177 nfd.SetFormatMap(1, nfd.LongIntegerFormatMap());
2181 nfd.SetFormatMap(1, nfd.LongIntegerFormatMap());
2185 nfd.SetFormatMap(1, nfd.LongIntegerFormatMap());
2189 nfd.SetFormatMaps(nfd.LongIntegerFormatMap());
2190 nfd.SetFormatMap(0, nfd.IntegerFormatMap());
2193 mnemonic =
"raddhn";
2194 nfd.SetFormatMaps(nfd.LongIntegerFormatMap());
2195 nfd.SetFormatMap(0, nfd.IntegerFormatMap());
2198 mnemonic =
"rsubhn";
2199 nfd.SetFormatMaps(nfd.LongIntegerFormatMap());
2200 nfd.SetFormatMap(0, nfd.IntegerFormatMap());
2204 nfd.SetFormatMaps(nfd.LongIntegerFormatMap());
2205 nfd.SetFormatMap(0, nfd.IntegerFormatMap());
2208 form =
"(NEON3Different)";
2210 Format(
instr, nfd.Mnemonic(mnemonic), nfd.Substitute(form));
2213void DisassemblingDecoder::VisitNEON3Extension(Instruction*
instr) {
2214 const char* form =
"'Vd.%s, 'Vn.%s, 'Vm.%s";
2215 const char* mnemonic =
"unimplemented";
2219 if (
instr->NEONSize() != 2) {
2220 VisitUnallocated(
instr);
2224 form =
instr->Bit(30) == 1 ?
"'Vd.4s, 'Vn.16b, 'Vm.16b"
2225 :
"'Vd.2s, 'Vn.8b, 'Vm.8b";
2229 form =
"(NEON3Extension)";
2235void DisassemblingDecoder::VisitNEONAcrossLanes(Instruction*
instr) {
2236 const char* mnemonic =
"unimplemented";
2237 const char* form =
"%sd, 'Vn.%s";
2243 nfd.SetFormatMap(0, nfd.FPScalarFormatMap());
2244 nfd.SetFormatMap(1, nfd.FPFormatMap());
2253 mnemonic =
"fmaxnmv";
2256 mnemonic =
"fminnmv";
2259 form =
"(NEONAcrossLanes)";
2280 mnemonic =
"saddlv";
2281 nfd.SetFormatMap(0, nfd.LongScalarFormatMap());
2284 mnemonic =
"uaddlv";
2285 nfd.SetFormatMap(0, nfd.LongScalarFormatMap());
2288 form =
"(NEONAcrossLanes)";
2297void DisassemblingDecoder::VisitNEONByIndexedElement(Instruction*
instr) {
2298 const char* mnemonic =
"unimplemented";
2299 bool l_instr =
false;
2300 bool fp_instr =
false;
2302 const char* form =
"'Vd.%s, 'Vn.%s, 'Ve.%s['IVByElemIndex]";
2334 mnemonic =
"sqdmull";
2338 mnemonic =
"sqdmlal";
2342 mnemonic =
"sqdmlsl";
2355 mnemonic =
"sqdmulh";
2358 mnemonic =
"sqrdmulh";
2382 Format(
instr, nfd.Mnemonic(mnemonic), nfd.Substitute(form));
2383 }
else if (fp_instr) {
2384 nfd.SetFormatMap(0, nfd.FPFormatMap());
2387 nfd.SetFormatMap(0, nfd.IntegerFormatMap());
2392void DisassemblingDecoder::VisitNEONCopy(Instruction*
instr) {
2393 const char* mnemonic =
"unimplemented";
2394 const char* form =
"(NEONCopy)";
2401 nfd.SetFormatMap(0, nfd.TriangularScalarFormatMap());
2402 form =
"'Vd.%s['IVInsIndex1], 'Vn.%s['IVInsIndex2]";
2405 nfd.SetFormatMap(0, nfd.TriangularScalarFormatMap());
2406 if (nfd.GetVectorFormat() ==
kFormatD) {
2407 form =
"'Vd.%s['IVInsIndex1], 'Xn";
2409 form =
"'Vd.%s['IVInsIndex1], 'Wn";
2417 nfd.SetFormatMap(0, nfd.TriangularScalarFormatMap());
2418 if (nfd.GetVectorFormat() ==
kFormatD) {
2419 form =
"'Xd, 'Vn.%s['IVInsIndex1]";
2421 form =
"'Wd, 'Vn.%s['IVInsIndex1]";
2425 nfd.SetFormatMap(0, nfd.TriangularScalarFormatMap());
2426 form =
"'Rdq, 'Vn.%s['IVInsIndex1]";
2429 form =
"'Vd.%s, 'Vn.%s['IVInsIndex1]";
2432 if (nfd.GetVectorFormat() ==
kFormat2D) {
2433 form =
"'Vd.%s, 'Xn";
2435 form =
"'Vd.%s, 'Wn";
2441void DisassemblingDecoder::VisitNEONExtract(Instruction*
instr) {
2442 const char* mnemonic =
"unimplemented";
2443 const char* form =
"(NEONExtract)";
2447 form =
"'Vd.%s, 'Vn.%s, 'Vm.%s, 'IVExtract";
2452void DisassemblingDecoder::VisitNEONLoadStoreMultiStruct(Instruction*
instr) {
2453 const char* mnemonic =
nullptr;
2454 const char* form =
nullptr;
2455 const char* form_1v =
"{'Vt.%s}, ['Xns]";
2456 const char* form_2v =
"{'Vt.%s, 'Vt2.%s}, ['Xns]";
2457 const char* form_3v =
"{'Vt.%s, 'Vt2.%s, 'Vt3.%s}, ['Xns]";
2458 const char* form_4v =
"{'Vt.%s, 'Vt2.%s, 'Vt3.%s, 'Vt4.%s}, ['Xns]";
2523 bool allocated = (mnemonic !=
nullptr);
2532 allocated = (
instr->NEONQ() != 0) || (
instr->NEONLSSize() != 3);
2541 mnemonic =
"unallocated";
2542 form =
"(NEONLoadStoreMultiStruct)";
2548void DisassemblingDecoder::VisitNEONLoadStoreMultiStructPostIndex(
2549 Instruction*
instr) {
2550 const char* mnemonic =
nullptr;
2551 const char* form =
nullptr;
2552 const char* form_1v =
"{'Vt.%s}, ['Xns], 'Xmr1";
2553 const char* form_2v =
"{'Vt.%s, 'Vt2.%s}, ['Xns], 'Xmr2";
2554 const char* form_3v =
"{'Vt.%s, 'Vt2.%s, 'Vt3.%s}, ['Xns], 'Xmr3";
2555 const char* form_4v =
"{'Vt.%s, 'Vt2.%s, 'Vt3.%s, 'Vt4.%s}, ['Xns], 'Xmr4";
2620 bool allocated = (mnemonic !=
nullptr);
2629 allocated = (
instr->NEONQ() != 0) || (
instr->NEONLSSize() != 3);
2638 mnemonic =
"unallocated";
2639 form =
"(NEONLoadStoreMultiStructPostIndex)";
2645void DisassemblingDecoder::VisitNEONLoadStoreSingleStruct(Instruction*
instr) {
2646 const char* mnemonic =
nullptr;
2647 const char* form =
nullptr;
2649 const char* form_1b =
"{'Vt.b}['IVLSLane0], ['Xns]";
2650 const char* form_1h =
"{'Vt.h}['IVLSLane1], ['Xns]";
2651 const char* form_1s =
"{'Vt.s}['IVLSLane2], ['Xns]";
2652 const char* form_1d =
"{'Vt.d}['IVLSLane3], ['Xns]";
2667 "LSB of size distinguishes S and D registers.");
2668 form = ((
instr->NEONLSSize() & 1) == 0) ? form_1s : form_1d;
2681 "LSB of size distinguishes S and D registers.");
2682 form = ((
instr->NEONLSSize() & 1) == 0) ? form_1s : form_1d;
2686 form =
"{'Vt.%s}, ['Xns]";
2690 mnemonic = (
instr->NEONLoad() == 1) ?
"ld2" :
"st2";
2691 form =
"{'Vt.b, 'Vt2.b}['IVLSLane0], ['Xns]";
2695 mnemonic = (
instr->NEONLoad() == 1) ?
"ld2" :
"st2";
2696 form =
"{'Vt.h, 'Vt2.h}['IVLSLane1], ['Xns]";
2701 "LSB of size distinguishes S and D registers.");
2703 "LSB of size distinguishes S and D registers.");
2704 mnemonic = (
instr->NEONLoad() == 1) ?
"ld2" :
"st2";
2705 if ((
instr->NEONLSSize() & 1) == 0) {
2706 form =
"{'Vt.s, 'Vt2.s}['IVLSLane2], ['Xns]";
2708 form =
"{'Vt.d, 'Vt2.d}['IVLSLane3], ['Xns]";
2713 form =
"{'Vt.%s, 'Vt2.%s}, ['Xns]";
2717 mnemonic = (
instr->NEONLoad() == 1) ?
"ld3" :
"st3";
2718 form =
"{'Vt.b, 'Vt2.b, 'Vt3.b}['IVLSLane0], ['Xns]";
2722 mnemonic = (
instr->NEONLoad() == 1) ?
"ld3" :
"st3";
2723 form =
"{'Vt.h, 'Vt2.h, 'Vt3.h}['IVLSLane1], ['Xns]";
2727 mnemonic = (
instr->NEONLoad() == 1) ?
"ld3" :
"st3";
2728 if ((
instr->NEONLSSize() & 1) == 0) {
2729 form =
"{'Vt.s, 'Vt2.s, 'Vt3.s}['IVLSLane2], ['Xns]";
2731 form =
"{'Vt.d, 'Vt2.d, 'Vt3.d}['IVLSLane3], ['Xns]";
2736 form =
"{'Vt.%s, 'Vt2.%s, 'Vt3.%s}, ['Xns]";
2740 mnemonic = (
instr->NEONLoad() == 1) ?
"ld4" :
"st4";
2741 form =
"{'Vt.b, 'Vt2.b, 'Vt3.b, 'Vt4.b}['IVLSLane0], ['Xns]";
2745 mnemonic = (
instr->NEONLoad() == 1) ?
"ld4" :
"st4";
2746 form =
"{'Vt.h, 'Vt2.h, 'Vt3.h, 'Vt4.h}['IVLSLane1], ['Xns]";
2751 "LSB of size distinguishes S and D registers.");
2753 "LSB of size distinguishes S and D registers.");
2754 mnemonic = (
instr->NEONLoad() == 1) ?
"ld4" :
"st4";
2755 if ((
instr->NEONLSSize() & 1) == 0) {
2756 form =
"{'Vt.s, 'Vt2.s, 'Vt3.s, 'Vt4.s}['IVLSLane2], ['Xns]";
2758 form =
"{'Vt.d, 'Vt2.d, 'Vt3.d, 'Vt4.d}['IVLSLane3], ['Xns]";
2763 form =
"{'Vt.%s, 'Vt2.%s, 'Vt3.%s, 'Vt4.%s}, ['Xns]";
2770 bool allocated = (mnemonic !=
nullptr);
2781 allocated = ((
instr->NEONLSSize() & 1) == 0);
2792 allocated = (
instr->NEONLSSize() <= 1) &&
2793 ((
instr->NEONLSSize() == 0) || (
instr->NEONS() == 0));
2800 allocated = (
instr->NEONS() == 0);
2809 mnemonic =
"unallocated";
2810 form =
"(NEONLoadStoreSingleStruct)";
2816void DisassemblingDecoder::VisitNEONLoadStoreSingleStructPostIndex(
2817 Instruction*
instr) {
2818 const char* mnemonic =
nullptr;
2819 const char* form =
nullptr;
2821 const char* form_1b =
"{'Vt.b}['IVLSLane0], ['Xns], 'Xmb1";
2822 const char* form_1h =
"{'Vt.h}['IVLSLane1], ['Xns], 'Xmb2";
2823 const char* form_1s =
"{'Vt.s}['IVLSLane2], ['Xns], 'Xmb4";
2824 const char* form_1d =
"{'Vt.d}['IVLSLane3], ['Xns], 'Xmb8";
2839 "LSB of size distinguishes S and D registers.");
2840 form = ((
instr->NEONLSSize() & 1) == 0) ? form_1s : form_1d;
2853 "LSB of size distinguishes S and D registers.");
2854 form = ((
instr->NEONLSSize() & 1) == 0) ? form_1s : form_1d;
2858 form =
"{'Vt.%s}, ['Xns], 'Xmz1";
2862 mnemonic = (
instr->NEONLoad() == 1) ?
"ld2" :
"st2";
2863 form =
"{'Vt.b, 'Vt2.b}['IVLSLane0], ['Xns], 'Xmb2";
2867 mnemonic = (
instr->NEONLoad() == 1) ?
"ld2" :
"st2";
2868 form =
"{'Vt.h, 'Vt2.h}['IVLSLane1], ['Xns], 'Xmb4";
2872 mnemonic = (
instr->NEONLoad() == 1) ?
"ld2" :
"st2";
2873 if ((
instr->NEONLSSize() & 1) == 0)
2874 form =
"{'Vt.s, 'Vt2.s}['IVLSLane2], ['Xns], 'Xmb8";
2876 form =
"{'Vt.d, 'Vt2.d}['IVLSLane3], ['Xns], 'Xmb16";
2880 form =
"{'Vt.%s, 'Vt2.%s}, ['Xns], 'Xmz2";
2884 mnemonic = (
instr->NEONLoad() == 1) ?
"ld3" :
"st3";
2885 form =
"{'Vt.b, 'Vt2.b, 'Vt3.b}['IVLSLane0], ['Xns], 'Xmb3";
2889 mnemonic = (
instr->NEONLoad() == 1) ?
"ld3" :
"st3";
2890 form =
"{'Vt.h, 'Vt2.h, 'Vt3.h}['IVLSLane1], ['Xns], 'Xmb6";
2894 mnemonic = (
instr->NEONLoad() == 1) ?
"ld3" :
"st3";
2895 if ((
instr->NEONLSSize() & 1) == 0)
2896 form =
"{'Vt.s, 'Vt2.s, 'Vt3.s}['IVLSLane2], ['Xns], 'Xmb12";
2898 form =
"{'Vt.d, 'Vt2.d, 'Vt3.d}['IVLSLane3], ['Xns], 'Xmb24";
2902 form =
"{'Vt.%s, 'Vt2.%s, 'Vt3.%s}, ['Xns], 'Xmz3";
2906 mnemonic = (
instr->NEONLoad() == 1) ?
"ld4" :
"st4";
2907 form =
"{'Vt.b, 'Vt2.b, 'Vt3.b, 'Vt4.b}['IVLSLane0], ['Xns], 'Xmb4";
2911 mnemonic = (
instr->NEONLoad()) == 1 ?
"ld4" :
"st4";
2912 form =
"{'Vt.h, 'Vt2.h, 'Vt3.h, 'Vt4.h}['IVLSLane1], ['Xns], 'Xmb8";
2916 mnemonic = (
instr->NEONLoad() == 1) ?
"ld4" :
"st4";
2917 if ((
instr->NEONLSSize() & 1) == 0)
2918 form =
"{'Vt.s, 'Vt2.s, 'Vt3.s, 'Vt4.s}['IVLSLane2], ['Xns], 'Xmb16";
2920 form =
"{'Vt.d, 'Vt2.d, 'Vt3.d, 'Vt4.d}['IVLSLane3], ['Xns], 'Xmb32";
2924 form =
"{'Vt.%s, 'Vt2.%s, 'Vt3.%s, 'Vt4.%s}, ['Xns], 'Xmz4";
2931 bool allocated = (mnemonic !=
nullptr);
2942 allocated = ((
instr->NEONLSSize() & 1) == 0);
2953 allocated = (
instr->NEONLSSize() <= 1) &&
2954 ((
instr->NEONLSSize() == 0) || (
instr->NEONS() == 0));
2961 allocated = (
instr->NEONS() == 0);
2970 mnemonic =
"unallocated";
2971 form =
"(NEONLoadStoreSingleStructPostIndex)";
2977void DisassemblingDecoder::VisitNEONModifiedImmediate(Instruction*
instr) {
2978 const char* mnemonic =
"unimplemented";
2979 const char* form =
"'Vt.%s, 'IVMIImm8, lsl 'IVMIShiftAmt1";
2981 int cmode =
instr->NEONCmode();
2982 int cmode_3 = (cmode >> 3) & 1;
2983 int cmode_2 = (cmode >> 2) & 1;
2984 int cmode_1 = (cmode >> 1) & 1;
2985 int cmode_0 = cmode & 1;
2986 int q =
instr->NEONQ();
2987 int op =
instr->NEONModImmOp();
2989 static const NEONFormatMap map_b = {{30}, {
NF_8B,
NF_16B}};
2990 static const NEONFormatMap map_h = {{30}, {
NF_4H,
NF_8H}};
2991 static const NEONFormatMap map_s = {{30}, {
NF_2S,
NF_4S}};
2992 NEONFormatDecoder nfd(
instr, &map_b);
2996 mnemonic = (op == 1) ?
"mvni" :
"movi";
2998 mnemonic = (op == 1) ?
"bic" :
"orr";
3000 nfd.SetFormatMap(0, &map_s);
3004 mnemonic = (op == 1) ?
"mvni" :
"movi";
3006 mnemonic = (op == 1) ?
"bic" :
"orr";
3008 nfd.SetFormatMap(0, &map_h);
3011 mnemonic = (op == 1) ?
"mvni" :
"movi";
3012 form =
"'Vt.%s, 'IVMIImm8, msl 'IVMIShiftAmt2";
3013 nfd.SetFormatMap(0, &map_s);
3018 form =
"'Vt.%s, 'IVMIImm8";
3020 form = (q == 0) ?
"'Dd, 'IVMIImm" :
"'Vt.2d, 'IVMIImm";
3025 form =
"'Vt.%s, 'IVMIImmFPSingle";
3026 nfd.SetFormatMap(0, &map_s);
3029 form =
"'Vt.2d, 'IVMIImmFPDouble";
3031 mnemonic =
"unallocated";
3032 form =
"(NEONModifiedImmediate)";
3042void DisassemblingDecoder::VisitNEONSHA3(Instruction*
instr) {
3043 const char* mnemonic =
"unimplemented";
3044 const char* form =
"'Vd.%s, 'Vn.%s, 'Vm.%s, 'Va.%s";
3045 NEONFormatDecoder nfd(
instr);
3055 form =
"(NEONSHA3)";
3060void DisassemblingDecoder::VisitNEONPerm(Instruction*
instr) {
3061 const char* mnemonic =
"unimplemented";
3062 const char* form =
"'Vd.%s, 'Vn.%s, 'Vm.%s";
3063 NEONFormatDecoder nfd(
instr);
3085 form =
"(NEONPerm)";
3090void DisassemblingDecoder::VisitNEONScalar2RegMisc(Instruction*
instr) {
3091 const char* mnemonic =
"unimplemented";
3092 const char* form =
"%sd, %sn";
3093 const char* form_0 =
"%sd, %sn, #0";
3094 const char* form_fp0 =
"%sd, %sn, #0.0";
3135 mnemonic =
"suqadd";
3138 mnemonic =
"usqadd";
3141 form =
"(NEONScalar2RegMisc)";
3146 nfd.SetFormatMaps(nfd.FPScalarFormatMap());
3149 mnemonic =
"frsqrte";
3152 mnemonic =
"frecpe";
3181 mnemonic =
"frecpx";
3184 mnemonic =
"fcvtns";
3187 mnemonic =
"fcvtnu";
3190 mnemonic =
"fcvtps";
3193 mnemonic =
"fcvtpu";
3196 mnemonic =
"fcvtms";
3199 mnemonic =
"fcvtmu";
3202 mnemonic =
"fcvtzs";
3205 mnemonic =
"fcvtzu";
3208 mnemonic =
"fcvtas";
3211 mnemonic =
"fcvtau";
3214 nfd.SetFormatMap(0, nfd.LongScalarFormatMap());
3215 mnemonic =
"fcvtxn";
3218 nfd.SetFormatMap(0, nfd.ScalarFormatMap());
3219 nfd.SetFormatMap(1, nfd.LongScalarFormatMap());
3228 mnemonic =
"sqxtun";
3231 form =
"(NEONScalar2RegMisc)";
3235 Format(
instr, mnemonic, nfd.SubstitutePlaceholders(form));
3238void DisassemblingDecoder::VisitNEONScalar3Diff(Instruction*
instr) {
3239 const char* mnemonic =
"unimplemented";
3240 const char* form =
"%sd, %sn, %sm";
3246 mnemonic =
"sqdmlal";
3249 mnemonic =
"sqdmlsl";
3252 mnemonic =
"sqdmull";
3255 form =
"(NEONScalar3Diff)";
3257 Format(
instr, mnemonic, nfd.SubstitutePlaceholders(form));
3260void DisassemblingDecoder::VisitNEONScalar3Same(Instruction*
instr) {
3261 const char* mnemonic =
"unimplemented";
3262 const char* form =
"%sd, %sn, %sm";
3266 nfd.SetFormatMaps(nfd.FPScalarFormatMap());
3287 mnemonic =
"frecps";
3290 mnemonic =
"frsqrts";
3296 form =
"(NEONScalar3Same)";
3355 mnemonic =
"uqrshl";
3358 mnemonic =
"sqrshl";
3361 mnemonic =
"sqdmulh";
3364 mnemonic =
"sqrdmulh";
3367 form =
"(NEONScalar3Same)";
3370 Format(
instr, mnemonic, nfd.SubstitutePlaceholders(form));
3373void DisassemblingDecoder::VisitNEONScalarByIndexedElement(Instruction*
instr) {
3374 const char* mnemonic =
"unimplemented";
3375 const char* form =
"%sd, %sn, 'Ve.%s['IVByElemIndex]";
3377 bool long_instr =
false;
3381 mnemonic =
"sqdmull";
3385 mnemonic =
"sqdmlal";
3389 mnemonic =
"sqdmlsl";
3393 mnemonic =
"sqdmulh";
3396 mnemonic =
"sqrdmulh";
3399 nfd.SetFormatMap(0, nfd.FPScalarFormatMap());
3414 form =
"(NEONScalarByIndexedElement)";
3419 nfd.SetFormatMap(0, nfd.LongScalarFormatMap());
3423 nfd.Substitute(form, nfd.kPlaceholder, nfd.kPlaceholder, nfd.kFormat));
3426void DisassemblingDecoder::VisitNEONScalarCopy(Instruction*
instr) {
3427 const char* mnemonic =
"unimplemented";
3428 const char* form =
"(NEONScalarCopy)";
3434 form =
"%sd, 'Vn.%s['IVInsIndex1]";
3437 Format(
instr, mnemonic, nfd.Substitute(form, nfd.kPlaceholder, nfd.kFormat));
3440void DisassemblingDecoder::VisitNEONScalarPairwise(Instruction*
instr) {
3441 const char* mnemonic =
"unimplemented";
3442 const char* form =
"%sd, 'Vn.%s";
3457 mnemonic =
"fmaxnmp";
3463 mnemonic =
"fminnmp";
3466 form =
"(NEONScalarPairwise)";
3473void DisassemblingDecoder::VisitNEONScalarShiftImmediate(Instruction*
instr) {
3474 const char* mnemonic =
"unimplemented";
3475 const char* form =
"%sd, %sn, 'Is1";
3476 const char* form_2 =
"%sd, %sn, 'Is2";
3478 static const NEONFormatMap map_shift = {
3480 {
NF_UNDEF,
NF_B,
NF_H,
NF_H,
NF_S,
NF_S,
NF_S,
NF_S,
NF_D,
NF_D,
NF_D,
3482 static const NEONFormatMap map_shift_narrow = {
3483 {21, 20, 19}, {
NF_UNDEF,
NF_H,
NF_S,
NF_S,
NF_D,
NF_D,
NF_D,
NF_D}};
3484 NEONFormatDecoder nfd(
instr, &map_shift);
3486 if (
instr->ImmNEONImmh()) {
3489 mnemonic =
"fcvtzu";
3492 mnemonic =
"fcvtzs";
3536 mnemonic =
"sqshlu";
3548 mnemonic =
"uqshrn";
3549 nfd.SetFormatMap(1, &map_shift_narrow);
3552 mnemonic =
"uqrshrn";
3553 nfd.SetFormatMap(1, &map_shift_narrow);
3556 mnemonic =
"sqshrn";
3557 nfd.SetFormatMap(1, &map_shift_narrow);
3560 mnemonic =
"sqrshrn";
3561 nfd.SetFormatMap(1, &map_shift_narrow);
3564 mnemonic =
"sqshrun";
3565 nfd.SetFormatMap(1, &map_shift_narrow);
3568 mnemonic =
"sqrshrun";
3569 nfd.SetFormatMap(1, &map_shift_narrow);
3572 form =
"(NEONScalarShiftImmediate)";
3575 form =
"(NEONScalarShiftImmediate)";
3577 Format(
instr, mnemonic, nfd.SubstitutePlaceholders(form));
3580void DisassemblingDecoder::VisitNEONShiftImmediate(Instruction*
instr) {
3581 const char* mnemonic =
"unimplemented";
3582 const char* form =
"'Vd.%s, 'Vn.%s, 'Is1";
3583 const char* form_shift_2 =
"'Vd.%s, 'Vn.%s, 'Is2";
3584 const char* form_xtl =
"'Vd.%s, 'Vn.%s";
3587 static const NEONFormatMap map_shift_ta = {
3593 static const NEONFormatMap map_shift_tb = {
3594 {22, 21, 20, 19, 30},
3600 NEONFormatDecoder nfd(
instr, &map_shift_tb);
3602 if (
instr->ImmNEONImmh()) {
3605 mnemonic =
"sqshlu";
3606 form = form_shift_2;
3610 form = form_shift_2;
3614 form = form_shift_2;
3618 form = form_shift_2;
3622 form = form_shift_2;
3631 mnemonic =
"fcvtzu";
3634 mnemonic =
"fcvtzs";
3664 mnemonic =
instr->Mask(
NEON_Q) ?
"shrn2" :
"shrn";
3665 nfd.SetFormatMap(1, &map_shift_ta);
3668 mnemonic =
instr->Mask(
NEON_Q) ?
"rshrn2" :
"rshrn";
3669 nfd.SetFormatMap(1, &map_shift_ta);
3672 mnemonic =
instr->Mask(
NEON_Q) ?
"uqshrn2" :
"uqshrn";
3673 nfd.SetFormatMap(1, &map_shift_ta);
3676 mnemonic =
instr->Mask(
NEON_Q) ?
"uqrshrn2" :
"uqrshrn";
3677 nfd.SetFormatMap(1, &map_shift_ta);
3680 mnemonic =
instr->Mask(
NEON_Q) ?
"sqshrn2" :
"sqshrn";
3681 nfd.SetFormatMap(1, &map_shift_ta);
3684 mnemonic =
instr->Mask(
NEON_Q) ?
"sqrshrn2" :
"sqrshrn";
3685 nfd.SetFormatMap(1, &map_shift_ta);
3688 mnemonic =
instr->Mask(
NEON_Q) ?
"sqshrun2" :
"sqshrun";
3689 nfd.SetFormatMap(1, &map_shift_ta);
3692 mnemonic =
instr->Mask(
NEON_Q) ?
"sqrshrun2" :
"sqrshrun";
3693 nfd.SetFormatMap(1, &map_shift_ta);
3696 nfd.SetFormatMap(0, &map_shift_ta);
3697 if (
instr->ImmNEONImmb() == 0 &&
3700 mnemonic =
instr->Mask(
NEON_Q) ?
"sxtl2" :
"sxtl";
3702 form = form_shift_2;
3703 mnemonic =
instr->Mask(
NEON_Q) ?
"sshll2" :
"sshll";
3707 nfd.SetFormatMap(0, &map_shift_ta);
3708 if (
instr->ImmNEONImmb() == 0 &&
3711 mnemonic =
instr->Mask(
NEON_Q) ?
"uxtl2" :
"uxtl";
3713 form = form_shift_2;
3714 mnemonic =
instr->Mask(
NEON_Q) ?
"ushll2" :
"ushll";
3718 form =
"(NEONShiftImmediate)";
3721 form =
"(NEONShiftImmediate)";
3726void DisassemblingDecoder::VisitNEONTable(Instruction*
instr) {
3727 const char* mnemonic =
"unimplemented";
3728 const char* form =
"(NEONTable)";
3729 const char form_1v[] =
"'Vd.%%s, {'Vn.16b}, 'Vm.%%s";
3730 const char form_2v[] =
"'Vd.%%s, {'Vn.16b, v%d.16b}, 'Vm.%%s";
3731 const char form_3v[] =
"'Vd.%%s, {'Vn.16b, v%d.16b, v%d.16b}, 'Vm.%%s";
3732 const char form_4v[] =
3733 "'Vd.%%s, {'Vn.16b, v%d.16b, v%d.16b, v%d.16b}, 'Vm.%%s";
3734 static const NEONFormatMap map_b = {{30}, {
NF_8B,
NF_16B}};
3735 NEONFormatDecoder nfd(
instr, &map_b);
3774 char re_form[
sizeof(form_4v)];
3775 int reg_num =
instr->Rn();
3783void DisassemblingDecoder::VisitUnimplemented(Instruction*
instr) {
3784 Format(
instr,
"unimplemented",
"(Unimplemented)");
3787void DisassemblingDecoder::VisitUnallocated(Instruction*
instr) {
3799 if (
reg.IsRegister()) {
3800 reg_char =
reg.Is64Bits() ?
'x' :
'w';
3803 switch (
reg.SizeInBits()) {
3822 if (
reg.IsVRegister() || !(
reg.Aliases(sp) ||
reg.Aliases(xzr))) {
3824 if (
reg.IsX() && (
reg.code() == 27)) {
3826 }
else if (
reg.IsX() && (
reg.code() == 29)) {
3828 }
else if (
reg.IsX() && (
reg.code() == 30)) {
3834 }
else if (
reg.Aliases(sp)) {
3844 const char* format) {
3850 if (format !=
nullptr) {
3859 char chr = *
string++;
3860 while (chr !=
'\0') {
3871 const char* format) {
3872 switch (format[0]) {
3911 const char* format) {
3912 char reg_prefix = format[0];
3913 unsigned reg_num = 0;
3914 unsigned field_len = 2;
3916 switch (format[1]) {
3918 reg_num =
instr->Rd();
3919 if (format[2] ==
'q') {
3920 reg_prefix =
instr->NEONQ() ?
'X' :
'W';
3925 reg_num =
instr->Rn();
3928 reg_num =
instr->Rm();
3929 switch (format[2]) {
3938 int imm =
static_cast<int>(strtol(&format[3], &eimm, 10));
3939 field_len += eimm - &format[3];
3940 if (reg_num == 31) {
3941 switch (format[2]) {
3943 imm *= (1 <<
instr->NEONLSSize());
3961 reg_num = (
instr->Rm() & 0xF);
3964 reg_num =
instr->Ra();
3967 reg_num =
instr->Rt();
3968 if (format[0] ==
'V') {
3969 if ((format[2] >=
'2') && (format[2] <=
'4')) {
3971 reg_num = (reg_num + format[2] -
'1') % 32;
3975 if (format[2] ==
'2') {
3977 reg_num =
instr->Rt2();
3983 reg_num =
instr->Rs();
3990 if (format[2] ==
's') {
3996 if (format[2] ==
'+') {
3997 DCHECK((reg_prefix ==
'W') || (reg_prefix ==
'X'));
4005 if (reg_prefix ==
'R') {
4006 reg_prefix =
instr->SixtyFourBits() ?
'X' :
'W';
4007 }
else if (reg_prefix ==
'F') {
4008 reg_prefix = ((
instr->FPType() & 1) == 0) ?
'S' :
'D';
4011 switch (reg_prefix) {
4048 (format[2] ==
's')) {
4058 const char* format) {
4061 switch (format[1]) {
4063 if (format[5] ==
'I' || format[5] ==
'N') {
4064 uint64_t imm =
static_cast<uint64_t
>(
instr->ImmMoveWide())
4065 << (16 *
instr->ShiftMoveWide());
4066 if (format[5] ==
'N') imm = ~imm;
4067 if (!
instr->SixtyFourBits()) imm &= UINT64_C(0xFFFFFFFF);
4072 if (
instr->ShiftMoveWide() > 0) {
4079 switch (format[2]) {
4086 if (
instr->ImmLS() != 0) {
4092 if (
instr->ImmLSPair() != 0) {
4094 int scale = 1 << (format[3] -
'0');
4100 if (
instr->ImmLSUnsigned() != 0) {
4101 int shift =
instr->SizeLS();
4116 int64_t imm =
instr->ImmAddSub() << (12 *
instr->ShiftAddSub());
4121 if (format[3] ==
'F') {
4126 format[3] ==
'S' ?
instr->ImmFP32() :
instr->ImmFP64());
4135 int nzcv = (
instr->Nzcv() << Flags_offset);
4137 ((nzcv &
ZFlag) == 0) ?
'z' :
'Z',
4138 ((nzcv &
CFlag) == 0) ?
'c' :
'C',
4139 ((nzcv &
VFlag) == 0) ?
'v' :
'V');
4155 instr->ImmTestBranchBit40());
4159 switch (format[2]) {
4162 shift -=
instr->ImmNEONImmhImmb();
4167 int shift =
instr->ImmNEONImmhImmb();
4182 switch (format[2]) {
4188 int vm_index = (
instr->NEONH() << 1) |
instr->NEONL();
4189 if (
instr->NEONSize() == 1) {
4190 vm_index = (vm_index << 1) |
instr->NEONM();
4193 return static_cast<int>(strlen(
"IVByElemIndex"));
4196 if (strncmp(format,
"IVInsIndex", strlen(
"IVInsIndex")) == 0) {
4197 unsigned rd_index, rn_index;
4198 unsigned imm5 =
instr->ImmNEON5();
4199 unsigned imm4 =
instr->ImmNEON4();
4202 rd_index = imm5 >> (tz + 1);
4203 rn_index = imm4 >> tz;
4204 if (strncmp(format,
"IVInsIndex1", strlen(
"IVInsIndex1")) == 0) {
4206 return static_cast<int>(strlen(
"IVInsIndex1"));
4207 }
else if (strncmp(format,
"IVInsIndex2",
4208 strlen(
"IVInsIndex2")) == 0) {
4210 return static_cast<int>(strlen(
"IVInsIndex2"));
4222 if (strncmp(format,
"IVMIImmFPSingle", strlen(
"IVMIImmFPSingle")) ==
4225 instr->ImmNEONFP32());
4226 return static_cast<int>(strlen(
"IVMIImmFPSingle"));
4227 }
else if (strncmp(format,
"IVMIImmFPDouble",
4228 strlen(
"IVMIImmFPDouble")) == 0) {
4230 instr->ImmNEONFP64());
4231 return static_cast<int>(strlen(
"IVMIImmFPDouble"));
4232 }
else if (strncmp(format,
"IVMIImm8", strlen(
"IVMIImm8")) == 0) {
4233 uint64_t imm8 =
instr->ImmNEONabcdefgh();
4235 return static_cast<int>(strlen(
"IVMIImm8"));
4236 }
else if (strncmp(format,
"IVMIImm", strlen(
"IVMIImm")) == 0) {
4237 uint64_t imm8 =
instr->ImmNEONabcdefgh();
4239 for (
int i = 0;
i < 8; ++
i) {
4240 if (imm8 & (1ULL <<
i)) {
4241 imm |= (UINT64_C(0xFF) << (8 *
i));
4245 return static_cast<int>(strlen(
"IVMIImm"));
4246 }
else if (strncmp(format,
"IVMIShiftAmt1",
4247 strlen(
"IVMIShiftAmt1")) == 0) {
4248 int cmode =
instr->NEONCmode();
4249 int shift_amount = 8 * ((cmode >> 1) & 3);
4251 return static_cast<int>(strlen(
"IVMIShiftAmt1"));
4252 }
else if (strncmp(format,
"IVMIShiftAmt2",
4253 strlen(
"IVMIShiftAmt2")) == 0) {
4254 int cmode =
instr->NEONCmode();
4255 int shift_amount = 8 << (cmode & 1);
4257 return static_cast<int>(strlen(
"IVMIShiftAmt2"));
4268 printf(
"%s", format);
4275 const char* format) {
4276 DCHECK((format[0] ==
'I') && (format[1] ==
'B'));
4277 unsigned r =
instr->ImmR();
4278 unsigned s =
instr->ImmS();
4280 switch (format[2]) {
4286 if (format[3] ==
'+') {
4296 DCHECK((format[3] ==
'-') && (format[4] ==
'r'));
4309 const char* format) {
4310 DCHECK_EQ(strncmp(format,
"LValue", 6), 0);
4328 const char* format) {
4332 switch (format[1]) {
4338 if (
instr->ImmDPShift() != 0) {
4339 const char* shift_type[] = {
"lsl",
"lsr",
"asr",
"ror"};
4341 instr->ImmDPShift());
4351 const char* format) {
4353 const char* condition_code[] = {
"eq",
"ne",
"hs",
"lo",
"mi",
"pl",
4354 "vs",
"vc",
"hi",
"ls",
"ge",
"lt",
4355 "gt",
"le",
"al",
"nv"};
4357 switch (format[1]) {
4359 cond =
instr->ConditionBranch();
4366 cond =
instr->Condition();
4373 const char* format) {
4375 DCHECK_EQ(strncmp(format,
"AddrPCRel", 9), 0);
4380 DCHECK_EQ(strcmp(format,
"AddrPCRelByte"), 0);
4392 const char* format) {
4393 DCHECK_EQ(strncmp(format,
"TImm", 4), 0);
4396 switch (format[5]) {
4427 const char* format) {
4428 DCHECK_EQ(strncmp(format,
"Ext", 3), 0);
4432 const char* extend_mode[] = {
"uxtb",
"uxth",
"uxtw",
"uxtx",
4433 "sxtb",
"sxth",
"sxtw",
"sxtx"};
4438 (((
instr->ExtendMode() ==
UXTW) && (
instr->SixtyFourBits() == 0)) ||
4440 if (
instr->ImmExtendShift() > 0) {
4445 if (
instr->ImmExtendShift() > 0) {
4453 const char* format) {
4454 DCHECK_EQ(strncmp(format,
"Offsetreg", 9), 0);
4455 const char* extend_mode[] = {
"undefined",
"undefined",
"uxtw",
"lsl",
4456 "undefined",
"undefined",
"sxtw",
"sxtx"};
4459 unsigned shift =
instr->ImmShiftLS();
4461 char reg_type = ((ext ==
UXTW) || (ext ==
SXTW)) ?
'w' :
'x';
4463 unsigned rm =
instr->Rm();
4471 if (!((ext ==
UXTX) && (shift == 0))) {
4481 const char* format) {
4485 int prefetch_mode =
instr->PrefetchMode();
4487 const char*
ls = (prefetch_mode & 0x10) ?
"st" :
"ld";
4488 int level = (prefetch_mode >> 1) + 1;
4489 const char* ks = (prefetch_mode & 1) ?
"strm" :
"keep";
4496 const char* format) {
4500 static const char*
const options[4][4] = {
4501 {
"sy (0b0000)",
"oshld",
"oshst",
"osh"},
4502 {
"sy (0b0100)",
"nshld",
"nshst",
"nsh"},
4503 {
"sy (0b1000)",
"ishld",
"ishst",
"ish"},
4504 {
"sy (0b1100)",
"ld",
"st",
"sy"}};
4505 int domain =
instr->ImmBarrierDomain();
4506 int type =
instr->ImmBarrierType();
4519 va_start(
args, format);
4525 int q =
instr->Bit(30);
4526 const char* mnemonic = q ?
"pmull2" :
"pmull";
4527 const char* form = NULL;
4528 int size =
instr->NEONSize();
4531 form =
"'Vd.8h, 'Vn.8b, 'Vm.8b";
4533 form =
"'Vd.8h, 'Vn.16b, 'Vm.16b";
4535 }
else if (size == 3) {
4537 form =
"'Vd.1q, 'Vn.1d, 'Vm.1d";
4539 form =
"'Vd.1q, 'Vn.2d, 'Vm.2d";
4542 mnemonic =
"undefined";
4548 fprintf(
stream_,
"0x%016" PRIx64
" %08" PRIx32
"\t\t%s\n",
4549 reinterpret_cast<uint64_t
>(
instr),
instr->InstructionBits(),
4568 unsigned ureg =
reg;
4598 : out_buffer_(out_buffer) {}
4600 ~BufferDisassembler() {}
4604 instr->InstructionBits(), GetOutput());
4615 BufferDisassembler
disasm(buffer);
4616 decoder.AppendVisitor(&
disasm);
4628 UnimplementedOpcodeAction) {
4631 decoder.AppendVisitor(&
disasm);
interpreter::OperandScale scale
static V8_EXPORT_PRIVATE void Disassemble(FILE *f, uint8_t *begin, uint8_t *end, UnimplementedOpcodeAction unimplemented_action=kAbortOnUnimplementedOpcode)
V8_EXPORT_PRIVATE int InstructionDecode(v8::base::Vector< char > buffer, uint8_t *instruction)
int ConstantPoolSizeAt(uint8_t *instruction)
const NameConverter & converter_
virtual const char * NameOfAddress(uint8_t *addr) const
virtual const char * NameOfXMMRegister(int reg) const
virtual const char * NameInCode(uint8_t *addr) const
virtual const char * NameOfConstant(uint8_t *addr) const
v8::base::EmbeddedVector< char, 128 > tmp_buffer_
virtual const char * NameOfByteCPURegister(int reg) const
virtual const char * NameOfCPURegister(int reg) const
constexpr T * begin() const
static int ConstantPoolSizeAt(Instruction *instr)
static constexpr CPURegister Create(int code, int size, RegisterType type)
virtual void Decode(Instruction *instr)
int SubstituteBranchTargetField(Instruction *instr, const char *format)
int SubstituteBitfieldImmediateField(Instruction *instr, const char *format)
void Substitute(Instruction *instr, const char *string)
int SubstituteExtendField(Instruction *instr, const char *format)
int SubstituteLSRegOffsetField(Instruction *instr, const char *format)
int SubstitutePrefetchField(Instruction *instr, const char *format)
int SubstituteShiftField(Instruction *instr, const char *format)
void DisassembleNEONPolynomialMul(Instruction *instr)
void AppendToOutput(const char *string,...)
int SubstituteRegisterField(Instruction *instr, const char *format)
virtual void ProcessOutput(Instruction *instr)
int SubstituteImmediateField(Instruction *instr, const char *format)
void Format(Instruction *instr, const char *mnemonic, const char *format)
int SubstituteLiteralField(Instruction *instr, const char *format)
bool IsMovzMovnImm(unsigned reg_size, uint64_t value)
virtual void AppendRegisterNameToOutput(const CPURegister ®)
virtual ~DisassemblingDecoder()
bool RaIsZROrSP(Instruction *instr) const
bool RnIsZROrSP(Instruction *instr) const
int SubstitutePCRelAddressField(Instruction *instr, const char *format)
int SubstituteConditionField(Instruction *instr, const char *format)
int SubstituteField(Instruction *instr, const char *format)
bool RmIsZROrSP(Instruction *instr) const
bool RdIsZROrSP(Instruction *instr) const
int SubstituteBarrierField(Instruction *instr, const char *format)
virtual void ProcessOutput(Instruction *instr)
base::Vector< const DirectHandle< Object > > args
constexpr unsigned CountTrailingZeros(T value)
int SNPrintF(Vector< char > str, const char *format,...)
void * Malloc(size_t size)
constexpr NEONLoadStoreMultiStructPostIndexOp NEON_LD3_post
constexpr NEONScalar3SameOp NEONScalar3SameFPFixed
constexpr NEONScalarPairwiseOp NEON_FMINNMP_scalar
constexpr NEON2RegMiscOp NEON_FNEG
constexpr FPFixedPointConvertOp SCVTF_dw_fixed
constexpr NEONTableOp NEON_TBX_4v
constexpr FPDataProcessing1SourceOp FMOV
constexpr LogicalShiftedOp EOR_w
constexpr NEONLoadStoreSingleStructPostIndexOp NEON_ST4_s_post
constexpr NEONFormatField NEON_Q
constexpr FPDataProcessing1SourceOp FRINTA
constexpr FPConditionalCompareOp FCCMP_d
constexpr LogicalShiftedOp LogicalShiftedMask
constexpr BitfieldOp BFM_x
constexpr NEONShiftImmediateOp NEON_SSRA
constexpr NEONScalar3SameOp NEON_UQADD_scalar
constexpr LogicalShiftedOp ORN_w
constexpr NEONScalar2RegMiscOp NEON_FCVTNS_scalar
constexpr NEONScalar3SameOp NEON_CMGE_scalar
constexpr MiscInstructionsBits74 CLZ
constexpr AddSubShiftedOp AddSubShiftedMask
constexpr FPIntegerConvertOp FCVTNU_xd
constexpr NEONCopyOp NEON_UMOV
constexpr UnconditionalBranchOp BL
constexpr NEONLoadStoreMultiStructOp NEON_LD3
constexpr ConditionalCompareImmediateOp CCMN_w_imm
constexpr NEONLoadStoreSingleStructOp NEON_LD3_h
constexpr NEONAcrossLanesOp NEONAcrossLanesFMask
constexpr FPIntegerConvertOp FCVTZS_wd
constexpr NEONLoadStoreSingleStructPostIndexOp NEON_ST3_b_post
constexpr NEONScalarPairwiseOp NEON_FMAXP_scalar
constexpr ConditionalCompareRegisterOp CCMN_x
constexpr NEONLoadStoreSingleStructOp NEON_ST1_b
constexpr ConditionalCompareImmediateOp CCMP_w_imm
constexpr FPCompareOp FCMP_d_zero
constexpr NEON2RegMiscOp NEON_FCMLT_zero
constexpr FPConditionalSelectOp FPConditionalSelectMask
V8_EXPORT_PRIVATE int CountSetBits(uint64_t value, int width)
constexpr NEON2RegMiscOp NEON2RegMiscOpcode
constexpr FPIntegerConvertOp FCVTAS_ws
constexpr NEONScalar2RegMiscOp NEON_FRECPE_scalar
constexpr NEONScalar2RegMiscOp NEON_FCVTAU_scalar
constexpr NEONLoadStoreSingleStructOp NEON_LD1_s
constexpr NEON2RegMiscOp NEON2RegMiscMask
constexpr BitfieldOp UBFM_w
constexpr ExceptionOp BRK
constexpr NEONLoadStoreMultiStructOp NEON_ST3
constexpr FPIntegerConvertOp FCVTZU_xd
constexpr NEONLoadStoreSingleStructPostIndexOp NEON_LD4_s_post
constexpr NEON2RegMiscOp NEON_UADDLP
constexpr DataProcessing3SourceOp MSUB_x
constexpr NEONScalarByIndexedElementOp NEON_SQDMLSL_byelement_scalar
constexpr NEONScalarPairwiseOp NEON_FADDP_scalar
constexpr NEONLoadStoreSingleStructOp NEON_LD2_h
constexpr LogicalShiftedOp ORN_x
constexpr LoadStorePostIndex LoadStorePostIndexMask
constexpr NEONSHA3Op NEON_EOR3
constexpr NEONScalar2RegMiscOp NEON_FCVTMS_scalar
constexpr FPFixedPointConvertOp SCVTF_sx_fixed
constexpr NEONLoadStoreSingleStructPostIndexOp NEON_LD1_s_post
constexpr DataProcessing3SourceOp SMSUBL_x
constexpr NEON2RegMiscOp NEON_CMGT_zero
constexpr BitfieldOp SBFM_w
constexpr FPIntegerConvertOp UCVTF_sx
constexpr NEONLoadStoreSingleStructPostIndexOp NEON_LD1_h_post
constexpr NEON3DifferentOp NEON_SABAL
constexpr NEONScalar3SameOp NEON_SSHL_scalar
constexpr NEONScalar3SameOp NEON_UQSUB_scalar
constexpr NEONLoadStoreSingleStructOp NEON_LD2_s
constexpr FPFixedPointConvertOp FCVTZS_xs_fixed
constexpr NEONScalar2RegMiscOp NEON_FCVTNU_scalar
constexpr NEONLoadStoreSingleStructOp NEON_ST3_h
std::make_unsigned< T >::type Abs(T a)
constexpr LogicalShiftedOp EOR_x
constexpr NEONLoadStoreMultiStructOp NEON_ST1_4v
constexpr NEONShiftImmediateOp NEON_RSHRN
constexpr NEONLoadStoreSingleStructPostIndexOp NEON_LD3_b_post
constexpr NEON2RegMiscOp NEON_FCVTMU
constexpr NEONShiftImmediateOp NEON_URSHR
constexpr NEONByIndexedElementOp NEONByIndexedElementFPMask
constexpr NEONScalar3SameOp NEON_UQSHL_scalar
constexpr NEON3SameOp NEON3SameLogicalMask
constexpr DataProcessing1SourceOp DataProcessing1SourceMask
constexpr NEONLoadStoreSingleStructPostIndexOp NEON_ST3_s_post
constexpr DataProcessing2SourceOp ASRV
constexpr NEONScalar2RegMiscOp NEON_SUQADD_scalar
constexpr LoadStoreAcquireReleaseOp CASPA_w
constexpr NEONCopyOp NEONCopyUmovMask
constexpr NEONScalar2RegMiscOp NEON_FCVTPU_scalar
constexpr UnconditionalBranchToRegisterOp BLR
constexpr FPDataProcessing1SourceOp FCVT_hs
constexpr NEON2RegMiscOp NEON_ABS
constexpr ExceptionOp DCPS3
constexpr NEONShiftImmediateOp NEON_FCVTZS_imm
constexpr NEON2RegMiscOp NEON_FCVTAS
constexpr AddSubWithCarryOp ADC_w
constexpr FPFixedPointConvertOp FPFixedPointConvertMask
constexpr NEONLoadStoreSingleStructOp NEON_LD4_b
constexpr NEONScalarShiftImmediateOp NEON_SQRSHRN_scalar
constexpr NEONAcrossLanesOp NEONAcrossLanesFixed
constexpr NEONLoadStoreSingleStructOp NEON_LD1_b
constexpr NEONScalarShiftImmediateOp NEON_SQSHLU_scalar
constexpr FPCompareOp FCMP_d
constexpr NEONScalarByIndexedElementOp NEON_FMUL_byelement_scalar
constexpr NEONScalarPairwiseOp NEON_ADDP_scalar
constexpr NEONShiftImmediateOp NEON_UQSHRN
constexpr NEONLoadStoreSingleStructOp NEONLoadStoreSingleStructMask
constexpr AddSubImmediateOp AddSubImmediateMask
constexpr ConditionalCompareRegisterOp CCMP_x
constexpr LogicalImmediateOp ORR_x_imm
constexpr NEONShiftImmediateOp NEON_SSHR
constexpr FPIntegerConvertOp FCVTMU_ws
constexpr NEONLoadStoreSingleStructPostIndexOp NEON_LD4_h_post
constexpr NEONScalar3SameOp NEON_SQADD_scalar
constexpr NEONScalar2RegMiscOp NEON_NEG_scalar_opcode
constexpr NEON3SameOp NEON3SameLogicalFixed
constexpr NEON3SameOp NEON_BSL
constexpr FPIntegerConvertOp FCVTZU_xs
constexpr FPIntegerConvertOp FCVTPU_xs
constexpr FPDataProcessing2SourceOp FPDataProcessing2SourceMask
constexpr FPIntegerConvertOp FCVTMU_xs
constexpr SystemHintOp SystemHintFMask
constexpr NEONLoadStoreMultiStructPostIndexOp NEONLoadStoreMultiStructPostIndexMask
constexpr ExceptionOp SMC
constexpr NEONTableOp NEON_TBL_2v
constexpr NEONScalarShiftImmediateOp NEON_FCVTZS_imm_scalar
constexpr FPCompareOp FCMP_s_zero
constexpr FPIntegerConvertOp FCVTPS_wd
constexpr NEONLoadStoreMultiStructOp NEON_LD2
constexpr NEONLoadStoreSingleStructPostIndexOp NEON_LD3R_post
constexpr NEONAcrossLanesOp NEON_SMINV
constexpr NEONScalarShiftImmediateOp NEON_URSHR_scalar
constexpr LogicalImmediateOp AND_x_imm
constexpr NEONLoadStoreSingleStructPostIndexOp NEONLoadStoreSingleStructPostIndexMask
constexpr AtomicMemoryOp AtomicMemoryMask
constexpr DataProcessing3SourceOp MSUB_w
constexpr NEONScalarShiftImmediateOp NEON_UCVTF_imm_scalar
constexpr NEONLoadStoreSingleStructOp NEON_LD1_h
constexpr NEONLoadStoreMultiStructPostIndexOp NEON_LD4_post
constexpr ConditionalBranchOp ConditionalBranchMask
constexpr NEONShiftImmediateOp NEON_SRSHR
constexpr NEONScalar3SameOp NEON_ADD_scalar
constexpr NEON2RegMiscOp NEON_SADALP
constexpr NEONLoadStoreSingleStructPostIndexOp NEON_LD3_h_post
constexpr ConditionalSelectOp CSINC_w
constexpr NEON3SameOp NEON_ORN
constexpr FPFixedPointConvertOp UCVTF_dx_fixed
constexpr BitfieldOp SBFM_x
constexpr FPFixedPointConvertOp UCVTF_dw_fixed
constexpr NEONScalarShiftImmediateOp NEON_URSRA_scalar
constexpr ConditionalSelectOp CSEL_x
constexpr TestBranchOp TBZ
constexpr NEON2RegMiscOp NEON_CMLT_zero
constexpr LoadStoreAcquireReleaseOp CASPAL_x
constexpr FPIntegerConvertOp FCVTMS_xd
constexpr NEONScalar2RegMiscOp NEON_ABS_scalar
constexpr NEONLoadStoreMultiStructOp NEON_ST1_3v
constexpr NEONCopyOp NEONCopyInsGeneralMask
constexpr NEONLoadStoreMultiStructOp NEON_LD1_3v
constexpr FPDataProcessing1SourceOp FRINTP
constexpr FPDataProcessing2SourceOp FSUB
constexpr NEON2RegMiscOp NEON_FCVTZS
constexpr ExceptionOp HVC
constexpr AddSubExtendedOp AddSubExtendedMask
constexpr NEONScalar2RegMiscOp NEON_USQADD_scalar
constexpr NEON2RegMiscOp NEON_RBIT_NOT
constexpr FPIntegerConvertOp FCVTNS_xs
constexpr NEONAcrossLanesOp NEON_UMINV
constexpr FPDataProcessing1SourceOp FCVT_dh
constexpr NEONLoadStoreSingleStructPostIndexOp NEON_ST1_s_post
constexpr NEONTableOp NEON_TBL_1v
constexpr NEON2RegMiscOp NEON_FCVTN
constexpr NEONScalar3SameOp NEON_SQRDMULH_scalar
constexpr NEONLoadStoreSingleStructOp NEON_LD1R
constexpr NEONScalar2RegMiscOp NEON_FRECPX_scalar
constexpr NEON3SameOp NEON3SameLogicalFMask
constexpr NEON3DifferentOp NEON_SSUBW
constexpr LoadStorePairOffsetOp LoadStorePairOffsetMask
constexpr NEONByIndexedElementOp NEON_SQDMLSL_byelement
constexpr LogicalShiftedOp ANDS_x
constexpr ConditionalCompareImmediateOp CCMN_x_imm
constexpr FPDataProcessing1SourceOp FABS
constexpr NEONScalar3SameOp NEON_FRECPS_scalar
constexpr NEONLoadStoreSingleStructOp NEON_LD4_h
constexpr LogicalShiftedOp BICS_w
constexpr FPIntegerConvertOp FCVTMU_wd
constexpr FPFixedPointConvertOp FCVTZU_xd_fixed
constexpr NEONLoadStoreSingleStructPostIndexOp NEON_LD2_s_post
constexpr int kWRegSizeInBits
constexpr NEONLoadStoreMultiStructPostIndexOp NEON_ST2_post
constexpr DataProcessing3SourceOp DataProcessing3SourceMask
constexpr NEONPermOp NEON_ZIP1
constexpr int kZeroRegCode
constexpr NEON3DifferentOp NEON_SSUBL
constexpr int kNumberOfRegisters
constexpr NEON3DifferentOp NEON_SADDW
constexpr FPIntegerConvertOp FCVTPS_ws
constexpr NEONScalar3SameOp NEON_FACGT_scalar
constexpr FPDataProcessing2SourceOp FNMUL
constexpr NEON2RegMiscOp NEON_FCVTZU
constexpr NEONLoadStoreSingleStructOp NEON_ST2_h
constexpr NEON2RegMiscOp NEON_FCVTMS
constexpr NEON2RegMiscOp NEON_FRINTM
constexpr NEONAcrossLanesOp NEONAcrossLanesMask
constexpr NEONTableOp NEONTableMask
constexpr NEONShiftImmediateOp NEON_URSRA
constexpr NEONLoadStoreSingleStructOp NEON_LD4_d
constexpr NEONShiftImmediateOp NEON_SQSHRUN
constexpr NEONLoadStoreMultiStructOp NEON_ST2
constexpr NEONAcrossLanesOp NEON_UMAXV
constexpr NEONScalar2RegMiscOp NEON_CMEQ_zero_scalar
constexpr NEONScalar2RegMiscOp NEON_UQXTN_scalar
constexpr MemBarrierOp MemBarrierFixed
constexpr NEONLoadStoreSingleStructPostIndexOp NEON_ST2_b_post
constexpr LogicalImmediateOp EOR_w_imm
constexpr AddSubWithCarryOp AddSubWithCarryMask
constexpr DataProcessing1SourceOp REV32_x
constexpr NEON2RegMiscOp NEON_XTN
constexpr FPConditionalSelectOp FCSEL_d
constexpr NEONByIndexedElementOp NEON_SQDMULH_byelement
constexpr LogicalImmediateOp ORR_w_imm
constexpr LogicalShiftedOp ORR_w
constexpr NEONScalar2RegMiscOp NEON_FCVTZS_scalar
constexpr NEON2RegMiscOp NEON_FCMGE_zero
constexpr AddSubWithCarryOp SBC_x
constexpr BitfieldOp BFM_w
constexpr NEONScalar2RegMiscOp NEON_FRSQRTE_scalar
constexpr NEONScalarShiftImmediateOp NEON_SRSRA_scalar
constexpr NEONLoadStoreSingleStructPostIndexOp NEON_LD4_b_post
constexpr NEONScalarShiftImmediateOp NEON_SHL_scalar
constexpr NEON2RegMiscOp NEON2RegMiscHPFixed
constexpr FPIntegerConvertOp FCVTPU_wd
constexpr FPFixedPointConvertOp SCVTF_dx_fixed
constexpr NEON2RegMiscOp NEON_URECPE
constexpr LoadStoreAcquireReleaseOp CASP_x
constexpr NEON3DifferentOp NEON_ADDHN
constexpr FPIntegerConvertOp FCVTAU_ws
constexpr FPIntegerConvertOp FCVTMS_ws
constexpr FPDataProcessing3SourceOp FPDataProcessing3SourceMask
constexpr ConditionalCompareRegisterOp CCMN_w
constexpr SystemHintOp HINT
constexpr NEON2RegMiscOp NEON_URSQRTE
constexpr NEON2RegMiscOp NEON_FCVTAU
constexpr FPConditionalCompareOp FCCMP_s
constexpr NEONScalar2RegMiscOp NEON_SQNEG_scalar
constexpr ExtractOp ExtractMask
constexpr FPIntegerConvertOp UCVTF_dx
constexpr DataProcessing2SourceOp DataProcessing2SourceMask
constexpr NEONLoadStoreMultiStructOp NEON_LD1_2v
constexpr DataProcessing2SourceOp RORV
constexpr NEONScalarShiftImmediateOp NEON_SQSHRN_scalar
constexpr FPConditionalCompareOp FPConditionalCompareMask
constexpr NEON3DifferentOp NEON_UABAL
constexpr FPIntegerConvertOp FCVTAS_xd
constexpr NEONScalar2RegMiscOp NEON_UCVTF_scalar
constexpr NEON2RegMiscOp NEON_FCVTL
constexpr FPImmediateOp FPImmediateMask
constexpr NEON2RegMiscOp NEON_FRINTI
constexpr NEON2RegMiscOp NEON_SQNEG
constexpr NEONByIndexedElementOp NEON_SQDMLAL_byelement
constexpr BitfieldOp UBFM_x
constexpr NEONTableOp NEON_TBX_1v
constexpr NEONLoadStoreSingleStructPostIndexOp NEON_ST4_b_post
constexpr FPDataProcessing1SourceOp FCVT_sh
constexpr NEONScalar3SameOp NEON_FRSQRTS_scalar
constexpr NEONLoadStoreSingleStructOp NEON_LD3_s
constexpr NEON2RegMiscOp NEON_UCVTF
constexpr SystemSysRegOp MRS
constexpr DataProcessing2SourceOp LSLV
constexpr FPIntegerConvertOp FCVTMS_xs
constexpr uint8_t kLoadLiteralScale
constexpr NEON2RegMiscOp NEON_REV16
constexpr NEONScalar3SameOp NEON_URSHL_scalar
constexpr NEON3DifferentOp NEON_SQDMULL
constexpr NEON2RegMiscOp NEON_NEG
constexpr NEONLoadStoreSingleStructOp NEON_ST4_h
constexpr NEON3SameOp NEON_BIF
constexpr LoadStoreUnsignedOffset PRFM_unsigned
constexpr FPDataProcessing2SourceOp FMAX
constexpr FPFixedPointConvertOp FCVTZS_wd_fixed
constexpr NEON2RegMiscOp NEON_REV64
constexpr NEONCopyOp NEON_DUP_GENERAL
constexpr ExceptionOp ExceptionMask
constexpr FPIntegerConvertOp FCVTMS_wd
constexpr FPDataProcessing2SourceOp FMAXNM
constexpr NEONLoadStoreSingleStructPostIndexOp NEON_LD2_b_post
constexpr NEONShiftImmediateOp NEON_UQSHL_imm
constexpr FPIntegerConvertOp FPIntegerConvertMask
constexpr NEONScalar3SameOp NEON_SQSUB_scalar
constexpr NEON3DifferentOp NEON_UADDL
constexpr NEONLoadStoreMultiStructPostIndexOp NEON_ST1_3v_post
constexpr SystemSysRegOp MSR
constexpr NEONScalar3SameOp NEON_SQRSHL_scalar
constexpr NEONLoadStoreSingleStructOp NEON_ST1_h
constexpr NEONTableOp NEON_TBX_3v
constexpr NEONByIndexedElementOp NEON_UMULL_byelement
constexpr FPDataProcessing1SourceOp FCVT_hd
constexpr NEONScalarShiftImmediateOp NEON_SQSHRUN_scalar
constexpr FPDataProcessing2SourceOp FMINNM
constexpr NEONShiftImmediateOp NEON_SLI
constexpr NEONScalarByIndexedElementOp NEON_SQRDMULH_byelement_scalar
constexpr DataProcessing3SourceOp SMADDL_x
constexpr NEONLoadStoreSingleStructOp NEON_LD4_s
constexpr NEON2RegMiscOp NEON_FRINTA
constexpr NEONSHA3Op NEONSHA3Mask
constexpr NEONLoadStoreMultiStructPostIndexOp NEON_LD1_1v_post
constexpr NEONScalarShiftImmediateOp NEON_SSRA_scalar
constexpr NEONScalar2RegMiscOp NEONScalar2RegMiscMask
constexpr DataProcessing2SourceOp LSRV
int HighestSetBitPosition(uint64_t value)
constexpr CompareBranchOp CBZ_w
constexpr NEONAcrossLanesOp NEON_FMAXV
constexpr FPDataProcessing1SourceOp FRINTM
constexpr MoveWideImmediateOp MOVZ_x
constexpr NEONScalar2RegMiscOp NEON_SQXTN_scalar
constexpr NEON2RegMiscOp NEON_SADDLP
constexpr FPIntegerConvertOp SCVTF_dw
constexpr FPIntegerConvertOp FCVTZS_xs
constexpr NEON3DifferentOp NEON_SADDL
constexpr SystemSysRegOp SystemSysRegFixed
constexpr NEONLoadStoreMultiStructPostIndexOp NEON_ST1_1v_post
constexpr FPIntegerConvertOp FCVTPS_xs
constexpr NEONScalar3DiffOp NEON_SQDMLAL_scalar
constexpr NEONPermOp NEON_TRN1
constexpr NEONByIndexedElementOp NEON_MUL_byelement
constexpr NEONShiftImmediateOp NEON_SQSHLU
constexpr NEONAcrossLanesOp NEON_FMINNMV
constexpr NEONScalar3SameOp NEON_CMTST_scalar
constexpr NEONScalar3SameOp NEON_FACGE_scalar
constexpr NEONShiftImmediateOp NEON_USHLL
constexpr NEONScalar3SameOp NEON_SQSHL_scalar
constexpr NEON2RegMiscOp NEON_XTN_opcode
constexpr NEON2RegMiscOp NEON_REV32
constexpr NEONLoadStoreSingleStructPostIndexOp NEON_LD1R_post
constexpr LogicalShiftedOp EON_w
constexpr DataProcessing3SourceOp MADD_w
constexpr FPFixedPointConvertOp FCVTZU_ws_fixed
constexpr FPIntegerConvertOp FCVTNU_wd
constexpr NEONScalarShiftImmediateOp NEON_USHR_scalar
constexpr NEON2RegMiscOp NEON_FCMEQ_zero
constexpr DataProcessing3SourceOp UMADDL_x
Disallow flags or implications overriding each other abort_on_contradictory_flags true
constexpr NEONScalarShiftImmediateOp NEON_FCVTZU_imm_scalar
constexpr FPDataProcessing2SourceOp FDIV
constexpr NEONShiftImmediateOp NEON_SQRSHRUN
constexpr NEONLoadStoreMultiStructOp NEON_LD4
constexpr DataProcessing1SourceOp RBIT
constexpr FPIntegerConvertOp FCVTPU_ws
constexpr LogicalShiftedOp BIC_x
constexpr NEONScalar3SameOp NEONScalar3SameFPFMask
constexpr FPIntegerConvertOp FCVTMU_xd
constexpr NEONCopyOp NEON_INS_GENERAL
constexpr NEONScalar2RegMiscOp NEON_SQXTUN_scalar
constexpr NEON2RegMiscOp NEON_CNT
constexpr NEONPermOp NEON_ZIP2
constexpr NEONScalar3SameOp NEON_CMHI_scalar
constexpr FPConditionalCompareOp FCCMPE_d
constexpr DataProcessing1SourceOp CLS
constexpr NEONExtractOp NEON_EXT
constexpr NEONPermOp NEON_TRN2
constexpr UnconditionalBranchToRegisterOp BR
constexpr LoadLiteralOp LDR_d_lit
constexpr NEONScalar3SameOp NEON_UQRSHL_scalar
constexpr NEON2RegMiscOp NEON_FRSQRTE
constexpr FPIntegerConvertOp FCVTAS_wd
constexpr FPIntegerConvertOp FCVTNU_ws
constexpr CompareBranchOp CompareBranchMask
constexpr NEONShiftImmediateOp NEON_USRA
constexpr NEONScalar3SameOp NEON_FCMEQ_scalar
constexpr NEON3DifferentOp NEON_UMLSL
constexpr NEONScalar3DiffOp NEON_SQDMLSL_scalar
constexpr NEONAcrossLanesOp NEONAcrossLanesFPFixed
Condition NegateCondition(Condition cond)
constexpr NEON2RegMiscOp NEON_FCVTXN
constexpr FPIntegerConvertOp SCVTF_sx
constexpr ConditionalSelectOp CSINV_x
constexpr NEONPermOp NEONPermMask
constexpr NEONScalarShiftImmediateOp NEON_SSHR_scalar
constexpr NEONCopyOp NEON_SMOV
constexpr SystemHintOp SystemHintFixed
constexpr FPIntegerConvertOp FCVTAS_xs
constexpr NEON2RegMiscOp NEON_SUQADD
constexpr NEONScalarShiftImmediateOp NEON_SQSHL_imm_scalar
constexpr NEONScalarShiftImmediateOp NEON_SLI_scalar
constexpr NEONScalar3DiffOp NEON_SQDMULL_scalar
constexpr NEONCopyOp NEONCopyInsElementMask
constexpr NEONScalarByIndexedElementOp NEON_FMULX_byelement_scalar
constexpr ConditionalCompareRegisterOp ConditionalCompareRegisterMask
constexpr int kBRegSizeInBits
constexpr NEONScalarByIndexedElementOp NEON_SQDMLAL_byelement_scalar
constexpr FPIntegerConvertOp FJCVTZS
constexpr NEONShiftImmediateOp NEON_UCVTF_imm
constexpr NEONScalar3SameOp NEON_FCMGT_scalar
constexpr NEON2RegMiscOp NEON_FRINTZ
constexpr ConditionalSelectOp CSINC_x
constexpr NEONLoadStoreSingleStructPostIndexOp NEON_ST3_h_post
constexpr FPDataProcessing1SourceOp FRINTZ
constexpr NEONByIndexedElementOp NEON_FMULX_byelement
constexpr NEONExtractOp NEONExtractMask
constexpr NEONScalarPairwiseOp NEON_FMAXNMP_scalar
constexpr CompareBranchOp CBZ_x
constexpr NEON3SameOp NEON_ORR
constexpr NEONScalar3SameOp NEON_FCMGE_scalar
constexpr MoveWideImmediateOp MoveWideImmediateMask
constexpr LogicalImmediateOp ANDS_w_imm
constexpr SystemPAuthOp SystemPAuthFixed
constexpr BitfieldOp BitfieldMask
constexpr NEONLoadStoreSingleStructOp NEON_ST4_b
constexpr FPDataProcessing1SourceOp FRINTI
constexpr DataProcessing1SourceOp REV16
constexpr NEONCopyOp NEON_INS_ELEMENT
constexpr NEONScalarShiftImmediateOp NEON_SCVTF_imm_scalar
constexpr NEONScalar2RegMiscOp NEON_SQABS_scalar
constexpr SystemPAuthOp SystemPAuthMask
constexpr FPIntegerConvertOp FCVTAU_xd
constexpr NEONAcrossLanesOp NEON_SADDLV
constexpr NEON2RegMiscOp NEON_CMLE_zero
constexpr DataProcessing1SourceOp REV
constexpr FPIntegerConvertOp UCVTF_sw
constexpr LoadStoreRegisterOffset LoadStoreRegisterOffsetMask
constexpr FPDataProcessing1SourceOp FRINTX
constexpr NEONLoadStoreSingleStructOp NEON_LD2_d
constexpr NEONScalar2RegMiscOp NEON_FCMGT_zero_scalar
constexpr FPDataProcessing1SourceOp FRINTN
constexpr NEONScalar2RegMiscOp NEON_FCMLT_zero_scalar
constexpr NEON2RegMiscOp NEON_UQXTN_opcode
constexpr LogicalShiftedOp ANDS_w
constexpr NEONShiftImmediateOp NEON_SQRSHRN
constexpr NEONScalarShiftImmediateOp NEONScalarShiftImmediateMask
constexpr NEON3SameOp NEON3SameFPFMask
constexpr NEONLoadStoreSingleStructOp NEON_ST1_d
constexpr LogicalImmediateOp LogicalImmediateMask
constexpr NEON2RegMiscOp NEON_CMEQ_zero
constexpr NEONLoadStoreMultiStructPostIndexOp NEON_ST1_2v_post
constexpr FPIntegerConvertOp FCVTNS_wd
constexpr FPFixedPointConvertOp FCVTZS_ws_fixed
constexpr MoveWideImmediateOp MOVK_w
constexpr NEON2RegMiscOp NEON_CLS
constexpr NEONAcrossLanesOp NEON_UADDLV
constexpr NEONLoadStoreSingleStructPostIndexOp NEON_ST1_h_post
constexpr LoadLiteralOp LoadLiteralMask
constexpr NEONScalar2RegMiscOp NEON_FCMLE_zero_scalar
constexpr FPDataProcessing2SourceOp FADD
constexpr NEONLoadStoreSingleStructOp NEON_LD3R
constexpr NEONLoadStoreMultiStructPostIndexOp NEON_LD2_post
constexpr MemBarrierOp MemBarrierFMask
constexpr LoadStoreAcquireReleaseOp CASP_w
constexpr FPIntegerConvertOp FCVTPS_xd
constexpr NEONAcrossLanesOp NEONAcrossLanesFPFMask
constexpr MemBarrierOp DSB
constexpr FPIntegerConvertOp FMOV_d1_x
constexpr NEONScalar2RegMiscOp NEON_CMGT_zero_scalar
constexpr FPIntegerConvertOp FCVTNS_xd
constexpr NEON3SameOp NEON_AND
constexpr NEONSHA3Op NEON_BCAX
constexpr NEONScalar2RegMiscOp NEON_CMGE_zero_scalar
constexpr LoadStoreAcquireReleaseOp CASPL_x
constexpr NEONByIndexedElementOp NEON_SMLAL_byelement
constexpr NEONAcrossLanesOp NEON_SMAXV
constexpr ExtractOp EXTR_x
constexpr NEON3ExtensionOp NEON_SDOT
constexpr NEONScalar2RegMiscOp NEON_CMLE_zero_scalar
constexpr NEON3DifferentOp NEON_UABDL
constexpr LoadLiteralOp LDR_w_lit
constexpr PCRelAddressingOp PCRelAddressingMask
constexpr DataProcessing3SourceOp MADD_x
constexpr FPIntegerConvertOp FMOV_x_d1
constexpr SystemSysRegOp SystemSysRegMask
constexpr NEONScalarShiftImmediateOp NEON_SQRSHRUN_scalar
constexpr NEONLoadStoreMultiStructPostIndexOp NEON_ST1_4v_post
constexpr NEONPermOp NEON_UZP1
constexpr NEONLoadStoreSingleStructOp NEON_LD1_d
constexpr NEONShiftImmediateOp NEON_SRSRA
constexpr ConditionalCompareRegisterOp CCMP_w
constexpr FPConditionalCompareOp FCCMPE_s
constexpr LoadStoreAcquireReleaseOp CASPA_x
constexpr NEONAcrossLanesOp NEON_ADDV
constexpr FPIntegerConvertOp FCVTAU_wd
constexpr NEONByIndexedElementOp NEON_FMLA_byelement
constexpr UnconditionalBranchOp UnconditionalBranchMask
constexpr FPConditionalSelectOp FCSEL_s
constexpr int kLinkRegCode
constexpr NEONByIndexedElementOp NEON_SMLSL_byelement
constexpr NEONScalar3SameOp NEON_USHL_scalar
constexpr NEONShiftImmediateOp NEON_SSHLL
constexpr NEONScalarPairwiseOp NEON_FMINP_scalar
constexpr ConditionalBranchOp B_cond
constexpr NEONShiftImmediateOp NEON_SQSHRN
constexpr DataProcessing3SourceOp SMULH_x
constexpr NEONScalarShiftImmediateOp NEON_USRA_scalar
constexpr FPIntegerConvertOp FMOV_dx
constexpr ExtractOp EXTR_w
constexpr NEONScalarShiftImmediateOp NEON_UQSHRN_scalar
constexpr DataProcessing3SourceOp UMULH_x
constexpr LogicalImmediateOp AND_w_imm
constexpr NEONScalar2RegMiscOp NEON_CMLT_zero_scalar
constexpr NEONLoadStoreSingleStructOp NEON_ST2_s
constexpr NEONScalar2RegMiscOp NEON_FCMGE_zero_scalar
constexpr NEONShiftImmediateOp NEON_SRI
constexpr NEONLoadStoreSingleStructOp NEON_ST4_d
constexpr NEONByIndexedElementOp NEON_FMLS_byelement
constexpr NEON3DifferentOp NEON_UMULL
constexpr MemBarrierOp DMB
constexpr NEON3DifferentOp NEON_SQDMLAL
constexpr NEONLoadStoreSingleStructOp NEON_ST1_s
constexpr NEON2RegMiscOp NEON_SQABS
constexpr NEON3DifferentOp NEON_USUBW
constexpr NEONLoadStoreSingleStructPostIndexOp NEON_LD3_s_post
constexpr NEON2RegMiscOp NEON_UADALP
constexpr NEON3DifferentOp NEON_UADDW
constexpr ConditionalSelectOp CSEL_w
constexpr NEONScalarShiftImmediateOp NEON_SRI_scalar
constexpr NEONShiftImmediateOp NEON_SHRN
constexpr UnconditionalBranchToRegisterOp UnconditionalBranchToRegisterMask
constexpr NEONScalar2RegMiscOp NEON_FCVTXN_scalar
constexpr NEON3SameOp NEON_BIC
constexpr TestBranchOp TBNZ
constexpr NEONScalar3SameOp NEON_SQDMULH_scalar
constexpr ConditionalCompareImmediateOp CCMP_x_imm
constexpr ConditionalSelectOp ConditionalSelectMask
constexpr FPDataProcessing1SourceOp FNEG
constexpr FPCompareOp FCMP_s
constexpr NEONByIndexedElementOp NEONByIndexedElementMask
constexpr NEON3DifferentOp NEON_RSUBHN
constexpr NEONAcrossLanesOp NEON_FMAXNMV
constexpr SystemPAuthOp SystemPAuthFMask
constexpr LoadStoreAcquireReleaseOp CASPL_w
constexpr NEONLoadStoreMultiStructOp NEON_LD1_4v
constexpr NEONScalarByIndexedElementOp NEONScalarByIndexedElementFPMask
constexpr TestBranchOp TestBranchMask
constexpr NEONLoadStoreMultiStructPostIndexOp NEON_ST3_post
constexpr FPIntegerConvertOp FCVTZS_xd
constexpr NEONLoadStoreSingleStructPostIndexOp NEON_ST1_b_post
constexpr FPDataProcessing2SourceOp FMIN
constexpr NEON2RegMiscOp NEON_FABS
constexpr NEON2RegMiscOp NEON_FCVTPS
constexpr LoadStoreUnscaledOffsetOp LoadStoreUnscaledOffsetMask
constexpr AddSubWithCarryOp ADCS_w
constexpr NEON3SameOp NEON3SameFPFixed
constexpr NEONLoadStoreMultiStructPostIndexOp NEON_ST4_post
constexpr ExceptionOp HLT
constexpr NEONScalarShiftImmediateOp NEON_UQSHL_imm_scalar
constexpr MoveWideImmediateOp MOVN_x
constexpr NEON3DifferentOp NEON_UMLAL
constexpr CompareBranchOp CBNZ_w
constexpr NEON2RegMiscOp NEON_SQXTUN
constexpr MemBarrierOp MemBarrierMask
constexpr NEONLoadStoreSingleStructOp NEON_ST3_s
constexpr NEONByIndexedElementOp NEON_SQRDMULH_byelement
constexpr int kXRegSizeInBits
constexpr NEONScalar2RegMiscOp NEON_FCVTAS_scalar
constexpr NEON2RegMiscOp NEON_FCMGT_zero
constexpr NEONShiftImmediateOp NEON_SQSHL_imm
constexpr DataProcessing2SourceOp SDIV
constexpr NEONScalar3SameOp NEON_SRSHL_scalar
constexpr NEONByIndexedElementOp NEON_UMLAL_byelement
constexpr int kNumberOfVRegisters
constexpr NEONTableOp NEON_TBL_3v
constexpr FPDataProcessing1SourceOp FCVT_sd
constexpr NEON3SameOp NEON_BIT
constexpr LogicalShiftedOp BICS_x
constexpr NEONScalarCopyOp NEON_DUP_ELEMENT_scalar
constexpr NEON2RegMiscOp NEON_SHLL
constexpr FPIntegerConvertOp FCVTZS_ws
constexpr NEON3DifferentOp NEON_SABDL
constexpr NEONScalar2RegMiscOp NEON_FCVTMU_scalar
constexpr NEON2RegMiscOp NEON2RegMiscFPMask
constexpr NEONLoadStoreMultiStructOp NEON_ST4
constexpr NEON2RegMiscOp NEON_FCMLE_zero
constexpr NEON3DifferentOp NEON_PMULL
constexpr uint8_t kInstrSize
constexpr int kSPRegInternalCode
constexpr int kSRegSizeInBits
constexpr NEONLoadStoreSingleStructPostIndexOp NEON_LD4R_post
constexpr NEON2RegMiscOp NEON_CMGE_zero
constexpr SystemSysRegOp SystemSysRegFMask
constexpr NEONAcrossLanesOp NEON_FMINV
constexpr NEONLoadStoreSingleStructOp NEON_ST2_d
constexpr FPIntegerConvertOp SCVTF_dx
constexpr FPFixedPointConvertOp SCVTF_sw_fixed
constexpr LoadLiteralOp LDR_s_lit
constexpr NEON3DifferentOp NEON_SUBHN
constexpr NEONShiftImmediateOp NEON_UQRSHRN
constexpr MoveWideImmediateOp MOVK_x
constexpr NEONScalar3SameOp NEONScalar3SameMask
constexpr NEONLoadStoreSingleStructPostIndexOp NEON_LD1_b_post
constexpr LoadStorePreIndex LoadStorePreIndexMask
constexpr NEONShiftImmediateOp NEON_FCVTZU_imm
constexpr NEONByIndexedElementOp NEON_FMUL_byelement
constexpr FPDataProcessing1SourceOp FPDataProcessing1SourceMask
constexpr NEON2RegMiscOp NEON_FRINTP
constexpr AddSubWithCarryOp SBC_w
constexpr NEONScalar3SameOp NEON_FABD_scalar
constexpr AddSubWithCarryOp SBCS_x
constexpr NEONByIndexedElementOp NEON_SQDMULL_byelement
constexpr NEONLoadStoreMultiStructOp NEON_ST1_2v
constexpr FPIntegerConvertOp FMOV_ws
constexpr NEONLoadStoreSingleStructOp NEON_ST3_b
constexpr LogicalShiftedOp AND_x
constexpr LogicalImmediateOp ANDS_x_imm
constexpr NEONLoadStoreSingleStructOp NEON_ST2_b
constexpr FPFixedPointConvertOp FCVTZS_xd_fixed
constexpr AddSubWithCarryOp SBCS_w
constexpr MoveWideImmediateOp MOVN_w
constexpr int kQRegSizeInBits
constexpr NEONScalarCopyOp NEONScalarCopyMask
constexpr NEONLoadStoreSingleStructPostIndexOp NEON_LD2R_post
constexpr FPIntegerConvertOp FCVTNU_xs
constexpr FPCompareOp FPCompareMask
constexpr NEON3DifferentOp NEON_SQDMLSL
constexpr NEONScalar3SameOp NEON_CMEQ_scalar
constexpr NEONLoadStoreSingleStructPostIndexOp NEON_ST2_s_post
constexpr NEON3DifferentOp NEON_SMLSL
constexpr LoadLiteralOp LDR_x_lit
constexpr NEONLoadStoreSingleStructOp NEON_ST4_s
constexpr NEONScalar3SameOp NEON_SUB_scalar
constexpr NEON2RegMiscOp NEON_NEG_opcode
constexpr NEON3DifferentOp NEON_RADDHN
constexpr ExceptionOp SVC
constexpr NEONShiftImmediateOp NEON_SCVTF_imm
constexpr NEON2RegMiscOp NEON_UQXTN
constexpr LoadStoreAcquireReleaseOp LoadStoreAcquireReleaseMask
constexpr NEONByIndexedElementOp NEON_MLA_byelement
constexpr NEONTableOp NEON_TBL_4v
constexpr NEONTableOp NEON_TBX_2v
constexpr LogicalImmediateOp EOR_x_imm
constexpr NEONShiftImmediateOp NEONShiftImmediateMask
constexpr NEONLoadStoreMultiStructOp NEONLoadStoreMultiStructMask
constexpr LogicalShiftedOp AND_w
constexpr LoadStoreRegisterOffset PRFM_reg
constexpr NEONLoadStoreMultiStructPostIndexOp NEON_LD1_2v_post
constexpr ConditionalSelectOp CSNEG_x
constexpr UnconditionalBranchToRegisterOp RET
constexpr NEONScalarByIndexedElementOp NEON_FMLA_byelement_scalar
constexpr NEONScalarByIndexedElementOp NEON_SQDMULL_byelement_scalar
constexpr FPDataProcessing2SourceOp FMUL
constexpr NEON2RegMiscOp NEON_FRECPE
constexpr CompareBranchOp CBNZ_x
constexpr FPIntegerConvertOp UCVTF_dw
constexpr NEONCopyOp NEONCopyDupElementMask
constexpr NEONScalar2RegMiscOp NEON_NEG_scalar
constexpr NEONScalar3SameOp NEON_CMHS_scalar
constexpr NEON2RegMiscOp NEON_USQADD
constexpr NEONShiftImmediateOp NEON_SHL
constexpr FPImmediateOp FMOV_s_imm
constexpr NEONScalarShiftImmediateOp NEON_UQRSHRN_scalar
constexpr FPIntegerConvertOp FCVTZU_ws
constexpr NEONScalar3SameOp NEON_FMULX_scalar
constexpr NEONByIndexedElementOp NEON_MLS_byelement
constexpr NEONScalar2RegMiscOp NEON_FCMEQ_zero_scalar
constexpr NEONAcrossLanesOp NEONAcrossLanesFPMask
constexpr ConditionalSelectOp CSINV_w
constexpr NEONCopyOp NEON_DUP_ELEMENT
constexpr NEONLoadStoreMultiStructPostIndexOp NEON_LD1_4v_post
constexpr NEONScalar2RegMiscOp NEON_FCVTZU_scalar
constexpr NEONCopyOp NEONCopySmovMask
constexpr MoveWideImmediateOp MOVZ_w
constexpr NEONLoadStoreSingleStructOp NEON_LD4R
constexpr ExceptionOp DCPS1
constexpr DataProcessing3SourceOp UMSUBL_x
constexpr NEON2RegMiscOp NEON_FRINTN
constexpr NEON3DifferentOp NEON3DifferentMask
constexpr NEON2RegMiscOp NEON_SCVTF
constexpr NEONPermOp NEON_UZP2
constexpr NEONScalarByIndexedElementOp NEON_SQDMULH_byelement_scalar
constexpr LoadStorePairPostIndexOp LoadStorePairPostIndexMask
constexpr SystemHintOp SystemHintMask
constexpr FPFixedPointConvertOp FCVTZU_xs_fixed
constexpr NEONShiftImmediateOp NEON_USHR
constexpr NEONLoadStoreMultiStructOp NEON_LD1_1v
constexpr FPDataProcessing1SourceOp FSQRT
constexpr NEONScalarShiftImmediateOp NEON_SRSHR_scalar
constexpr FPIntegerConvertOp SCVTF_sw
constexpr NEONScalarByIndexedElementOp NEON_FMLS_byelement_scalar
constexpr FPFixedPointConvertOp UCVTF_sx_fixed
constexpr NEONLoadStoreSingleStructOp NEON_LD3_b
constexpr NEON3DifferentOp NEON_USUBL
constexpr NEONCopyOp NEONCopyDupGeneralMask
constexpr FPFixedPointConvertOp FCVTZU_wd_fixed
constexpr FPFixedPointConvertOp UCVTF_sw_fixed
constexpr NEONScalarPairwiseOp NEONScalarPairwiseMask
constexpr NEON2RegMiscOp NEON_FSQRT
constexpr NEONScalar2RegMiscOp NEON_FCVTPS_scalar
constexpr LogicalShiftedOp ORR_x
constexpr DataProcessing2SourceOp UDIV
constexpr ConditionalCompareImmediateOp ConditionalCompareImmediateMask
constexpr NEONScalar3SameOp NEONScalar3SameFPMask
constexpr NEON3DifferentOp NEON_SMULL
constexpr NEONScalar3DiffOp NEONScalar3DiffMask
constexpr LogicalShiftedOp EON_x
constexpr FPIntegerConvertOp FCVTPU_xd
constexpr ConditionalSelectOp CSNEG_w
constexpr NEONByIndexedElementOp NEON_UMLSL_byelement
constexpr LoadStoreAcquireReleaseOp CASPAL_w
constexpr LoadStoreUnsignedOffset LoadStoreUnsignedOffsetMask
constexpr FPIntegerConvertOp FMOV_sw
constexpr FPImmediateOp FMOV_d_imm
constexpr NEONScalar2RegMiscOp NEONScalar2RegMiscFPMask
constexpr FPIntegerConvertOp FMOV_xd
constexpr NEONLoadStoreSingleStructPostIndexOp NEON_ST4_h_post
constexpr ExceptionOp DCPS2
constexpr NEONScalar2RegMiscOp NEON_SCVTF_scalar
constexpr int kHRegSizeInBits
constexpr MemBarrierOp ISB
constexpr FPDataProcessing1SourceOp FCVT_ds
constexpr NEON3SameOp NEON_EOR
constexpr LoadStorePairPreIndexOp LoadStorePairPreIndexMask
constexpr NEONScalarByIndexedElementOp NEONScalarByIndexedElementMask
constexpr NEONLoadStoreMultiStructOp NEON_ST1_1v
constexpr NEONLoadStoreSingleStructOp NEON_LD2R
constexpr PCRelAddressingOp ADR
constexpr FPIntegerConvertOp FCVTNS_ws
constexpr NEON2RegMiscOp NEON_FRINTX
constexpr NEON2RegMiscOp NEON_FCVTNS
constexpr NEONLoadStoreSingleStructOp NEON_LD2_b
constexpr NEONLoadStoreMultiStructPostIndexOp NEON_LD1_3v_post
constexpr LogicalShiftedOp BIC_w
constexpr NEON3ExtensionOp NEON3ExtensionMask
constexpr NEON3DifferentOp NEON_SMLAL
constexpr FPIntegerConvertOp FCVTAU_xs
constexpr AddSubWithCarryOp ADCS_x
constexpr FPIntegerConvertOp FCVTZU_wd
constexpr NEONLoadStoreSingleStructPostIndexOp NEON_ST2_h_post
constexpr NEON2RegMiscOp NEON_SQXTN
constexpr NEONLoadStoreSingleStructPostIndexOp NEON_LD2_h_post
constexpr NEON2RegMiscOp NEON_FCVTPU
constexpr AddSubWithCarryOp ADC_x
constexpr int kDRegSizeInBits
constexpr NEON2RegMiscOp NEON_CLZ
constexpr NEON2RegMiscOp NEON_FCVTNU
constexpr NEONByIndexedElementOp NEON_SMULL_byelement
constexpr NEONScalar3SameOp NEON_CMGT_scalar
#define DCHECK_LE(v1, v2)
#define DCHECK_NOT_NULL(val)
#define DCHECK(condition)
#define DCHECK_LT(v1, v2)
#define DCHECK_EQ(v1, v2)