[sve2] Update CPUFeaturesAuditor

Update CPUFeaturesAuditor for SVE2, including marking the bit permutation
instructions appropriately.

Change-Id: I138a367f9adbcfb546f42733d4f14af092f559aa
diff --git a/src/aarch64/cpu-features-auditor-aarch64.cc b/src/aarch64/cpu-features-auditor-aarch64.cc
index 55380f9..990d614 100644
--- a/src/aarch64/cpu-features-auditor-aarch64.cc
+++ b/src/aarch64/cpu-features-auditor-aarch64.cc
@@ -1361,7 +1361,308 @@
   if ((form_to_visitor_.count(form) > 0) && form_to_visitor_[form]) {
     form_to_visitor_[form](this, instr);
   } else {
-    VisitUnimplemented(instr);
+    RecordInstructionFeaturesScope scope(this);
+    std::map<const std::string, const CPUFeatures> features = {
+      {"adclb_z_zzz", CPUFeatures::kSVE2},
+      {"adclt_z_zzz", CPUFeatures::kSVE2},
+      {"addhnb_z_zz", CPUFeatures::kSVE2},
+      {"addhnt_z_zz", CPUFeatures::kSVE2},
+      {"addp_z_p_zz", CPUFeatures::kSVE2},
+      {"bcax_z_zzz", CPUFeatures::kSVE2},
+      {"bdep_z_zz", CPUFeatures(CPUFeatures::kSVE2, CPUFeatures::kSVEBitPerm)},
+      {"bext_z_zz", CPUFeatures(CPUFeatures::kSVE2, CPUFeatures::kSVEBitPerm)},
+      {"bgrp_z_zz", CPUFeatures(CPUFeatures::kSVE2, CPUFeatures::kSVEBitPerm)},
+      {"bsl1n_z_zzz", CPUFeatures::kSVE2},
+      {"bsl2n_z_zzz", CPUFeatures::kSVE2},
+      {"bsl_z_zzz", CPUFeatures::kSVE2},
+      {"cadd_z_zz", CPUFeatures::kSVE2},
+      {"cdot_z_zzz", CPUFeatures::kSVE2},
+      {"cdot_z_zzzi_d", CPUFeatures::kSVE2},
+      {"cdot_z_zzzi_s", CPUFeatures::kSVE2},
+      {"cmla_z_zzz", CPUFeatures::kSVE2},
+      {"cmla_z_zzzi_h", CPUFeatures::kSVE2},
+      {"cmla_z_zzzi_s", CPUFeatures::kSVE2},
+      {"eor3_z_zzz", CPUFeatures::kSVE2},
+      {"eorbt_z_zz", CPUFeatures::kSVE2},
+      {"eortb_z_zz", CPUFeatures::kSVE2},
+      {"ext_z_zi_con", CPUFeatures::kSVE2},
+      {"faddp_z_p_zz", CPUFeatures::kSVE2},
+      {"fcvtlt_z_p_z_h2s", CPUFeatures::kSVE2},
+      {"fcvtlt_z_p_z_s2d", CPUFeatures::kSVE2},
+      {"fcvtnt_z_p_z_d2s", CPUFeatures::kSVE2},
+      {"fcvtnt_z_p_z_s2h", CPUFeatures::kSVE2},
+      {"fcvtx_z_p_z_d2s", CPUFeatures::kSVE2},
+      {"fcvtxnt_z_p_z_d2s", CPUFeatures::kSVE2},
+      {"flogb_z_p_z", CPUFeatures::kSVE2},
+      {"fmaxnmp_z_p_zz", CPUFeatures::kSVE2},
+      {"fmaxp_z_p_zz", CPUFeatures::kSVE2},
+      {"fminnmp_z_p_zz", CPUFeatures::kSVE2},
+      {"fminp_z_p_zz", CPUFeatures::kSVE2},
+      {"fmlalb_z_zzz", CPUFeatures::kSVE2},
+      {"fmlalb_z_zzzi_s", CPUFeatures::kSVE2},
+      {"fmlalt_z_zzz", CPUFeatures::kSVE2},
+      {"fmlalt_z_zzzi_s", CPUFeatures::kSVE2},
+      {"fmlslb_z_zzz", CPUFeatures::kSVE2},
+      {"fmlslb_z_zzzi_s", CPUFeatures::kSVE2},
+      {"fmlslt_z_zzz", CPUFeatures::kSVE2},
+      {"fmlslt_z_zzzi_s", CPUFeatures::kSVE2},
+      {"histcnt_z_p_zz", CPUFeatures::kSVE2},
+      {"histseg_z_zz", CPUFeatures::kSVE2},
+      {"ldnt1b_z_p_ar_d_64_unscaled",
+       CPUFeatures::kSVE2},
+      {"ldnt1b_z_p_ar_s_x32_unscaled",
+       CPUFeatures::kSVE2},
+      {"ldnt1d_z_p_ar_d_64_unscaled",
+       CPUFeatures::kSVE2},
+      {"ldnt1h_z_p_ar_d_64_unscaled",
+       CPUFeatures::kSVE2},
+      {"ldnt1h_z_p_ar_s_x32_unscaled",
+       CPUFeatures::kSVE2},
+      {"ldnt1sb_z_p_ar_d_64_unscaled",
+       CPUFeatures::kSVE2},
+      {"ldnt1sb_z_p_ar_s_x32_unscaled",
+       CPUFeatures::kSVE2},
+      {"ldnt1sh_z_p_ar_d_64_unscaled",
+       CPUFeatures::kSVE2},
+      {"ldnt1sh_z_p_ar_s_x32_unscaled",
+       CPUFeatures::kSVE2},
+      {"ldnt1sw_z_p_ar_d_64_unscaled",
+       CPUFeatures::kSVE2},
+      {"ldnt1w_z_p_ar_d_64_unscaled",
+       CPUFeatures::kSVE2},
+      {"ldnt1w_z_p_ar_s_x32_unscaled",
+       CPUFeatures::kSVE2},
+      {"match_p_p_zz", CPUFeatures::kSVE2},
+      {"mla_z_zzzi_d", CPUFeatures::kSVE2},
+      {"mla_z_zzzi_h", CPUFeatures::kSVE2},
+      {"mla_z_zzzi_s", CPUFeatures::kSVE2},
+      {"mls_z_zzzi_d", CPUFeatures::kSVE2},
+      {"mls_z_zzzi_h", CPUFeatures::kSVE2},
+      {"mls_z_zzzi_s", CPUFeatures::kSVE2},
+      {"mul_z_zz", CPUFeatures::kSVE2},
+      {"mul_z_zzi_d", CPUFeatures::kSVE2},
+      {"mul_z_zzi_h", CPUFeatures::kSVE2},
+      {"mul_z_zzi_s", CPUFeatures::kSVE2},
+      {"nbsl_z_zzz", CPUFeatures::kSVE2},
+      {"nmatch_p_p_zz", CPUFeatures::kSVE2},
+      {"pmul_z_zz", CPUFeatures::kSVE2},
+      {"pmullb_z_zz", CPUFeatures::kSVE2},
+      {"pmullt_z_zz", CPUFeatures::kSVE2},
+      {"raddhnb_z_zz", CPUFeatures::kSVE2},
+      {"raddhnt_z_zz", CPUFeatures::kSVE2},
+      {"rshrnb_z_zi", CPUFeatures::kSVE2},
+      {"rshrnt_z_zi", CPUFeatures::kSVE2},
+      {"rsubhnb_z_zz", CPUFeatures::kSVE2},
+      {"rsubhnt_z_zz", CPUFeatures::kSVE2},
+      {"saba_z_zzz", CPUFeatures::kSVE2},
+      {"sabalb_z_zzz", CPUFeatures::kSVE2},
+      {"sabalt_z_zzz", CPUFeatures::kSVE2},
+      {"sabdlb_z_zz", CPUFeatures::kSVE2},
+      {"sabdlt_z_zz", CPUFeatures::kSVE2},
+      {"sadalp_z_p_z", CPUFeatures::kSVE2},
+      {"saddlb_z_zz", CPUFeatures::kSVE2},
+      {"saddlbt_z_zz", CPUFeatures::kSVE2},
+      {"saddlt_z_zz", CPUFeatures::kSVE2},
+      {"saddwb_z_zz", CPUFeatures::kSVE2},
+      {"saddwt_z_zz", CPUFeatures::kSVE2},
+      {"sbclb_z_zzz", CPUFeatures::kSVE2},
+      {"sbclt_z_zzz", CPUFeatures::kSVE2},
+      {"shadd_z_p_zz", CPUFeatures::kSVE2},
+      {"shrnb_z_zi", CPUFeatures::kSVE2},
+      {"shrnt_z_zi", CPUFeatures::kSVE2},
+      {"shsub_z_p_zz", CPUFeatures::kSVE2},
+      {"shsubr_z_p_zz", CPUFeatures::kSVE2},
+      {"sli_z_zzi", CPUFeatures::kSVE2},
+      {"smaxp_z_p_zz", CPUFeatures::kSVE2},
+      {"sminp_z_p_zz", CPUFeatures::kSVE2},
+      {"smlalb_z_zzz", CPUFeatures::kSVE2},
+      {"smlalb_z_zzzi_d", CPUFeatures::kSVE2},
+      {"smlalb_z_zzzi_s", CPUFeatures::kSVE2},
+      {"smlalt_z_zzz", CPUFeatures::kSVE2},
+      {"smlalt_z_zzzi_d", CPUFeatures::kSVE2},
+      {"smlalt_z_zzzi_s", CPUFeatures::kSVE2},
+      {"smlslb_z_zzz", CPUFeatures::kSVE2},
+      {"smlslb_z_zzzi_d", CPUFeatures::kSVE2},
+      {"smlslb_z_zzzi_s", CPUFeatures::kSVE2},
+      {"smlslt_z_zzz", CPUFeatures::kSVE2},
+      {"smlslt_z_zzzi_d", CPUFeatures::kSVE2},
+      {"smlslt_z_zzzi_s", CPUFeatures::kSVE2},
+      {"smulh_z_zz", CPUFeatures::kSVE2},
+      {"smullb_z_zz", CPUFeatures::kSVE2},
+      {"smullb_z_zzi_d", CPUFeatures::kSVE2},
+      {"smullb_z_zzi_s", CPUFeatures::kSVE2},
+      {"smullt_z_zz", CPUFeatures::kSVE2},
+      {"smullt_z_zzi_d", CPUFeatures::kSVE2},
+      {"smullt_z_zzi_s", CPUFeatures::kSVE2},
+      {"splice_z_p_zz_con", CPUFeatures::kSVE2},
+      {"sqabs_z_p_z", CPUFeatures::kSVE2},
+      {"sqadd_z_p_zz", CPUFeatures::kSVE2},
+      {"sqcadd_z_zz", CPUFeatures::kSVE2},
+      {"sqdmlalb_z_zzz", CPUFeatures::kSVE2},
+      {"sqdmlalb_z_zzzi_d", CPUFeatures::kSVE2},
+      {"sqdmlalb_z_zzzi_s", CPUFeatures::kSVE2},
+      {"sqdmlalbt_z_zzz", CPUFeatures::kSVE2},
+      {"sqdmlalt_z_zzz", CPUFeatures::kSVE2},
+      {"sqdmlalt_z_zzzi_d", CPUFeatures::kSVE2},
+      {"sqdmlalt_z_zzzi_s", CPUFeatures::kSVE2},
+      {"sqdmlslb_z_zzz", CPUFeatures::kSVE2},
+      {"sqdmlslb_z_zzzi_d", CPUFeatures::kSVE2},
+      {"sqdmlslb_z_zzzi_s", CPUFeatures::kSVE2},
+      {"sqdmlslbt_z_zzz", CPUFeatures::kSVE2},
+      {"sqdmlslt_z_zzz", CPUFeatures::kSVE2},
+      {"sqdmlslt_z_zzzi_d", CPUFeatures::kSVE2},
+      {"sqdmlslt_z_zzzi_s", CPUFeatures::kSVE2},
+      {"sqdmulh_z_zz", CPUFeatures::kSVE2},
+      {"sqdmulh_z_zzi_d", CPUFeatures::kSVE2},
+      {"sqdmulh_z_zzi_h", CPUFeatures::kSVE2},
+      {"sqdmulh_z_zzi_s", CPUFeatures::kSVE2},
+      {"sqdmullb_z_zz", CPUFeatures::kSVE2},
+      {"sqdmullb_z_zzi_d", CPUFeatures::kSVE2},
+      {"sqdmullb_z_zzi_s", CPUFeatures::kSVE2},
+      {"sqdmullt_z_zz", CPUFeatures::kSVE2},
+      {"sqdmullt_z_zzi_d", CPUFeatures::kSVE2},
+      {"sqdmullt_z_zzi_s", CPUFeatures::kSVE2},
+      {"sqneg_z_p_z", CPUFeatures::kSVE2},
+      {"sqrdcmlah_z_zzz", CPUFeatures::kSVE2},
+      {"sqrdcmlah_z_zzzi_h", CPUFeatures::kSVE2},
+      {"sqrdcmlah_z_zzzi_s", CPUFeatures::kSVE2},
+      {"sqrdmlah_z_zzz", CPUFeatures::kSVE2},
+      {"sqrdmlah_z_zzzi_d", CPUFeatures::kSVE2},
+      {"sqrdmlah_z_zzzi_h", CPUFeatures::kSVE2},
+      {"sqrdmlah_z_zzzi_s", CPUFeatures::kSVE2},
+      {"sqrdmlsh_z_zzz", CPUFeatures::kSVE2},
+      {"sqrdmlsh_z_zzzi_d", CPUFeatures::kSVE2},
+      {"sqrdmlsh_z_zzzi_h", CPUFeatures::kSVE2},
+      {"sqrdmlsh_z_zzzi_s", CPUFeatures::kSVE2},
+      {"sqrdmulh_z_zz", CPUFeatures::kSVE2},
+      {"sqrdmulh_z_zzi_d", CPUFeatures::kSVE2},
+      {"sqrdmulh_z_zzi_h", CPUFeatures::kSVE2},
+      {"sqrdmulh_z_zzi_s", CPUFeatures::kSVE2},
+      {"sqrshl_z_p_zz", CPUFeatures::kSVE2},
+      {"sqrshlr_z_p_zz", CPUFeatures::kSVE2},
+      {"sqrshrnb_z_zi", CPUFeatures::kSVE2},
+      {"sqrshrnt_z_zi", CPUFeatures::kSVE2},
+      {"sqrshrunb_z_zi", CPUFeatures::kSVE2},
+      {"sqrshrunt_z_zi", CPUFeatures::kSVE2},
+      {"sqshl_z_p_zi", CPUFeatures::kSVE2},
+      {"sqshl_z_p_zz", CPUFeatures::kSVE2},
+      {"sqshlr_z_p_zz", CPUFeatures::kSVE2},
+      {"sqshlu_z_p_zi", CPUFeatures::kSVE2},
+      {"sqshrnb_z_zi", CPUFeatures::kSVE2},
+      {"sqshrnt_z_zi", CPUFeatures::kSVE2},
+      {"sqshrunb_z_zi", CPUFeatures::kSVE2},
+      {"sqshrunt_z_zi", CPUFeatures::kSVE2},
+      {"sqsub_z_p_zz", CPUFeatures::kSVE2},
+      {"sqsubr_z_p_zz", CPUFeatures::kSVE2},
+      {"sqxtnb_z_zz", CPUFeatures::kSVE2},
+      {"sqxtnt_z_zz", CPUFeatures::kSVE2},
+      {"sqxtunb_z_zz", CPUFeatures::kSVE2},
+      {"sqxtunt_z_zz", CPUFeatures::kSVE2},
+      {"srhadd_z_p_zz", CPUFeatures::kSVE2},
+      {"sri_z_zzi", CPUFeatures::kSVE2},
+      {"srshl_z_p_zz", CPUFeatures::kSVE2},
+      {"srshlr_z_p_zz", CPUFeatures::kSVE2},
+      {"srshr_z_p_zi", CPUFeatures::kSVE2},
+      {"srsra_z_zi", CPUFeatures::kSVE2},
+      {"sshllb_z_zi", CPUFeatures::kSVE2},
+      {"sshllt_z_zi", CPUFeatures::kSVE2},
+      {"ssra_z_zi", CPUFeatures::kSVE2},
+      {"ssublb_z_zz", CPUFeatures::kSVE2},
+      {"ssublbt_z_zz", CPUFeatures::kSVE2},
+      {"ssublt_z_zz", CPUFeatures::kSVE2},
+      {"ssubltb_z_zz", CPUFeatures::kSVE2},
+      {"ssubwb_z_zz", CPUFeatures::kSVE2},
+      {"ssubwt_z_zz", CPUFeatures::kSVE2},
+      {"stnt1b_z_p_ar_d_64_unscaled", CPUFeatures::kSVE2},
+      {"stnt1b_z_p_ar_s_x32_unscaled",
+       CPUFeatures::kSVE2},
+      {"stnt1d_z_p_ar_d_64_unscaled", CPUFeatures::kSVE2},
+      {"stnt1h_z_p_ar_d_64_unscaled", CPUFeatures::kSVE2},
+      {"stnt1h_z_p_ar_s_x32_unscaled",
+       CPUFeatures::kSVE2},
+      {"stnt1w_z_p_ar_d_64_unscaled", CPUFeatures::kSVE2},
+      {"stnt1w_z_p_ar_s_x32_unscaled",
+       CPUFeatures::kSVE2},
+      {"subhnb_z_zz", CPUFeatures::kSVE2},
+      {"subhnt_z_zz", CPUFeatures::kSVE2},
+      {"suqadd_z_p_zz", CPUFeatures::kSVE2},
+      {"tbl_z_zz_2", CPUFeatures::kSVE2},
+      {"tbx_z_zz", CPUFeatures::kSVE2},
+      {"uaba_z_zzz", CPUFeatures::kSVE2},
+      {"uabalb_z_zzz", CPUFeatures::kSVE2},
+      {"uabalt_z_zzz", CPUFeatures::kSVE2},
+      {"uabdlb_z_zz", CPUFeatures::kSVE2},
+      {"uabdlt_z_zz", CPUFeatures::kSVE2},
+      {"uadalp_z_p_z", CPUFeatures::kSVE2},
+      {"uaddlb_z_zz", CPUFeatures::kSVE2},
+      {"uaddlt_z_zz", CPUFeatures::kSVE2},
+      {"uaddwb_z_zz", CPUFeatures::kSVE2},
+      {"uaddwt_z_zz", CPUFeatures::kSVE2},
+      {"uhadd_z_p_zz", CPUFeatures::kSVE2},
+      {"uhsub_z_p_zz", CPUFeatures::kSVE2},
+      {"uhsubr_z_p_zz", CPUFeatures::kSVE2},
+      {"umaxp_z_p_zz", CPUFeatures::kSVE2},
+      {"uminp_z_p_zz", CPUFeatures::kSVE2},
+      {"umlalb_z_zzz", CPUFeatures::kSVE2},
+      {"umlalb_z_zzzi_d", CPUFeatures::kSVE2},
+      {"umlalb_z_zzzi_s", CPUFeatures::kSVE2},
+      {"umlalt_z_zzz", CPUFeatures::kSVE2},
+      {"umlalt_z_zzzi_d", CPUFeatures::kSVE2},
+      {"umlalt_z_zzzi_s", CPUFeatures::kSVE2},
+      {"umlslb_z_zzz", CPUFeatures::kSVE2},
+      {"umlslb_z_zzzi_d", CPUFeatures::kSVE2},
+      {"umlslb_z_zzzi_s", CPUFeatures::kSVE2},
+      {"umlslt_z_zzz", CPUFeatures::kSVE2},
+      {"umlslt_z_zzzi_d", CPUFeatures::kSVE2},
+      {"umlslt_z_zzzi_s", CPUFeatures::kSVE2},
+      {"umulh_z_zz", CPUFeatures::kSVE2},
+      {"umullb_z_zz", CPUFeatures::kSVE2},
+      {"umullb_z_zzi_d", CPUFeatures::kSVE2},
+      {"umullb_z_zzi_s", CPUFeatures::kSVE2},
+      {"umullt_z_zz", CPUFeatures::kSVE2},
+      {"umullt_z_zzi_d", CPUFeatures::kSVE2},
+      {"umullt_z_zzi_s", CPUFeatures::kSVE2},
+      {"uqadd_z_p_zz", CPUFeatures::kSVE2},
+      {"uqrshl_z_p_zz", CPUFeatures::kSVE2},
+      {"uqrshlr_z_p_zz", CPUFeatures::kSVE2},
+      {"uqrshrnb_z_zi", CPUFeatures::kSVE2},
+      {"uqrshrnt_z_zi", CPUFeatures::kSVE2},
+      {"uqshl_z_p_zi", CPUFeatures::kSVE2},
+      {"uqshl_z_p_zz", CPUFeatures::kSVE2},
+      {"uqshlr_z_p_zz", CPUFeatures::kSVE2},
+      {"uqshrnb_z_zi", CPUFeatures::kSVE2},
+      {"uqshrnt_z_zi", CPUFeatures::kSVE2},
+      {"uqsub_z_p_zz", CPUFeatures::kSVE2},
+      {"uqsubr_z_p_zz", CPUFeatures::kSVE2},
+      {"uqxtnb_z_zz", CPUFeatures::kSVE2},
+      {"uqxtnt_z_zz", CPUFeatures::kSVE2},
+      {"urecpe_z_p_z", CPUFeatures::kSVE2},
+      {"urhadd_z_p_zz", CPUFeatures::kSVE2},
+      {"urshl_z_p_zz", CPUFeatures::kSVE2},
+      {"urshlr_z_p_zz", CPUFeatures::kSVE2},
+      {"urshr_z_p_zi", CPUFeatures::kSVE2},
+      {"ursqrte_z_p_z", CPUFeatures::kSVE2},
+      {"ursra_z_zi", CPUFeatures::kSVE2},
+      {"ushllb_z_zi", CPUFeatures::kSVE2},
+      {"ushllt_z_zi", CPUFeatures::kSVE2},
+      {"usqadd_z_p_zz", CPUFeatures::kSVE2},
+      {"usra_z_zi", CPUFeatures::kSVE2},
+      {"usublb_z_zz", CPUFeatures::kSVE2},
+      {"usublt_z_zz", CPUFeatures::kSVE2},
+      {"usubwb_z_zz", CPUFeatures::kSVE2},
+      {"usubwt_z_zz", CPUFeatures::kSVE2},
+      {"whilege_p_p_rr", CPUFeatures::kSVE2},
+      {"whilegt_p_p_rr", CPUFeatures::kSVE2},
+      {"whilehi_p_p_rr", CPUFeatures::kSVE2},
+      {"whilehs_p_p_rr", CPUFeatures::kSVE2},
+      {"whilerw_p_rr", CPUFeatures::kSVE2},
+      {"whilewr_p_rr", CPUFeatures::kSVE2},
+      {"xar_z_zzi", CPUFeatures::kSVE2},
+    };
+
+    if (features.count(form) > 0) {
+      scope.Record(features[form]);
+    }
   }
 }