summaryrefslogtreecommitdiff
path: root/arch/arm64/disassembler/feature_flags.h
diff options
context:
space:
mode:
authorMark Rowe <mark@vector35.com>2025-09-18 11:46:39 -0700
committerMark Rowe <mark@vector35.com>2025-09-25 08:41:48 -0700
commit6e1306923c60b3d6c1cefb1fcc240f1a064d6f20 (patch)
tree57fb65f74fecfa95dd394ecc5b664512d8f87609 /arch/arm64/disassembler/feature_flags.h
parent0deeb4a61749737b98f7946ec88b693068180e28 (diff)
[AArch64] Update disassembler based on 2025-06 ARM ISA data
Alongside this I also added support for decoding: * LDR / STR (table) * PMULLB / PMULLT * ABS / CNT / CTZ * SMIN / SMAX / UMIN / UMAX * RPRFM * PSEL Note that while these instructions will now be disassembled, they are not yet lifted to LLIL. Additionally, I fixed a number of errors in the decoding of some less commonly occurring instructions.
Diffstat (limited to 'arch/arm64/disassembler/feature_flags.h')
-rw-r--r--arch/arm64/disassembler/feature_flags.h519
1 files changed, 328 insertions, 191 deletions
diff --git a/arch/arm64/disassembler/feature_flags.h b/arch/arm64/disassembler/feature_flags.h
index 349f0cc6..c2a56df7 100644
--- a/arch/arm64/disassembler/feature_flags.h
+++ b/arch/arm64/disassembler/feature_flags.h
@@ -1,197 +1,334 @@
/* GENERATED FILE */
#pragma once
-// 41 HasXXX() functions used by decode:
-#define HasBF16() (ctx->features0 & ARCH_FEATURE_BF16)
-#define HasBTI() (ctx->features0 & ARCH_FEATURE_BTI)
-#define HasDGH() (ctx->features0 & ARCH_FEATURE_DGH)
-#define HasDotProd() (ctx->features0 & ARCH_FEATURE_DotProd)
-#define HasF32MM() (ctx->features0 & ARCH_FEATURE_F32MM)
-#define HasF64MM() (ctx->features0 & ARCH_FEATURE_F64MM)
-#define HasFCMA() (ctx->features0 & ARCH_FEATURE_FCMA)
-#define HasFHM() (ctx->features0 & ARCH_FEATURE_FHM)
-#define HasFP16() (ctx->features0 & ARCH_FEATURE_FP16)
-#define HasFRINTTS() (ctx->features0 & ARCH_FEATURE_FRINTTS)
-#define HasFlagM() (ctx->features0 & ARCH_FEATURE_FlagM)
-#define HasFlagM2() (ctx->features0 & ARCH_FEATURE_FlagM2)
-#define HasI8MM() (ctx->features0 & ARCH_FEATURE_I8MM)
-#define HasJSCVT() (ctx->features0 & ARCH_FEATURE_JSCVT)
-#define HasLOR() (ctx->features0 & ARCH_FEATURE_LOR)
-#define HasLRCPC() (ctx->features0 & ARCH_FEATURE_LRCPC)
-#define HasLRCPC2() (ctx->features0 & ARCH_FEATURE_LRCPC2)
-#define HasLS64() (ctx->features0 & ARCH_FEATURE_LS64)
-#define HasLS64_V() (ctx->features0 & ARCH_FEATURE_LS64_V)
-#define HasLSE() (ctx->features0 & ARCH_FEATURE_LSE)
-#define HasMTE() (ctx->features0 & ARCH_FEATURE_MTE)
-#define HasMTE2() (ctx->features0 & ARCH_FEATURE_MTE2)
-#define HasPAuth() (ctx->features0 & ARCH_FEATURE_PAuth)
-#define HasRAS() (ctx->features0 & ARCH_FEATURE_RAS)
-#define HasRDM() (ctx->features0 & ARCH_FEATURE_RDM)
-#define HasSHA3() (ctx->features0 & ARCH_FEATURE_SHA3)
-#define HasSHA512() (ctx->features0 & ARCH_FEATURE_SHA512)
-#define HasSM3() (ctx->features0 & ARCH_FEATURE_SM3)
-#define HasSM4() (ctx->features0 & ARCH_FEATURE_SM4)
-#define HasSME() (ctx->features0 & ARCH_FEATURE_SME)
-#define HasSME_F64F64() (ctx->features0 & ARCH_FEATURE_SME_F64F64)
-#define HasSME_I16I64() (ctx->features0 & ARCH_FEATURE_SME_I16I64)
-#define HasSPE() (ctx->features0 & ARCH_FEATURE_SPE)
-#define HasSVE_AES() (ctx->features0 & ARCH_FEATURE_SVE_AES)
-#define HasSVE_BitPerm() (ctx->features0 & ARCH_FEATURE_SVE_BitPerm)
-#define HasSVE_SHA3() (ctx->features0 & ARCH_FEATURE_SVE_SHA3)
-#define HasSVE_SM4() (ctx->features0 & ARCH_FEATURE_SVE_SM4)
-#define HasTME() (ctx->features0 & ARCH_FEATURE_TME)
-#define HasTRF() (ctx->features0 & ARCH_FEATURE_TRF)
-#define HasWFxT() (ctx->features0 & ARCH_FEATURE_WFxT)
-#define HasXS() (ctx->features0 & ARCH_FEATURE_XS)
+// 100 HasXXX() functions used by decode:
+#define HasFeature(feat) (ctx->decode_features[(feat) / 64] & ((uint64_t)1 << ((feat) % 64)))
-// 52 HaveXXX() functions used by pcode:
-#define HaveAESExt() (ctx->features1 & ARCH_FEATURE_AESExt)
-#define HaveAtomicExt() (ctx->features1 & ARCH_FEATURE_AtomicExt)
-#define HaveBF16Ext() (ctx->features1 & ARCH_FEATURE_BF16Ext)
-#define HaveBTIExt() (ctx->features1 & ARCH_FEATURE_BTIExt)
-#define HaveBit128PMULLExt() (ctx->features1 & ARCH_FEATURE_Bit128PMULLExt)
-#define HaveCRCExt() (ctx->features1 & ARCH_FEATURE_CRCExt)
-#define HaveDGHExt() (ctx->features1 & ARCH_FEATURE_DGHExt)
-#define HaveDITExt() (ctx->features1 & ARCH_FEATURE_DITExt)
-#define HaveDOTPExt() (ctx->features1 & ARCH_FEATURE_DOTPExt)
-#define HaveFCADDExt() (ctx->features1 & ARCH_FEATURE_FCADDExt)
-#define HaveFJCVTZSExt() (ctx->features1 & ARCH_FEATURE_FJCVTZSExt)
-#define HaveFP16Ext() (ctx->features1 & ARCH_FEATURE_FP16Ext)
-#define HaveFP16MulNoRoundingToFP32Ext() (ctx->features1 & ARCH_FEATURE_FP16MulNoRoundingToFP32Ext)
-#define HaveFeatLS64() (ctx->features1 & ARCH_FEATURE_FeatLS64)
-#define HaveFeatWFxT() (ctx->features1 & ARCH_FEATURE_FeatWFxT)
-#define HaveFeatXS() (ctx->features1 & ARCH_FEATURE_FeatXS)
-#define HaveFlagFormatExt() (ctx->features1 & ARCH_FEATURE_FlagFormatExt)
-#define HaveFlagManipulateExt() (ctx->features1 & ARCH_FEATURE_FlagManipulateExt)
-#define HaveFrintExt() (ctx->features1 & ARCH_FEATURE_FrintExt)
-#define HaveInt8MatMulExt() (ctx->features1 & ARCH_FEATURE_Int8MatMulExt)
-#define HaveMTE2Ext() (ctx->features1 & ARCH_FEATURE_MTE2Ext)
-#define HaveMTEExt() (ctx->features1 & ARCH_FEATURE_MTEExt)
-#define HaveNVExt() (ctx->features1 & ARCH_FEATURE_NVExt)
-#define HavePACExt() (ctx->features1 & ARCH_FEATURE_PACExt)
-#define HavePANExt() (ctx->features1 & ARCH_FEATURE_PANExt)
-#define HaveQRDMLAHExt() (ctx->features1 & ARCH_FEATURE_QRDMLAHExt)
-#define HaveRASExt() (ctx->features1 & ARCH_FEATURE_RASExt)
-#define HaveSBExt() (ctx->features1 & ARCH_FEATURE_SBExt)
-#define HaveSHA1Ext() (ctx->features1 & ARCH_FEATURE_SHA1Ext)
-#define HaveSHA256Ext() (ctx->features1 & ARCH_FEATURE_SHA256Ext)
-#define HaveSHA3Ext() (ctx->features1 & ARCH_FEATURE_SHA3Ext)
-#define HaveSHA512Ext() (ctx->features1 & ARCH_FEATURE_SHA512Ext)
-#define HaveSM3Ext() (ctx->features1 & ARCH_FEATURE_SM3Ext)
-#define HaveSM4Ext() (ctx->features1 & ARCH_FEATURE_SM4Ext)
-#define HaveSME() (ctx->features1 & ARCH_FEATURE_SME)
-#define HaveSMEF64F64() (ctx->features1 & ARCH_FEATURE_SMEF64F64)
-#define HaveSMEI16I64() (ctx->features1 & ARCH_FEATURE_SMEI16I64)
-#define HaveSSBSExt() (ctx->features1 & ARCH_FEATURE_SSBSExt)
-#define HaveSVE() (ctx->features1 & ARCH_FEATURE_SVE)
-#define HaveSVE2() (ctx->features1 & ARCH_FEATURE_SVE2)
-#define HaveSVE2AES() (ctx->features1 & ARCH_FEATURE_SVE2AES)
-#define HaveSVE2BitPerm() (ctx->features1 & ARCH_FEATURE_SVE2BitPerm)
-#define HaveSVE2PMULL128() (ctx->features1 & ARCH_FEATURE_SVE2PMULL128)
-#define HaveSVE2SHA3() (ctx->features1 & ARCH_FEATURE_SVE2SHA3)
-#define HaveSVE2SM4() (ctx->features1 & ARCH_FEATURE_SVE2SM4)
-#define HaveSVEFP32MatMulExt() (ctx->features1 & ARCH_FEATURE_SVEFP32MatMulExt)
-#define HaveSVEFP64MatMulExt() (ctx->features1 & ARCH_FEATURE_SVEFP64MatMulExt)
-#define HaveSelfHostedTrace() (ctx->features1 & ARCH_FEATURE_SelfHostedTrace)
-#define HaveStatisticalProfiling() (ctx->features1 & ARCH_FEATURE_StatisticalProfiling)
-#define HaveTME() (ctx->features1 & ARCH_FEATURE_TME)
-#define HaveUAOExt() (ctx->features1 & ARCH_FEATURE_UAOExt)
-#define HaveVirtHostExt() (ctx->features1 & ARCH_FEATURE_VirtHostExt)
+#define HasAES() HasFeature(ARCH_FEATURE_AES)
+#define HasAdvSIMD() HasFeature(ARCH_FEATURE_AdvSIMD)
+#define HasBF16() HasFeature(ARCH_FEATURE_BF16)
+#define HasBTI() HasFeature(ARCH_FEATURE_BTI)
+#define HasCHK() HasFeature(ARCH_FEATURE_CHK)
+#define HasCLRBHB() HasFeature(ARCH_FEATURE_CLRBHB)
+#define HasCMPBR() HasFeature(ARCH_FEATURE_CMPBR)
+#define HasCPA() HasFeature(ARCH_FEATURE_CPA)
+#define HasCRC32() HasFeature(ARCH_FEATURE_CRC32)
+#define HasCSSC() HasFeature(ARCH_FEATURE_CSSC)
+#define HasD128() HasFeature(ARCH_FEATURE_D128)
+#define HasDGH() HasFeature(ARCH_FEATURE_DGH)
+#define HasDotProd() HasFeature(ARCH_FEATURE_DotProd)
+#define HasF32MM() HasFeature(ARCH_FEATURE_F32MM)
+#define HasF64MM() HasFeature(ARCH_FEATURE_F64MM)
+#define HasF8F16MM() HasFeature(ARCH_FEATURE_F8F16MM)
+#define HasF8F32MM() HasFeature(ARCH_FEATURE_F8F32MM)
+#define HasFAMINMAX() HasFeature(ARCH_FEATURE_FAMINMAX)
+#define HasFCMA() HasFeature(ARCH_FEATURE_FCMA)
+#define HasFHM() HasFeature(ARCH_FEATURE_FHM)
+#define HasFP() HasFeature(ARCH_FEATURE_FP)
+#define HasFP16() HasFeature(ARCH_FEATURE_FP16)
+#define HasFP8() HasFeature(ARCH_FEATURE_FP8)
+#define HasFP8DOT2() HasFeature(ARCH_FEATURE_FP8DOT2)
+#define HasFP8DOT4() HasFeature(ARCH_FEATURE_FP8DOT4)
+#define HasFP8FMA() HasFeature(ARCH_FEATURE_FP8FMA)
+#define HasFPRCVT() HasFeature(ARCH_FEATURE_FPRCVT)
+#define HasFRINTTS() HasFeature(ARCH_FEATURE_FRINTTS)
+#define HasFlagM() HasFeature(ARCH_FEATURE_FlagM)
+#define HasFlagM2() HasFeature(ARCH_FEATURE_FlagM2)
+#define HasGCS() HasFeature(ARCH_FEATURE_GCS)
+#define HasHBC() HasFeature(ARCH_FEATURE_HBC)
+#define HasI8MM() HasFeature(ARCH_FEATURE_I8MM)
+#define HasJSCVT() HasFeature(ARCH_FEATURE_JSCVT)
+#define HasLOR() HasFeature(ARCH_FEATURE_LOR)
+#define HasLRCPC() HasFeature(ARCH_FEATURE_LRCPC)
+#define HasLRCPC2() HasFeature(ARCH_FEATURE_LRCPC2)
+#define HasLRCPC3() HasFeature(ARCH_FEATURE_LRCPC3)
+#define HasLS64() HasFeature(ARCH_FEATURE_LS64)
+#define HasLS64_ACCDATA() HasFeature(ARCH_FEATURE_LS64_ACCDATA)
+#define HasLS64_V() HasFeature(ARCH_FEATURE_LS64_V)
+#define HasLSE() HasFeature(ARCH_FEATURE_LSE)
+#define HasLSE128() HasFeature(ARCH_FEATURE_LSE128)
+#define HasLSFE() HasFeature(ARCH_FEATURE_LSFE)
+#define HasLSUI() HasFeature(ARCH_FEATURE_LSUI)
+#define HasLUT() HasFeature(ARCH_FEATURE_LUT)
+#define HasMOPS() HasFeature(ARCH_FEATURE_MOPS)
+#define HasMTE() HasFeature(ARCH_FEATURE_MTE)
+#define HasMTE2() HasFeature(ARCH_FEATURE_MTE2)
+#define HasPAuth() HasFeature(ARCH_FEATURE_PAuth)
+#define HasPAuth_LR() HasFeature(ARCH_FEATURE_PAuth_LR)
+#define HasPCDPHINT() HasFeature(ARCH_FEATURE_PCDPHINT)
+#define HasRAS() HasFeature(ARCH_FEATURE_RAS)
+#define HasRDM() HasFeature(ARCH_FEATURE_RDM)
+#define HasRPRFM() HasFeature(ARCH_FEATURE_RPRFM)
+#define HasSB() HasFeature(ARCH_FEATURE_SB)
+#define HasSHA1() HasFeature(ARCH_FEATURE_SHA1)
+#define HasSHA256() HasFeature(ARCH_FEATURE_SHA256)
+#define HasSHA3() HasFeature(ARCH_FEATURE_SHA3)
+#define HasSHA512() HasFeature(ARCH_FEATURE_SHA512)
+#define HasSM3() HasFeature(ARCH_FEATURE_SM3)
+#define HasSM4() HasFeature(ARCH_FEATURE_SM4)
+#define HasSME() HasFeature(ARCH_FEATURE_SME)
+#define HasSME2() HasFeature(ARCH_FEATURE_SME2)
+#define HasSME2p1() HasFeature(ARCH_FEATURE_SME2p1)
+#define HasSME2p2() HasFeature(ARCH_FEATURE_SME2p2)
+#define HasSME_B16B16() HasFeature(ARCH_FEATURE_SME_B16B16)
+#define HasSME_F16F16() HasFeature(ARCH_FEATURE_SME_F16F16)
+#define HasSME_F64F64() HasFeature(ARCH_FEATURE_SME_F64F64)
+#define HasSME_F8F16() HasFeature(ARCH_FEATURE_SME_F8F16)
+#define HasSME_F8F32() HasFeature(ARCH_FEATURE_SME_F8F32)
+#define HasSME_I16I64() HasFeature(ARCH_FEATURE_SME_I16I64)
+#define HasSME_LUTv2() HasFeature(ARCH_FEATURE_SME_LUTv2)
+#define HasSME_MOP4() HasFeature(ARCH_FEATURE_SME_MOP4)
+#define HasSME_TMOP() HasFeature(ARCH_FEATURE_SME_TMOP)
+#define HasSPE() HasFeature(ARCH_FEATURE_SPE)
+#define HasSSVE_FEXPA() HasFeature(ARCH_FEATURE_SSVE_FEXPA)
+#define HasSSVE_FP8DOT2() HasFeature(ARCH_FEATURE_SSVE_FP8DOT2)
+#define HasSSVE_FP8DOT4() HasFeature(ARCH_FEATURE_SSVE_FP8DOT4)
+#define HasSSVE_FP8FMA() HasFeature(ARCH_FEATURE_SSVE_FP8FMA)
+#define HasSVE() HasFeature(ARCH_FEATURE_SVE)
+#define HasSVE2() HasFeature(ARCH_FEATURE_SVE2)
+#define HasSVE2p1() HasFeature(ARCH_FEATURE_SVE2p1)
+#define HasSVE2p2() HasFeature(ARCH_FEATURE_SVE2p2)
+#define HasSVE_AES() HasFeature(ARCH_FEATURE_SVE_AES)
+#define HasSVE_AES2() HasFeature(ARCH_FEATURE_SVE_AES2)
+#define HasSVE_B16B16() HasFeature(ARCH_FEATURE_SVE_B16B16)
+#define HasSVE_BFSCALE() HasFeature(ARCH_FEATURE_SVE_BFSCALE)
+#define HasSVE_BitPerm() HasFeature(ARCH_FEATURE_SVE_BitPerm)
+#define HasSVE_F16F32MM() HasFeature(ARCH_FEATURE_SVE_F16F32MM)
+#define HasSVE_PMULL128() HasFeature(ARCH_FEATURE_SVE_PMULL128)
+#define HasSVE_SHA3() HasFeature(ARCH_FEATURE_SVE_SHA3)
+#define HasSVE_SM4() HasFeature(ARCH_FEATURE_SVE_SM4)
+#define HasSYSINSTR128() HasFeature(ARCH_FEATURE_SYSINSTR128)
+#define HasSYSREG128() HasFeature(ARCH_FEATURE_SYSREG128)
+#define HasTHE() HasFeature(ARCH_FEATURE_THE)
+#define HasTME() HasFeature(ARCH_FEATURE_TME)
+#define HasTRF() HasFeature(ARCH_FEATURE_TRF)
+#define HasWFxT() HasFeature(ARCH_FEATURE_WFxT)
+#define HasXS() HasFeature(ARCH_FEATURE_XS)
-// defines for features referenced at decode
-#define ARCH_FEATURE_BF16 ((uint64_t)1<<0)
-#define ARCH_FEATURE_BTI ((uint64_t)1<<1)
-#define ARCH_FEATURE_DGH ((uint64_t)1<<2)
-#define ARCH_FEATURE_DotProd ((uint64_t)1<<3)
-#define ARCH_FEATURE_F32MM ((uint64_t)1<<4)
-#define ARCH_FEATURE_F64MM ((uint64_t)1<<5)
-#define ARCH_FEATURE_FCMA ((uint64_t)1<<6)
-#define ARCH_FEATURE_FHM ((uint64_t)1<<7)
-#define ARCH_FEATURE_FP16 ((uint64_t)1<<8)
-#define ARCH_FEATURE_FRINTTS ((uint64_t)1<<9)
-#define ARCH_FEATURE_FlagM ((uint64_t)1<<10)
-#define ARCH_FEATURE_FlagM2 ((uint64_t)1<<11)
-#define ARCH_FEATURE_I8MM ((uint64_t)1<<12)
-#define ARCH_FEATURE_JSCVT ((uint64_t)1<<13)
-#define ARCH_FEATURE_LOR ((uint64_t)1<<14)
-#define ARCH_FEATURE_LRCPC ((uint64_t)1<<15)
-#define ARCH_FEATURE_LRCPC2 ((uint64_t)1<<16)
-#define ARCH_FEATURE_LS64 ((uint64_t)1<<17)
-#define ARCH_FEATURE_LS64_V ((uint64_t)1<<18)
-#define ARCH_FEATURE_LSE ((uint64_t)1<<19)
-#define ARCH_FEATURE_MTE ((uint64_t)1<<20)
-#define ARCH_FEATURE_MTE2 ((uint64_t)1<<21)
-#define ARCH_FEATURE_PAuth ((uint64_t)1<<22)
-#define ARCH_FEATURE_RAS ((uint64_t)1<<23)
-#define ARCH_FEATURE_RDM ((uint64_t)1<<24)
-#define ARCH_FEATURE_SHA3 ((uint64_t)1<<25)
-#define ARCH_FEATURE_SHA512 ((uint64_t)1<<26)
-#define ARCH_FEATURE_SM3 ((uint64_t)1<<27)
-#define ARCH_FEATURE_SM4 ((uint64_t)1<<28)
-#define ARCH_FEATURE_SME ((uint64_t)1<<29)
-#define ARCH_FEATURE_SME_F64F64 ((uint64_t)1<<30)
-#define ARCH_FEATURE_SME_I16I64 ((uint64_t)1<<31)
-#define ARCH_FEATURE_SPE ((uint64_t)1<<32)
-#define ARCH_FEATURE_SVE_AES ((uint64_t)1<<33)
-#define ARCH_FEATURE_SVE_BitPerm ((uint64_t)1<<34)
-#define ARCH_FEATURE_SVE_SHA3 ((uint64_t)1<<35)
-#define ARCH_FEATURE_SVE_SM4 ((uint64_t)1<<36)
-#define ARCH_FEATURE_TME ((uint64_t)1<<37)
-#define ARCH_FEATURE_TRF ((uint64_t)1<<38)
-#define ARCH_FEATURE_WFxT ((uint64_t)1<<39)
-#define ARCH_FEATURE_XS ((uint64_t)1<<40)
+// 108 HaveXXX()/IsImplemented(FEAT_XXX) functions used by pcode:
+#define HaveFeature(feat) (ctx->pcode_features[(feat) / 64] & ((uint64_t)1 << ((feat) % 64)))
+#define HaveAES() HaveFeature(ARCH_FEATURE_AES)
+#define HaveAdvSIMD() HaveFeature(ARCH_FEATURE_AdvSIMD)
+#define HaveBF16() HaveFeature(ARCH_FEATURE_BF16)
+#define HaveBTI() HaveFeature(ARCH_FEATURE_BTI)
+#define HaveCHK() HaveFeature(ARCH_FEATURE_CHK)
+#define HaveCLRBHB() HaveFeature(ARCH_FEATURE_CLRBHB)
+#define HaveCMPBR() HaveFeature(ARCH_FEATURE_CMPBR)
+#define HaveCPA() HaveFeature(ARCH_FEATURE_CPA)
+#define HaveCRC32() HaveFeature(ARCH_FEATURE_CRC32)
+#define HaveCSSC() HaveFeature(ARCH_FEATURE_CSSC)
+#define HaveD128() HaveFeature(ARCH_FEATURE_D128)
+#define HaveDGH() HaveFeature(ARCH_FEATURE_DGH)
+#define HaveDIT() HaveFeature(ARCH_FEATURE_DIT)
+#define HaveDotProd() HaveFeature(ARCH_FEATURE_DotProd)
+#define HaveEBEP() HaveFeature(ARCH_FEATURE_EBEP)
+#define HaveF32MM() HaveFeature(ARCH_FEATURE_F32MM)
+#define HaveF64MM() HaveFeature(ARCH_FEATURE_F64MM)
+#define HaveF8F16MM() HaveFeature(ARCH_FEATURE_F8F16MM)
+#define HaveF8F32MM() HaveFeature(ARCH_FEATURE_F8F32MM)
+#define HaveFAMINMAX() HaveFeature(ARCH_FEATURE_FAMINMAX)
+#define HaveFCMA() HaveFeature(ARCH_FEATURE_FCMA)
+#define HaveFHM() HaveFeature(ARCH_FEATURE_FHM)
+#define HaveFP() HaveFeature(ARCH_FEATURE_FP)
+#define HaveFP16() HaveFeature(ARCH_FEATURE_FP16)
+#define HaveFP8() HaveFeature(ARCH_FEATURE_FP8)
+#define HaveFP8DOT2() HaveFeature(ARCH_FEATURE_FP8DOT2)
+#define HaveFP8DOT4() HaveFeature(ARCH_FEATURE_FP8DOT4)
+#define HaveFP8FMA() HaveFeature(ARCH_FEATURE_FP8FMA)
+#define HaveFPRCVT() HaveFeature(ARCH_FEATURE_FPRCVT)
+#define HaveFRINTTS() HaveFeature(ARCH_FEATURE_FRINTTS)
+#define HaveFlagM() HaveFeature(ARCH_FEATURE_FlagM)
+#define HaveFlagM2() HaveFeature(ARCH_FEATURE_FlagM2)
+#define HaveGCS() HaveFeature(ARCH_FEATURE_GCS)
+#define HaveHBC() HaveFeature(ARCH_FEATURE_HBC)
+#define HaveI8MM() HaveFeature(ARCH_FEATURE_I8MM)
+#define HaveJSCVT() HaveFeature(ARCH_FEATURE_JSCVT)
+#define HaveLOR() HaveFeature(ARCH_FEATURE_LOR)
+#define HaveLRCPC() HaveFeature(ARCH_FEATURE_LRCPC)
+#define HaveLRCPC2() HaveFeature(ARCH_FEATURE_LRCPC2)
+#define HaveLRCPC3() HaveFeature(ARCH_FEATURE_LRCPC3)
+#define HaveLS64() HaveFeature(ARCH_FEATURE_LS64)
+#define HaveLS64_ACCDATA() HaveFeature(ARCH_FEATURE_LS64_ACCDATA)
+#define HaveLS64_V() HaveFeature(ARCH_FEATURE_LS64_V)
+#define HaveLSE() HaveFeature(ARCH_FEATURE_LSE)
+#define HaveLSE128() HaveFeature(ARCH_FEATURE_LSE128)
+#define HaveLSFE() HaveFeature(ARCH_FEATURE_LSFE)
+#define HaveLSUI() HaveFeature(ARCH_FEATURE_LSUI)
+#define HaveLUT() HaveFeature(ARCH_FEATURE_LUT)
+#define HaveMOPS() HaveFeature(ARCH_FEATURE_MOPS)
+#define HaveMTE() HaveFeature(ARCH_FEATURE_MTE)
+#define HaveMTE2() HaveFeature(ARCH_FEATURE_MTE2)
+#define HaveNMI() HaveFeature(ARCH_FEATURE_NMI)
+#define HavePAN() HaveFeature(ARCH_FEATURE_PAN)
+#define HavePAuth() HaveFeature(ARCH_FEATURE_PAuth)
+#define HavePAuth_LR() HaveFeature(ARCH_FEATURE_PAuth_LR)
+#define HavePCDPHINT() HaveFeature(ARCH_FEATURE_PCDPHINT)
+#define HavePMULL() HaveFeature(ARCH_FEATURE_PMULL)
+#define HaveRAS() HaveFeature(ARCH_FEATURE_RAS)
+#define HaveRDM() HaveFeature(ARCH_FEATURE_RDM)
+#define HaveRPRFM() HaveFeature(ARCH_FEATURE_RPRFM)
+#define HaveSB() HaveFeature(ARCH_FEATURE_SB)
+#define HaveSHA1() HaveFeature(ARCH_FEATURE_SHA1)
+#define HaveSHA256() HaveFeature(ARCH_FEATURE_SHA256)
+#define HaveSHA3() HaveFeature(ARCH_FEATURE_SHA3)
+#define HaveSHA512() HaveFeature(ARCH_FEATURE_SHA512)
+#define HaveSM3() HaveFeature(ARCH_FEATURE_SM3)
+#define HaveSM4() HaveFeature(ARCH_FEATURE_SM4)
+#define HaveSME() HaveFeature(ARCH_FEATURE_SME)
+#define HaveSME2() HaveFeature(ARCH_FEATURE_SME2)
+#define HaveSME2p1() HaveFeature(ARCH_FEATURE_SME2p1)
+#define HaveSME2p2() HaveFeature(ARCH_FEATURE_SME2p2)
+#define HaveSME_B16B16() HaveFeature(ARCH_FEATURE_SME_B16B16)
+#define HaveSME_F16F16() HaveFeature(ARCH_FEATURE_SME_F16F16)
+#define HaveSME_F64F64() HaveFeature(ARCH_FEATURE_SME_F64F64)
+#define HaveSME_F8F16() HaveFeature(ARCH_FEATURE_SME_F8F16)
+#define HaveSME_F8F32() HaveFeature(ARCH_FEATURE_SME_F8F32)
+#define HaveSME_I16I64() HaveFeature(ARCH_FEATURE_SME_I16I64)
+#define HaveSME_LUTv2() HaveFeature(ARCH_FEATURE_SME_LUTv2)
+#define HaveSME_MOP4() HaveFeature(ARCH_FEATURE_SME_MOP4)
+#define HaveSME_TMOP() HaveFeature(ARCH_FEATURE_SME_TMOP)
+#define HaveSPE() HaveFeature(ARCH_FEATURE_SPE)
+#define HaveSSBS() HaveFeature(ARCH_FEATURE_SSBS)
+#define HaveSSVE_FEXPA() HaveFeature(ARCH_FEATURE_SSVE_FEXPA)
+#define HaveSVE() HaveFeature(ARCH_FEATURE_SVE)
+#define HaveSVE2() HaveFeature(ARCH_FEATURE_SVE2)
+#define HaveSVE2FP8DOT2() HaveFeature(ARCH_FEATURE_SVE2FP8DOT2)
+#define HaveSVE2FP8DOT4() HaveFeature(ARCH_FEATURE_SVE2FP8DOT4)
+#define HaveSVE2FP8FMA() HaveFeature(ARCH_FEATURE_SVE2FP8FMA)
+#define HaveSVE2p1() HaveFeature(ARCH_FEATURE_SVE2p1)
+#define HaveSVE2p2() HaveFeature(ARCH_FEATURE_SVE2p2)
+#define HaveSVE_AES() HaveFeature(ARCH_FEATURE_SVE_AES)
+#define HaveSVE_AES2() HaveFeature(ARCH_FEATURE_SVE_AES2)
+#define HaveSVE_B16B16() HaveFeature(ARCH_FEATURE_SVE_B16B16)
+#define HaveSVE_BFSCALE() HaveFeature(ARCH_FEATURE_SVE_BFSCALE)
+#define HaveSVE_BitPerm() HaveFeature(ARCH_FEATURE_SVE_BitPerm)
+#define HaveSVE_F16F32MM() HaveFeature(ARCH_FEATURE_SVE_F16F32MM)
+#define HaveSVE_PMULL128() HaveFeature(ARCH_FEATURE_SVE_PMULL128)
+#define HaveSVE_SHA3() HaveFeature(ARCH_FEATURE_SVE_SHA3)
+#define HaveSVE_SM4() HaveFeature(ARCH_FEATURE_SVE_SM4)
+#define HaveSYSINSTR128() HaveFeature(ARCH_FEATURE_SYSINSTR128)
+#define HaveSYSREG128() HaveFeature(ARCH_FEATURE_SYSREG128)
+#define HaveTHE() HaveFeature(ARCH_FEATURE_THE)
+#define HaveTME() HaveFeature(ARCH_FEATURE_TME)
+#define HaveTRF() HaveFeature(ARCH_FEATURE_TRF)
+#define HaveUAO() HaveFeature(ARCH_FEATURE_UAO)
+#define HaveVHE() HaveFeature(ARCH_FEATURE_VHE)
+#define HaveWFxT() HaveFeature(ARCH_FEATURE_WFxT)
+#define HaveXS() HaveFeature(ARCH_FEATURE_XS)
-// defines for features referenced by pcode
-#define ARCH_FEATURE_AESExt ((uint64_t)1<<0)
-#define ARCH_FEATURE_AtomicExt ((uint64_t)1<<1)
-#define ARCH_FEATURE_BF16Ext ((uint64_t)1<<2)
-#define ARCH_FEATURE_BTIExt ((uint64_t)1<<3)
-#define ARCH_FEATURE_Bit128PMULLExt ((uint64_t)1<<4)
-#define ARCH_FEATURE_CRCExt ((uint64_t)1<<5)
-#define ARCH_FEATURE_DGHExt ((uint64_t)1<<6)
-#define ARCH_FEATURE_DITExt ((uint64_t)1<<7)
-#define ARCH_FEATURE_DOTPExt ((uint64_t)1<<8)
-#define ARCH_FEATURE_FCADDExt ((uint64_t)1<<9)
-#define ARCH_FEATURE_FJCVTZSExt ((uint64_t)1<<10)
-#define ARCH_FEATURE_FP16Ext ((uint64_t)1<<11)
-#define ARCH_FEATURE_FP16MulNoRoundingToFP32Ext ((uint64_t)1<<12)
-#define ARCH_FEATURE_FeatLS64 ((uint64_t)1<<13)
-#define ARCH_FEATURE_FeatWFxT ((uint64_t)1<<14)
-#define ARCH_FEATURE_FeatXS ((uint64_t)1<<15)
-#define ARCH_FEATURE_FlagFormatExt ((uint64_t)1<<16)
-#define ARCH_FEATURE_FlagManipulateExt ((uint64_t)1<<17)
-#define ARCH_FEATURE_FrintExt ((uint64_t)1<<18)
-#define ARCH_FEATURE_Int8MatMulExt ((uint64_t)1<<19)
-#define ARCH_FEATURE_MTE2Ext ((uint64_t)1<<20)
-#define ARCH_FEATURE_MTEExt ((uint64_t)1<<21)
-#define ARCH_FEATURE_NVExt ((uint64_t)1<<22)
-#define ARCH_FEATURE_PACExt ((uint64_t)1<<23)
-#define ARCH_FEATURE_PANExt ((uint64_t)1<<24)
-#define ARCH_FEATURE_QRDMLAHExt ((uint64_t)1<<25)
-#define ARCH_FEATURE_RASExt ((uint64_t)1<<26)
-#define ARCH_FEATURE_SBExt ((uint64_t)1<<27)
-#define ARCH_FEATURE_SHA1Ext ((uint64_t)1<<28)
-#define ARCH_FEATURE_SHA256Ext ((uint64_t)1<<29)
-#define ARCH_FEATURE_SHA3Ext ((uint64_t)1<<30)
-#define ARCH_FEATURE_SHA512Ext ((uint64_t)1<<31)
-#define ARCH_FEATURE_SM3Ext ((uint64_t)1<<32)
-#define ARCH_FEATURE_SM4Ext ((uint64_t)1<<33)
-//#define ARCH_FEATURE_SME ((uint64_t)1<<34)
-#define ARCH_FEATURE_SMEF64F64 ((uint64_t)1<<35)
-#define ARCH_FEATURE_SMEI16I64 ((uint64_t)1<<36)
-#define ARCH_FEATURE_SSBSExt ((uint64_t)1<<37)
-#define ARCH_FEATURE_SVE ((uint64_t)1<<38)
-#define ARCH_FEATURE_SVE2 ((uint64_t)1<<39)
-#define ARCH_FEATURE_SVE2AES ((uint64_t)1<<40)
-#define ARCH_FEATURE_SVE2BitPerm ((uint64_t)1<<41)
-#define ARCH_FEATURE_SVE2PMULL128 ((uint64_t)1<<42)
-#define ARCH_FEATURE_SVE2SHA3 ((uint64_t)1<<43)
-#define ARCH_FEATURE_SVE2SM4 ((uint64_t)1<<44)
-#define ARCH_FEATURE_SVEFP32MatMulExt ((uint64_t)1<<45)
-#define ARCH_FEATURE_SVEFP64MatMulExt ((uint64_t)1<<46)
-#define ARCH_FEATURE_SelfHostedTrace ((uint64_t)1<<47)
-#define ARCH_FEATURE_StatisticalProfiling ((uint64_t)1<<48)
-//#define ARCH_FEATURE_TME ((uint64_t)1<<49)
-#define ARCH_FEATURE_UAOExt ((uint64_t)1<<50)
-#define ARCH_FEATURE_VirtHostExt ((uint64_t)1<<51)
+#define ARCH_FEATURE_AES 0 // Referenced by decode and pcode
+#define ARCH_FEATURE_AdvSIMD 1 // Referenced by decode and pcode
+#define ARCH_FEATURE_BF16 2 // Referenced by decode and pcode
+#define ARCH_FEATURE_BTI 3 // Referenced by decode and pcode
+#define ARCH_FEATURE_CHK 4 // Referenced by decode and pcode
+#define ARCH_FEATURE_CLRBHB 5 // Referenced by decode and pcode
+#define ARCH_FEATURE_CMPBR 6 // Referenced by decode and pcode
+#define ARCH_FEATURE_CPA 7 // Referenced by decode and pcode
+#define ARCH_FEATURE_CRC32 8 // Referenced by decode and pcode
+#define ARCH_FEATURE_CSSC 9 // Referenced by decode and pcode
+#define ARCH_FEATURE_D128 10 // Referenced by decode and pcode
+#define ARCH_FEATURE_DGH 11 // Referenced by decode and pcode
+#define ARCH_FEATURE_DIT 12 // Referenced by pcode
+#define ARCH_FEATURE_DotProd 13 // Referenced by decode and pcode
+#define ARCH_FEATURE_EBEP 14 // Referenced by pcode
+#define ARCH_FEATURE_F32MM 15 // Referenced by decode and pcode
+#define ARCH_FEATURE_F64MM 16 // Referenced by decode and pcode
+#define ARCH_FEATURE_F8F16MM 17 // Referenced by decode and pcode
+#define ARCH_FEATURE_F8F32MM 18 // Referenced by decode and pcode
+#define ARCH_FEATURE_FAMINMAX 19 // Referenced by decode and pcode
+#define ARCH_FEATURE_FCMA 20 // Referenced by decode and pcode
+#define ARCH_FEATURE_FHM 21 // Referenced by decode and pcode
+#define ARCH_FEATURE_FP 22 // Referenced by decode and pcode
+#define ARCH_FEATURE_FP16 23 // Referenced by decode and pcode
+#define ARCH_FEATURE_FP8 24 // Referenced by decode and pcode
+#define ARCH_FEATURE_FP8DOT2 25 // Referenced by decode and pcode
+#define ARCH_FEATURE_FP8DOT4 26 // Referenced by decode and pcode
+#define ARCH_FEATURE_FP8FMA 27 // Referenced by decode and pcode
+#define ARCH_FEATURE_FPRCVT 28 // Referenced by decode and pcode
+#define ARCH_FEATURE_FRINTTS 29 // Referenced by decode and pcode
+#define ARCH_FEATURE_FlagM 30 // Referenced by decode and pcode
+#define ARCH_FEATURE_FlagM2 31 // Referenced by decode and pcode
+#define ARCH_FEATURE_GCS 32 // Referenced by decode and pcode
+#define ARCH_FEATURE_HBC 33 // Referenced by decode and pcode
+#define ARCH_FEATURE_I8MM 34 // Referenced by decode and pcode
+#define ARCH_FEATURE_JSCVT 35 // Referenced by decode and pcode
+#define ARCH_FEATURE_LOR 36 // Referenced by decode and pcode
+#define ARCH_FEATURE_LRCPC 37 // Referenced by decode and pcode
+#define ARCH_FEATURE_LRCPC2 38 // Referenced by decode and pcode
+#define ARCH_FEATURE_LRCPC3 39 // Referenced by decode and pcode
+#define ARCH_FEATURE_LS64 40 // Referenced by decode and pcode
+#define ARCH_FEATURE_LS64_ACCDATA 41 // Referenced by decode and pcode
+#define ARCH_FEATURE_LS64_V 42 // Referenced by decode and pcode
+#define ARCH_FEATURE_LSE 43 // Referenced by decode and pcode
+#define ARCH_FEATURE_LSE128 44 // Referenced by decode and pcode
+#define ARCH_FEATURE_LSFE 45 // Referenced by decode and pcode
+#define ARCH_FEATURE_LSUI 46 // Referenced by decode and pcode
+#define ARCH_FEATURE_LUT 47 // Referenced by decode and pcode
+#define ARCH_FEATURE_MOPS 48 // Referenced by decode and pcode
+#define ARCH_FEATURE_MTE 49 // Referenced by decode and pcode
+#define ARCH_FEATURE_MTE2 50 // Referenced by decode and pcode
+#define ARCH_FEATURE_NMI 51 // Referenced by pcode
+#define ARCH_FEATURE_PAN 52 // Referenced by pcode
+#define ARCH_FEATURE_PAuth 53 // Referenced by decode and pcode
+#define ARCH_FEATURE_PAuth_LR 54 // Referenced by decode and pcode
+#define ARCH_FEATURE_PCDPHINT 55 // Referenced by decode and pcode
+#define ARCH_FEATURE_PMULL 56 // Referenced by pcode
+#define ARCH_FEATURE_RAS 57 // Referenced by decode and pcode
+#define ARCH_FEATURE_RDM 58 // Referenced by decode and pcode
+#define ARCH_FEATURE_RPRFM 59 // Referenced by decode and pcode
+#define ARCH_FEATURE_SB 60 // Referenced by decode and pcode
+#define ARCH_FEATURE_SHA1 61 // Referenced by decode and pcode
+#define ARCH_FEATURE_SHA256 62 // Referenced by decode and pcode
+#define ARCH_FEATURE_SHA3 63 // Referenced by decode and pcode
+#define ARCH_FEATURE_SHA512 64 // Referenced by decode and pcode
+#define ARCH_FEATURE_SM3 65 // Referenced by decode and pcode
+#define ARCH_FEATURE_SM4 66 // Referenced by decode and pcode
+#define ARCH_FEATURE_SME 67 // Referenced by decode and pcode
+#define ARCH_FEATURE_SME2 68 // Referenced by decode and pcode
+#define ARCH_FEATURE_SME2p1 69 // Referenced by decode and pcode
+#define ARCH_FEATURE_SME2p2 70 // Referenced by decode and pcode
+#define ARCH_FEATURE_SME_B16B16 71 // Referenced by decode and pcode
+#define ARCH_FEATURE_SME_F16F16 72 // Referenced by decode and pcode
+#define ARCH_FEATURE_SME_F64F64 73 // Referenced by decode and pcode
+#define ARCH_FEATURE_SME_F8F16 74 // Referenced by decode and pcode
+#define ARCH_FEATURE_SME_F8F32 75 // Referenced by decode and pcode
+#define ARCH_FEATURE_SME_I16I64 76 // Referenced by decode and pcode
+#define ARCH_FEATURE_SME_LUTv2 77 // Referenced by decode and pcode
+#define ARCH_FEATURE_SME_MOP4 78 // Referenced by decode and pcode
+#define ARCH_FEATURE_SME_TMOP 79 // Referenced by decode and pcode
+#define ARCH_FEATURE_SPE 80 // Referenced by decode and pcode
+#define ARCH_FEATURE_SSBS 81 // Referenced by pcode
+#define ARCH_FEATURE_SSVE_FEXPA 82 // Referenced by decode and pcode
+#define ARCH_FEATURE_SSVE_FP8DOT2 83 // Referenced by decode
+#define ARCH_FEATURE_SSVE_FP8DOT4 84 // Referenced by decode
+#define ARCH_FEATURE_SSVE_FP8FMA 85 // Referenced by decode
+#define ARCH_FEATURE_SVE 86 // Referenced by decode and pcode
+#define ARCH_FEATURE_SVE2 87 // Referenced by decode and pcode
+#define ARCH_FEATURE_SVE2FP8DOT2 88 // Referenced by pcode
+#define ARCH_FEATURE_SVE2FP8DOT4 89 // Referenced by pcode
+#define ARCH_FEATURE_SVE2FP8FMA 90 // Referenced by pcode
+#define ARCH_FEATURE_SVE2p1 91 // Referenced by decode and pcode
+#define ARCH_FEATURE_SVE2p2 92 // Referenced by decode and pcode
+#define ARCH_FEATURE_SVE_AES 93 // Referenced by decode and pcode
+#define ARCH_FEATURE_SVE_AES2 94 // Referenced by decode and pcode
+#define ARCH_FEATURE_SVE_B16B16 95 // Referenced by decode and pcode
+#define ARCH_FEATURE_SVE_BFSCALE 96 // Referenced by decode and pcode
+#define ARCH_FEATURE_SVE_BitPerm 97 // Referenced by decode and pcode
+#define ARCH_FEATURE_SVE_F16F32MM 98 // Referenced by decode and pcode
+#define ARCH_FEATURE_SVE_PMULL128 99 // Referenced by decode and pcode
+#define ARCH_FEATURE_SVE_SHA3 100 // Referenced by decode and pcode
+#define ARCH_FEATURE_SVE_SM4 101 // Referenced by decode and pcode
+#define ARCH_FEATURE_SYSINSTR128 102 // Referenced by decode and pcode
+#define ARCH_FEATURE_SYSREG128 103 // Referenced by decode and pcode
+#define ARCH_FEATURE_THE 104 // Referenced by decode and pcode
+#define ARCH_FEATURE_TME 105 // Referenced by decode and pcode
+#define ARCH_FEATURE_TRF 106 // Referenced by decode and pcode
+#define ARCH_FEATURE_UAO 107 // Referenced by pcode
+#define ARCH_FEATURE_VHE 108 // Referenced by pcode
+#define ARCH_FEATURE_WFxT 109 // Referenced by decode and pcode
+#define ARCH_FEATURE_XS 110 // Referenced by decode and pcode
-#define ARCH_FEATURES_ALL 0xFFFFFFFFFFFFFFFF
+#define ARCH_FEATURES_ENABLE_ALL(feature_field) do { \
+ _Static_assert(sizeof(feature_field) * 8 > ARCH_FEATURE_XS, "Feature field too small for largest feature value"); \
+ memset((feature_field), 0xFF, sizeof(feature_field)); \
+ } while(0)
+