1//! Aarch64 run-time features.
23#[doc = r" Check for the presence of a CPU feature at runtime."]
#[doc = r""]
#[doc =
r" When the feature is known to be enabled at compile time (e.g. via `-Ctarget-feature`)"]
#[doc = r" the macro expands to `true`."]
#[doc = r""]
#[doc =
r" This macro takes one argument which is a string literal of the feature being tested for."]
#[doc =
r" The feature names are mostly taken from their FEAT_* definitions in the [ARM Architecture"]
#[doc = r" Reference Manual][docs]."]
#[doc = r""]
#[doc =
r" Currently most features are only supported on linux-based platforms: on other platforms the"]
#[doc = r" runtime check will always return `false`."]
#[doc = r""]
#[doc = r" ## Supported arguments"]
#[doc = r""]
#[doc = r#" * `"aes"` - FEAT_AES & FEAT_PMULL"#]
#[doc = r#" * `"asimd"` or "neon" - FEAT_AdvSIMD"#]
#[doc = r#" * `"bf16"` - FEAT_BF16"#]
#[doc = r#" * `"bti"` - FEAT_BTI"#]
#[doc = r#" * `"crc"` - FEAT_CRC"#]
#[doc = r#" * `"cssc"` - FEAT_CSSC"#]
#[doc = r#" * `"dit"` - FEAT_DIT"#]
#[doc = r#" * `"dotprod"` - FEAT_DotProd"#]
#[doc = r#" * `"dpb"` - FEAT_DPB"#]
#[doc = r#" * `"dpb2"` - FEAT_DPB2"#]
#[doc = r#" * `"ecv"` - FEAT_ECV"#]
#[doc = r#" * `"f32mm"` - FEAT_F32MM"#]
#[doc = r#" * `"f64mm"` - FEAT_F64MM"#]
#[doc = r#" * `"faminmax"` - FEAT_FAMINMAX"#]
#[doc = r#" * `"fcma"` - FEAT_FCMA"#]
#[doc = r#" * `"fhm"` - FEAT_FHM"#]
#[doc = r#" * `"flagm"` - FEAT_FLAGM"#]
#[doc = r#" * `"flagm2"` - FEAT_FLAGM2"#]
#[doc = r#" * `"fp"` - FEAT_FP"#]
#[doc = r#" * `"fp16"` - FEAT_FP16"#]
#[doc = r#" * `"fp8"` - FEAT_FP8"#]
#[doc = r#" * `"fp8dot2"` - FEAT_FP8DOT2"#]
#[doc = r#" * `"fp8dot4"` - FEAT_FP8DOT4"#]
#[doc = r#" * `"fp8fma"` - FEAT_FP8FMA"#]
#[doc = r#" * `"fpmr"` - FEAT_FPMR"#]
#[doc = r#" * `"frintts"` - FEAT_FRINTTS"#]
#[doc = r#" * `"hbc"` - FEAT_HBC"#]
#[doc = r#" * `"i8mm"` - FEAT_I8MM"#]
#[doc = r#" * `"jsconv"` - FEAT_JSCVT"#]
#[doc = r#" * `"lse"` - FEAT_LSE"#]
#[doc = r#" * `"lse128"` - FEAT_LSE128"#]
#[doc = r#" * `"lse2"` - FEAT_LSE2"#]
#[doc = r#" * `"lut"` - FEAT_LUT"#]
#[doc = r#" * `"mops"` - FEAT_MOPS"#]
#[doc = r#" * `"mte"` - FEAT_MTE & FEAT_MTE2"#]
#[doc = r#" * `"paca"` - FEAT_PAuth (address authentication)"#]
#[doc = r#" * `"pacg"` - FEAT_Pauth (generic authentication)"#]
#[doc = r#" * `"pauth-lr"` - FEAT_PAuth_LR"#]
#[doc = r#" * `"pmull"` - FEAT_PMULL"#]
#[doc = r#" * `"rand"` - FEAT_RNG"#]
#[doc = r#" * `"rcpc"` - FEAT_LRCPC"#]
#[doc = r#" * `"rcpc2"` - FEAT_LRCPC2"#]
#[doc = r#" * `"rcpc3"` - FEAT_LRCPC3"#]
#[doc = r#" * `"rdm"` - FEAT_RDM"#]
#[doc = r#" * `"sb"` - FEAT_SB"#]
#[doc = r#" * `"sha2"` - FEAT_SHA1 & FEAT_SHA256"#]
#[doc = r#" * `"sha3"` - FEAT_SHA512 & FEAT_SHA3"#]
#[doc = r#" * `"sm4"` - FEAT_SM3 & FEAT_SM4"#]
#[doc = r#" * `"sme"` - FEAT_SME"#]
#[doc = r#" * `"sme-b16b16"` - FEAT_SME_B16B16"#]
#[doc = r#" * `"sme-f16f16"` - FEAT_SME_F16F16"#]
#[doc = r#" * `"sme-f64f64"` - FEAT_SME_F64F64"#]
#[doc = r#" * `"sme-f8f16"` - FEAT_SME_F8F16"#]
#[doc = r#" * `"sme-f8f32"` - FEAT_SME_F8F32"#]
#[doc = r#" * `"sme-fa64"` - FEAT_SME_FA64"#]
#[doc = r#" * `"sme-i16i64"` - FEAT_SME_I16I64"#]
#[doc = r#" * `"sme-lutv2"` - FEAT_SME_LUTv2"#]
#[doc = r#" * `"sme2"` - FEAT_SME2"#]
#[doc = r#" * `"sme2p1"` - FEAT_SME2p1"#]
#[doc = r#" * `"ssbs"` - FEAT_SSBS & FEAT_SSBS2"#]
#[doc = r#" * `"ssve-fp8dot2"` - FEAT_SSVE_FP8DOT2"#]
#[doc = r#" * `"ssve-fp8dot4"` - FEAT_SSVE_FP8DOT4"#]
#[doc = r#" * `"ssve-fp8fma"` - FEAT_SSVE_FP8FMA"#]
#[doc = r#" * `"sve"` - FEAT_SVE"#]
#[doc =
r#" * `"sve-b16b16"` - FEAT_SVE_B16B16 (SVE or SME Z-targeting instructions)"#]
#[doc = r#" * `"sve2"` - FEAT_SVE2"#]
#[doc =
r#" * `"sve2-aes"` - FEAT_SVE_AES & FEAT_SVE_PMULL128 (SVE2 AES crypto)"#]
#[doc = r#" * `"sve2-bitperm"` - FEAT_SVE2_BitPerm"#]
#[doc = r#" * `"sve2-sha3"` - FEAT_SVE2_SHA3"#]
#[doc = r#" * `"sve2-sm4"` - FEAT_SVE2_SM4"#]
#[doc = r#" * `"sve2p1"` - FEAT_SVE2p1"#]
#[doc = r#" * `"tme"` - FEAT_TME"#]
#[doc = r#" * `"wfxt"` - FEAT_WFxT"#]
#[doc = r""]
#[doc = r" [docs]: https://developer.arm.com/documentation/ddi0487/latest"]
#[stable(feature = "simd_aarch64", since = "1.60.0")]
#[macro_export]
macro_rules! is_aarch64_feature_detected {
("neon") =>
{
compile_error!
(concat!
(r#"This macro cannot be used on the current target.
You can prevent it from being used in other architectures by
guarding it behind a cfg("#,
stringify! (any(target_arch = "aarch64", target_arch = "arm64ec")),
")."))
}; ("pmull") =>
{
compile_error!
(concat!
(r#"This macro cannot be used on the current target.
You can prevent it from being used in other architectures by
guarding it behind a cfg("#,
stringify! (any(target_arch = "aarch64", target_arch = "arm64ec")),
")."))
}; ("fp") =>
{
compile_error!
(concat!
(r#"This macro cannot be used on the current target.
You can prevent it from being used in other architectures by
guarding it behind a cfg("#,
stringify! (any(target_arch = "aarch64", target_arch = "arm64ec")),
")."))
}; ("aes") =>
{
compile_error!
(concat!
(r#"This macro cannot be used on the current target.
You can prevent it from being used in other architectures by
guarding it behind a cfg("#,
stringify! (any(target_arch = "aarch64", target_arch = "arm64ec")),
")."))
}; ("bf16") =>
{
compile_error!
(concat!
(r#"This macro cannot be used on the current target.
You can prevent it from being used in other architectures by
guarding it behind a cfg("#,
stringify! (any(target_arch = "aarch64", target_arch = "arm64ec")),
")."))
}; ("bti") =>
{
compile_error!
(concat!
(r#"This macro cannot be used on the current target.
You can prevent it from being used in other architectures by
guarding it behind a cfg("#,
stringify! (any(target_arch = "aarch64", target_arch = "arm64ec")),
")."))
}; ("crc") =>
{
compile_error!
(concat!
(r#"This macro cannot be used on the current target.
You can prevent it from being used in other architectures by
guarding it behind a cfg("#,
stringify! (any(target_arch = "aarch64", target_arch = "arm64ec")),
")."))
}; ("cssc") =>
{
compile_error!
(concat!
(r#"This macro cannot be used on the current target.
You can prevent it from being used in other architectures by
guarding it behind a cfg("#,
stringify! (any(target_arch = "aarch64", target_arch = "arm64ec")),
")."))
}; ("dit") =>
{
compile_error!
(concat!
(r#"This macro cannot be used on the current target.
You can prevent it from being used in other architectures by
guarding it behind a cfg("#,
stringify! (any(target_arch = "aarch64", target_arch = "arm64ec")),
")."))
}; ("dpb") =>
{
compile_error!
(concat!
(r#"This macro cannot be used on the current target.
You can prevent it from being used in other architectures by
guarding it behind a cfg("#,
stringify! (any(target_arch = "aarch64", target_arch = "arm64ec")),
")."))
}; ("dpb2") =>
{
compile_error!
(concat!
(r#"This macro cannot be used on the current target.
You can prevent it from being used in other architectures by
guarding it behind a cfg("#,
stringify! (any(target_arch = "aarch64", target_arch = "arm64ec")),
")."))
}; ("dotprod") =>
{
compile_error!
(concat!
(r#"This macro cannot be used on the current target.
You can prevent it from being used in other architectures by
guarding it behind a cfg("#,
stringify! (any(target_arch = "aarch64", target_arch = "arm64ec")),
")."))
}; ("ecv") =>
{
compile_error!
(concat!
(r#"This macro cannot be used on the current target.
You can prevent it from being used in other architectures by
guarding it behind a cfg("#,
stringify! (any(target_arch = "aarch64", target_arch = "arm64ec")),
")."))
}; ("f32mm") =>
{
compile_error!
(concat!
(r#"This macro cannot be used on the current target.
You can prevent it from being used in other architectures by
guarding it behind a cfg("#,
stringify! (any(target_arch = "aarch64", target_arch = "arm64ec")),
")."))
}; ("f64mm") =>
{
compile_error!
(concat!
(r#"This macro cannot be used on the current target.
You can prevent it from being used in other architectures by
guarding it behind a cfg("#,
stringify! (any(target_arch = "aarch64", target_arch = "arm64ec")),
")."))
}; ("faminmax") =>
{
compile_error!
(concat!
(r#"This macro cannot be used on the current target.
You can prevent it from being used in other architectures by
guarding it behind a cfg("#,
stringify! (any(target_arch = "aarch64", target_arch = "arm64ec")),
")."))
}; ("fcma") =>
{
compile_error!
(concat!
(r#"This macro cannot be used on the current target.
You can prevent it from being used in other architectures by
guarding it behind a cfg("#,
stringify! (any(target_arch = "aarch64", target_arch = "arm64ec")),
")."))
}; ("fhm") =>
{
compile_error!
(concat!
(r#"This macro cannot be used on the current target.
You can prevent it from being used in other architectures by
guarding it behind a cfg("#,
stringify! (any(target_arch = "aarch64", target_arch = "arm64ec")),
")."))
}; ("flagm") =>
{
compile_error!
(concat!
(r#"This macro cannot be used on the current target.
You can prevent it from being used in other architectures by
guarding it behind a cfg("#,
stringify! (any(target_arch = "aarch64", target_arch = "arm64ec")),
")."))
}; ("flagm2") =>
{
compile_error!
(concat!
(r#"This macro cannot be used on the current target.
You can prevent it from being used in other architectures by
guarding it behind a cfg("#,
stringify! (any(target_arch = "aarch64", target_arch = "arm64ec")),
")."))
}; ("fp16") =>
{
compile_error!
(concat!
(r#"This macro cannot be used on the current target.
You can prevent it from being used in other architectures by
guarding it behind a cfg("#,
stringify! (any(target_arch = "aarch64", target_arch = "arm64ec")),
")."))
}; ("fp8") =>
{
compile_error!
(concat!
(r#"This macro cannot be used on the current target.
You can prevent it from being used in other architectures by
guarding it behind a cfg("#,
stringify! (any(target_arch = "aarch64", target_arch = "arm64ec")),
")."))
}; ("fp8dot2") =>
{
compile_error!
(concat!
(r#"This macro cannot be used on the current target.
You can prevent it from being used in other architectures by
guarding it behind a cfg("#,
stringify! (any(target_arch = "aarch64", target_arch = "arm64ec")),
")."))
}; ("fp8dot4") =>
{
compile_error!
(concat!
(r#"This macro cannot be used on the current target.
You can prevent it from being used in other architectures by
guarding it behind a cfg("#,
stringify! (any(target_arch = "aarch64", target_arch = "arm64ec")),
")."))
}; ("fp8fma") =>
{
compile_error!
(concat!
(r#"This macro cannot be used on the current target.
You can prevent it from being used in other architectures by
guarding it behind a cfg("#,
stringify! (any(target_arch = "aarch64", target_arch = "arm64ec")),
")."))
}; ("fpmr") =>
{
compile_error!
(concat!
(r#"This macro cannot be used on the current target.
You can prevent it from being used in other architectures by
guarding it behind a cfg("#,
stringify! (any(target_arch = "aarch64", target_arch = "arm64ec")),
")."))
}; ("frintts") =>
{
compile_error!
(concat!
(r#"This macro cannot be used on the current target.
You can prevent it from being used in other architectures by
guarding it behind a cfg("#,
stringify! (any(target_arch = "aarch64", target_arch = "arm64ec")),
")."))
}; ("hbc") =>
{
compile_error!
(concat!
(r#"This macro cannot be used on the current target.
You can prevent it from being used in other architectures by
guarding it behind a cfg("#,
stringify! (any(target_arch = "aarch64", target_arch = "arm64ec")),
")."))
}; ("i8mm") =>
{
compile_error!
(concat!
(r#"This macro cannot be used on the current target.
You can prevent it from being used in other architectures by
guarding it behind a cfg("#,
stringify! (any(target_arch = "aarch64", target_arch = "arm64ec")),
")."))
}; ("jsconv") =>
{
compile_error!
(concat!
(r#"This macro cannot be used on the current target.
You can prevent it from being used in other architectures by
guarding it behind a cfg("#,
stringify! (any(target_arch = "aarch64", target_arch = "arm64ec")),
")."))
}; ("lse") =>
{
compile_error!
(concat!
(r#"This macro cannot be used on the current target.
You can prevent it from being used in other architectures by
guarding it behind a cfg("#,
stringify! (any(target_arch = "aarch64", target_arch = "arm64ec")),
")."))
}; ("lse128") =>
{
compile_error!
(concat!
(r#"This macro cannot be used on the current target.
You can prevent it from being used in other architectures by
guarding it behind a cfg("#,
stringify! (any(target_arch = "aarch64", target_arch = "arm64ec")),
")."))
}; ("lse2") =>
{
compile_error!
(concat!
(r#"This macro cannot be used on the current target.
You can prevent it from being used in other architectures by
guarding it behind a cfg("#,
stringify! (any(target_arch = "aarch64", target_arch = "arm64ec")),
")."))
}; ("lut") =>
{
compile_error!
(concat!
(r#"This macro cannot be used on the current target.
You can prevent it from being used in other architectures by
guarding it behind a cfg("#,
stringify! (any(target_arch = "aarch64", target_arch = "arm64ec")),
")."))
}; ("mops") =>
{
compile_error!
(concat!
(r#"This macro cannot be used on the current target.
You can prevent it from being used in other architectures by
guarding it behind a cfg("#,
stringify! (any(target_arch = "aarch64", target_arch = "arm64ec")),
")."))
}; ("mte") =>
{
compile_error!
(concat!
(r#"This macro cannot be used on the current target.
You can prevent it from being used in other architectures by
guarding it behind a cfg("#,
stringify! (any(target_arch = "aarch64", target_arch = "arm64ec")),
")."))
}; ("paca") =>
{
compile_error!
(concat!
(r#"This macro cannot be used on the current target.
You can prevent it from being used in other architectures by
guarding it behind a cfg("#,
stringify! (any(target_arch = "aarch64", target_arch = "arm64ec")),
")."))
}; ("pacg") =>
{
compile_error!
(concat!
(r#"This macro cannot be used on the current target.
You can prevent it from being used in other architectures by
guarding it behind a cfg("#,
stringify! (any(target_arch = "aarch64", target_arch = "arm64ec")),
")."))
}; ("pauth-lr") =>
{
compile_error!
(concat!
(r#"This macro cannot be used on the current target.
You can prevent it from being used in other architectures by
guarding it behind a cfg("#,
stringify! (any(target_arch = "aarch64", target_arch = "arm64ec")),
")."))
}; ("rand") =>
{
compile_error!
(concat!
(r#"This macro cannot be used on the current target.
You can prevent it from being used in other architectures by
guarding it behind a cfg("#,
stringify! (any(target_arch = "aarch64", target_arch = "arm64ec")),
")."))
}; ("rcpc") =>
{
compile_error!
(concat!
(r#"This macro cannot be used on the current target.
You can prevent it from being used in other architectures by
guarding it behind a cfg("#,
stringify! (any(target_arch = "aarch64", target_arch = "arm64ec")),
")."))
}; ("rcpc2") =>
{
compile_error!
(concat!
(r#"This macro cannot be used on the current target.
You can prevent it from being used in other architectures by
guarding it behind a cfg("#,
stringify! (any(target_arch = "aarch64", target_arch = "arm64ec")),
")."))
}; ("rcpc3") =>
{
compile_error!
(concat!
(r#"This macro cannot be used on the current target.
You can prevent it from being used in other architectures by
guarding it behind a cfg("#,
stringify! (any(target_arch = "aarch64", target_arch = "arm64ec")),
")."))
}; ("rdm") =>
{
compile_error!
(concat!
(r#"This macro cannot be used on the current target.
You can prevent it from being used in other architectures by
guarding it behind a cfg("#,
stringify! (any(target_arch = "aarch64", target_arch = "arm64ec")),
")."))
}; ("sb") =>
{
compile_error!
(concat!
(r#"This macro cannot be used on the current target.
You can prevent it from being used in other architectures by
guarding it behind a cfg("#,
stringify! (any(target_arch = "aarch64", target_arch = "arm64ec")),
")."))
}; ("sha2") =>
{
compile_error!
(concat!
(r#"This macro cannot be used on the current target.
You can prevent it from being used in other architectures by
guarding it behind a cfg("#,
stringify! (any(target_arch = "aarch64", target_arch = "arm64ec")),
")."))
}; ("sha3") =>
{
compile_error!
(concat!
(r#"This macro cannot be used on the current target.
You can prevent it from being used in other architectures by
guarding it behind a cfg("#,
stringify! (any(target_arch = "aarch64", target_arch = "arm64ec")),
")."))
}; ("sm4") =>
{
compile_error!
(concat!
(r#"This macro cannot be used on the current target.
You can prevent it from being used in other architectures by
guarding it behind a cfg("#,
stringify! (any(target_arch = "aarch64", target_arch = "arm64ec")),
")."))
}; ("sme") =>
{
compile_error!
(concat!
(r#"This macro cannot be used on the current target.
You can prevent it from being used in other architectures by
guarding it behind a cfg("#,
stringify! (any(target_arch = "aarch64", target_arch = "arm64ec")),
")."))
}; ("sme2") =>
{
compile_error!
(concat!
(r#"This macro cannot be used on the current target.
You can prevent it from being used in other architectures by
guarding it behind a cfg("#,
stringify! (any(target_arch = "aarch64", target_arch = "arm64ec")),
")."))
}; ("sme2p1") =>
{
compile_error!
(concat!
(r#"This macro cannot be used on the current target.
You can prevent it from being used in other architectures by
guarding it behind a cfg("#,
stringify! (any(target_arch = "aarch64", target_arch = "arm64ec")),
")."))
}; ("sme-b16b16") =>
{
compile_error!
(concat!
(r#"This macro cannot be used on the current target.
You can prevent it from being used in other architectures by
guarding it behind a cfg("#,
stringify! (any(target_arch = "aarch64", target_arch = "arm64ec")),
")."))
}; ("sme-f16f16") =>
{
compile_error!
(concat!
(r#"This macro cannot be used on the current target.
You can prevent it from being used in other architectures by
guarding it behind a cfg("#,
stringify! (any(target_arch = "aarch64", target_arch = "arm64ec")),
")."))
}; ("sme-f64f64") =>
{
compile_error!
(concat!
(r#"This macro cannot be used on the current target.
You can prevent it from being used in other architectures by
guarding it behind a cfg("#,
stringify! (any(target_arch = "aarch64", target_arch = "arm64ec")),
")."))
}; ("sme-f8f16") =>
{
compile_error!
(concat!
(r#"This macro cannot be used on the current target.
You can prevent it from being used in other architectures by
guarding it behind a cfg("#,
stringify! (any(target_arch = "aarch64", target_arch = "arm64ec")),
")."))
}; ("sme-f8f32") =>
{
compile_error!
(concat!
(r#"This macro cannot be used on the current target.
You can prevent it from being used in other architectures by
guarding it behind a cfg("#,
stringify! (any(target_arch = "aarch64", target_arch = "arm64ec")),
")."))
}; ("sme-fa64") =>
{
compile_error!
(concat!
(r#"This macro cannot be used on the current target.
You can prevent it from being used in other architectures by
guarding it behind a cfg("#,
stringify! (any(target_arch = "aarch64", target_arch = "arm64ec")),
")."))
}; ("sme-i16i64") =>
{
compile_error!
(concat!
(r#"This macro cannot be used on the current target.
You can prevent it from being used in other architectures by
guarding it behind a cfg("#,
stringify! (any(target_arch = "aarch64", target_arch = "arm64ec")),
")."))
}; ("sme-lutv2") =>
{
compile_error!
(concat!
(r#"This macro cannot be used on the current target.
You can prevent it from being used in other architectures by
guarding it behind a cfg("#,
stringify! (any(target_arch = "aarch64", target_arch = "arm64ec")),
")."))
}; ("ssbs") =>
{
compile_error!
(concat!
(r#"This macro cannot be used on the current target.
You can prevent it from being used in other architectures by
guarding it behind a cfg("#,
stringify! (any(target_arch = "aarch64", target_arch = "arm64ec")),
")."))
}; ("ssve-fp8dot2") =>
{
compile_error!
(concat!
(r#"This macro cannot be used on the current target.
You can prevent it from being used in other architectures by
guarding it behind a cfg("#,
stringify! (any(target_arch = "aarch64", target_arch = "arm64ec")),
")."))
}; ("ssve-fp8dot4") =>
{
compile_error!
(concat!
(r#"This macro cannot be used on the current target.
You can prevent it from being used in other architectures by
guarding it behind a cfg("#,
stringify! (any(target_arch = "aarch64", target_arch = "arm64ec")),
")."))
}; ("ssve-fp8fma") =>
{
compile_error!
(concat!
(r#"This macro cannot be used on the current target.
You can prevent it from being used in other architectures by
guarding it behind a cfg("#,
stringify! (any(target_arch = "aarch64", target_arch = "arm64ec")),
")."))
}; ("sve") =>
{
compile_error!
(concat!
(r#"This macro cannot be used on the current target.
You can prevent it from being used in other architectures by
guarding it behind a cfg("#,
stringify! (any(target_arch = "aarch64", target_arch = "arm64ec")),
")."))
}; ("sve2") =>
{
compile_error!
(concat!
(r#"This macro cannot be used on the current target.
You can prevent it from being used in other architectures by
guarding it behind a cfg("#,
stringify! (any(target_arch = "aarch64", target_arch = "arm64ec")),
")."))
}; ("sve2p1") =>
{
compile_error!
(concat!
(r#"This macro cannot be used on the current target.
You can prevent it from being used in other architectures by
guarding it behind a cfg("#,
stringify! (any(target_arch = "aarch64", target_arch = "arm64ec")),
")."))
}; ("sve2-aes") =>
{
compile_error!
(concat!
(r#"This macro cannot be used on the current target.
You can prevent it from being used in other architectures by
guarding it behind a cfg("#,
stringify! (any(target_arch = "aarch64", target_arch = "arm64ec")),
")."))
}; ("sve-b16b16") =>
{
compile_error!
(concat!
(r#"This macro cannot be used on the current target.
You can prevent it from being used in other architectures by
guarding it behind a cfg("#,
stringify! (any(target_arch = "aarch64", target_arch = "arm64ec")),
")."))
}; ("sve2-bitperm") =>
{
compile_error!
(concat!
(r#"This macro cannot be used on the current target.
You can prevent it from being used in other architectures by
guarding it behind a cfg("#,
stringify! (any(target_arch = "aarch64", target_arch = "arm64ec")),
")."))
}; ("sve2-sha3") =>
{
compile_error!
(concat!
(r#"This macro cannot be used on the current target.
You can prevent it from being used in other architectures by
guarding it behind a cfg("#,
stringify! (any(target_arch = "aarch64", target_arch = "arm64ec")),
")."))
}; ("sve2-sm4") =>
{
compile_error!
(concat!
(r#"This macro cannot be used on the current target.
You can prevent it from being used in other architectures by
guarding it behind a cfg("#,
stringify! (any(target_arch = "aarch64", target_arch = "arm64ec")),
")."))
}; ("tme") =>
{
compile_error!
(concat!
(r#"This macro cannot be used on the current target.
You can prevent it from being used in other architectures by
guarding it behind a cfg("#,
stringify! (any(target_arch = "aarch64", target_arch = "arm64ec")),
")."))
}; ("wfxt") =>
{
compile_error!
(concat!
(r#"This macro cannot be used on the current target.
You can prevent it from being used in other architectures by
guarding it behind a cfg("#,
stringify! (any(target_arch = "aarch64", target_arch = "arm64ec")),
")."))
}; ("asimd") => { crate :: is_aarch64_feature_detected ! ("neon") };
("ras") =>
{
compile_error!
(concat!
(stringify! ("ras"), " feature cannot be detected at run-time"))
}; ("v8.1a") =>
{
compile_error!
(concat!
(stringify! ("v8.1a"), " feature cannot be detected at run-time"))
}; ("v8.2a") =>
{
compile_error!
(concat!
(stringify! ("v8.2a"), " feature cannot be detected at run-time"))
}; ("v8.3a") =>
{
compile_error!
(concat!
(stringify! ("v8.3a"), " feature cannot be detected at run-time"))
}; ("v8.4a") =>
{
compile_error!
(concat!
(stringify! ("v8.4a"), " feature cannot be detected at run-time"))
}; ("v8.5a") =>
{
compile_error!
(concat!
(stringify! ("v8.5a"), " feature cannot be detected at run-time"))
}; ("v8.6a") =>
{
compile_error!
(concat!
(stringify! ("v8.6a"), " feature cannot be detected at run-time"))
}; ("v8.7a") =>
{
compile_error!
(concat!
(stringify! ("v8.7a"), " feature cannot be detected at run-time"))
}; ("v8.8a") =>
{
compile_error!
(concat!
(stringify! ("v8.8a"), " feature cannot be detected at run-time"))
}; ("v8.9a") =>
{
compile_error!
(concat!
(stringify! ("v8.9a"), " feature cannot be detected at run-time"))
}; ("v9.1a") =>
{
compile_error!
(concat!
(stringify! ("v9.1a"), " feature cannot be detected at run-time"))
}; ("v9.2a") =>
{
compile_error!
(concat!
(stringify! ("v9.2a"), " feature cannot be detected at run-time"))
}; ("v9.3a") =>
{
compile_error!
(concat!
(stringify! ("v9.3a"), " feature cannot be detected at run-time"))
}; ("v9.4a") =>
{
compile_error!
(concat!
(stringify! ("v9.4a"), " feature cannot be detected at run-time"))
}; ("v9.5a") =>
{
compile_error!
(concat!
(stringify! ("v9.5a"), " feature cannot be detected at run-time"))
}; ("v9a") =>
{
compile_error!
(concat!
(stringify! ("v9a"), " feature cannot be detected at run-time"))
}; ($t : tt,) => { crate :: is_aarch64_feature_detected ! ($t); };
($t : tt) =>
{
compile_error!
(concat!
(concat! ("unknown ", stringify! (aarch64)), concat!
(" target feature: ", $t)))
};
}
#[deny(unexpected_cfgs)]
#[deny(unfulfilled_lint_expectations)]
const _: () =
{
false;
;
false;
;
false;
;
false;
;
false;
;
false;
;
false;
;
false;
;
false;
;
false;
;
false;
;
false;
;
false;
;
false;
;
false;
;
false;
;
false;
;
false;
;
false;
;
false;
;
false;
;
false;
;
false;
;
false;
;
false;
;
#[allow(unexpected_cfgs, reason = "fpmr")]
{ false };
false;
;
false;
;
false;
;
false;
;
false;
;
false;
;
false;
;
false;
;
false;
;
false;
;
false;
;
false;
;
false;
;
false;
;
false;
;
false;
;
false;
;
false;
;
false;
;
false;
;
false;
;
false;
;
false;
;
false;
;
false;
;
false;
;
false;
;
false;
;
false;
;
false;
;
false;
;
false;
;
false;
;
false;
;
false;
;
false;
;
false;
;
false;
;
false;
;
false;
;
false;
;
false;
;
false;
;
false;
;
false;
;
false;
;
false;
;
};features! {
4 @TARGET: aarch64;
5 @CFG: any(target_arch = "aarch64", target_arch = "arm64ec");
6 @MACRO_NAME: is_aarch64_feature_detected;
7 @MACRO_ATTRS:
8/// Check for the presence of a CPU feature at runtime.
9 ///
10 /// When the feature is known to be enabled at compile time (e.g. via `-Ctarget-feature`)
11 /// the macro expands to `true`.
12 ///
13 /// This macro takes one argument which is a string literal of the feature being tested for.
14 /// The feature names are mostly taken from their FEAT_* definitions in the [ARM Architecture
15 /// Reference Manual][docs].
16 ///
17 /// Currently most features are only supported on linux-based platforms: on other platforms the
18 /// runtime check will always return `false`.
19 ///
20 /// ## Supported arguments
21 ///
22 /// * `"aes"` - FEAT_AES & FEAT_PMULL
23 /// * `"asimd"` or "neon" - FEAT_AdvSIMD
24 /// * `"bf16"` - FEAT_BF16
25 /// * `"bti"` - FEAT_BTI
26 /// * `"crc"` - FEAT_CRC
27 /// * `"cssc"` - FEAT_CSSC
28 /// * `"dit"` - FEAT_DIT
29 /// * `"dotprod"` - FEAT_DotProd
30 /// * `"dpb"` - FEAT_DPB
31 /// * `"dpb2"` - FEAT_DPB2
32 /// * `"ecv"` - FEAT_ECV
33 /// * `"f32mm"` - FEAT_F32MM
34 /// * `"f64mm"` - FEAT_F64MM
35 /// * `"faminmax"` - FEAT_FAMINMAX
36 /// * `"fcma"` - FEAT_FCMA
37 /// * `"fhm"` - FEAT_FHM
38 /// * `"flagm"` - FEAT_FLAGM
39 /// * `"flagm2"` - FEAT_FLAGM2
40 /// * `"fp"` - FEAT_FP
41 /// * `"fp16"` - FEAT_FP16
42 /// * `"fp8"` - FEAT_FP8
43 /// * `"fp8dot2"` - FEAT_FP8DOT2
44 /// * `"fp8dot4"` - FEAT_FP8DOT4
45 /// * `"fp8fma"` - FEAT_FP8FMA
46 /// * `"fpmr"` - FEAT_FPMR
47 /// * `"frintts"` - FEAT_FRINTTS
48 /// * `"hbc"` - FEAT_HBC
49 /// * `"i8mm"` - FEAT_I8MM
50 /// * `"jsconv"` - FEAT_JSCVT
51 /// * `"lse"` - FEAT_LSE
52 /// * `"lse128"` - FEAT_LSE128
53 /// * `"lse2"` - FEAT_LSE2
54 /// * `"lut"` - FEAT_LUT
55 /// * `"mops"` - FEAT_MOPS
56 /// * `"mte"` - FEAT_MTE & FEAT_MTE2
57 /// * `"paca"` - FEAT_PAuth (address authentication)
58 /// * `"pacg"` - FEAT_Pauth (generic authentication)
59 /// * `"pauth-lr"` - FEAT_PAuth_LR
60 /// * `"pmull"` - FEAT_PMULL
61 /// * `"rand"` - FEAT_RNG
62 /// * `"rcpc"` - FEAT_LRCPC
63 /// * `"rcpc2"` - FEAT_LRCPC2
64 /// * `"rcpc3"` - FEAT_LRCPC3
65 /// * `"rdm"` - FEAT_RDM
66 /// * `"sb"` - FEAT_SB
67 /// * `"sha2"` - FEAT_SHA1 & FEAT_SHA256
68 /// * `"sha3"` - FEAT_SHA512 & FEAT_SHA3
69 /// * `"sm4"` - FEAT_SM3 & FEAT_SM4
70 /// * `"sme"` - FEAT_SME
71 /// * `"sme-b16b16"` - FEAT_SME_B16B16
72 /// * `"sme-f16f16"` - FEAT_SME_F16F16
73 /// * `"sme-f64f64"` - FEAT_SME_F64F64
74 /// * `"sme-f8f16"` - FEAT_SME_F8F16
75 /// * `"sme-f8f32"` - FEAT_SME_F8F32
76 /// * `"sme-fa64"` - FEAT_SME_FA64
77 /// * `"sme-i16i64"` - FEAT_SME_I16I64
78 /// * `"sme-lutv2"` - FEAT_SME_LUTv2
79 /// * `"sme2"` - FEAT_SME2
80 /// * `"sme2p1"` - FEAT_SME2p1
81 /// * `"ssbs"` - FEAT_SSBS & FEAT_SSBS2
82 /// * `"ssve-fp8dot2"` - FEAT_SSVE_FP8DOT2
83 /// * `"ssve-fp8dot4"` - FEAT_SSVE_FP8DOT4
84 /// * `"ssve-fp8fma"` - FEAT_SSVE_FP8FMA
85 /// * `"sve"` - FEAT_SVE
86 /// * `"sve-b16b16"` - FEAT_SVE_B16B16 (SVE or SME Z-targeting instructions)
87 /// * `"sve2"` - FEAT_SVE2
88 /// * `"sve2-aes"` - FEAT_SVE_AES & FEAT_SVE_PMULL128 (SVE2 AES crypto)
89 /// * `"sve2-bitperm"` - FEAT_SVE2_BitPerm
90 /// * `"sve2-sha3"` - FEAT_SVE2_SHA3
91 /// * `"sve2-sm4"` - FEAT_SVE2_SM4
92 /// * `"sve2p1"` - FEAT_SVE2p1
93 /// * `"tme"` - FEAT_TME
94 /// * `"wfxt"` - FEAT_WFxT
95 ///
96 /// [docs]: https://developer.arm.com/documentation/ddi0487/latest
97#[stable(feature = "simd_aarch64", since = "1.60.0")]
98@BIND_FEATURE_NAME: "asimd"; "neon";
99 @NO_RUNTIME_DETECTION: "ras";
100 @NO_RUNTIME_DETECTION: "v8.1a";
101 @NO_RUNTIME_DETECTION: "v8.2a";
102 @NO_RUNTIME_DETECTION: "v8.3a";
103 @NO_RUNTIME_DETECTION: "v8.4a";
104 @NO_RUNTIME_DETECTION: "v8.5a";
105 @NO_RUNTIME_DETECTION: "v8.6a";
106 @NO_RUNTIME_DETECTION: "v8.7a";
107 @NO_RUNTIME_DETECTION: "v8.8a";
108 @NO_RUNTIME_DETECTION: "v8.9a";
109 @NO_RUNTIME_DETECTION: "v9.1a";
110 @NO_RUNTIME_DETECTION: "v9.2a";
111 @NO_RUNTIME_DETECTION: "v9.3a";
112 @NO_RUNTIME_DETECTION: "v9.4a";
113 @NO_RUNTIME_DETECTION: "v9.5a";
114 @NO_RUNTIME_DETECTION: "v9a";
115 @FEATURE: #[stable(feature = "simd_aarch64", since = "1.60.0")] asimd: "neon";
116/// FEAT_AdvSIMD (Advanced SIMD/NEON)
117@FEATURE: #[stable(feature = "simd_aarch64", since = "1.60.0")] pmull: "pmull";
118 implied by target_features: ["aes"];
119/// FEAT_PMULL (Polynomial Multiply) - Implied by `aes` target_feature
120@FEATURE: #[stable(feature = "simd_aarch64", since = "1.60.0")] fp: "fp";
121 implied by target_features: ["neon"];
122/// FEAT_FP (Floating point support) - Implied by `neon` target_feature
123@FEATURE: #[stable(feature = "simd_aarch64", since = "1.60.0")] aes: "aes";
124/// FEAT_AES (AES SIMD instructions) & FEAT_PMULL (PMULL{2}, 64-bit operand variants)
125@FEATURE: #[stable(feature = "simd_aarch64", since = "1.60.0")] bf16: "bf16";
126/// FEAT_BF16 (BFloat16 type, plus MM instructions, plus ASIMD support)
127@FEATURE: #[stable(feature = "simd_aarch64", since = "1.60.0")] bti: "bti";
128/// FEAT_BTI (Branch Target Identification)
129@FEATURE: #[stable(feature = "simd_aarch64", since = "1.60.0")] crc: "crc";
130/// FEAT_CRC32 (Cyclic Redundancy Check)
131@FEATURE: #[unstable(feature = "stdarch_aarch64_feature_detection", issue = "127764")] cssc: "cssc";
132/// FEAT_CSSC (Common Short Sequence Compression instructions)
133@FEATURE: #[stable(feature = "simd_aarch64", since = "1.60.0")] dit: "dit";
134/// FEAT_DIT (Data Independent Timing instructions)
135@FEATURE: #[stable(feature = "simd_aarch64", since = "1.60.0")] dpb: "dpb";
136/// FEAT_DPB (aka dcpop - data cache clean to point of persistence)
137@FEATURE: #[stable(feature = "simd_aarch64", since = "1.60.0")] dpb2: "dpb2";
138/// FEAT_DPB2 (aka dcpodp - data cache clean to point of deep persistence)
139@FEATURE: #[stable(feature = "simd_aarch64", since = "1.60.0")] dotprod: "dotprod";
140/// FEAT_DotProd (Vector Dot-Product - ASIMDDP)
141@FEATURE: #[unstable(feature = "stdarch_aarch64_feature_detection", issue = "127764")] ecv: "ecv";
142/// FEAT_ECV (Enhanced Counter Virtualization)
143@FEATURE: #[stable(feature = "simd_aarch64", since = "1.60.0")] f32mm: "f32mm";
144/// FEAT_F32MM (single-precision matrix multiplication)
145@FEATURE: #[stable(feature = "simd_aarch64", since = "1.60.0")] f64mm: "f64mm";
146/// FEAT_F64MM (double-precision matrix multiplication)
147@FEATURE: #[unstable(feature = "stdarch_aarch64_feature_detection", issue = "127764")] faminmax: "faminmax";
148/// FEAT_FAMINMAX (FAMIN and FAMAX SIMD/SVE/SME instructions)
149@FEATURE: #[stable(feature = "simd_aarch64", since = "1.60.0")] fcma: "fcma";
150/// FEAT_FCMA (float complex number operations)
151@FEATURE: #[stable(feature = "simd_aarch64", since = "1.60.0")] fhm: "fhm";
152/// FEAT_FHM (fp16 multiplication instructions)
153@FEATURE: #[stable(feature = "simd_aarch64", since = "1.60.0")] flagm: "flagm";
154/// FEAT_FLAGM (flag manipulation instructions)
155@FEATURE: #[unstable(feature = "stdarch_aarch64_feature_detection", issue = "127764")] flagm2: "flagm2";
156/// FEAT_FLAGM2 (flag manipulation instructions)
157@FEATURE: #[stable(feature = "simd_aarch64", since = "1.60.0")] fp16: "fp16";
158/// FEAT_FP16 (Half-float support)
159@FEATURE: #[unstable(feature = "stdarch_aarch64_feature_detection", issue = "127764")] fp8: "fp8";
160/// FEAT_FP8 (F8CVT Instructions)
161@FEATURE: #[unstable(feature = "stdarch_aarch64_feature_detection", issue = "127764")] fp8dot2: "fp8dot2";
162/// FEAT_FP8DOT2 (F8DP2 Instructions)
163@FEATURE: #[unstable(feature = "stdarch_aarch64_feature_detection", issue = "127764")] fp8dot4: "fp8dot4";
164/// FEAT_FP8DOT4 (F8DP4 Instructions)
165@FEATURE: #[unstable(feature = "stdarch_aarch64_feature_detection", issue = "127764")] fp8fma: "fp8fma";
166/// FEAT_FP8FMA (F8FMA Instructions)
167@FEATURE: #[unstable(feature = "stdarch_aarch64_feature_detection", issue = "127764")] fpmr: "fpmr";
168 without cfg check: true;
169/// FEAT_FPMR (Special-purpose AArch64-FPMR register)
170@FEATURE: #[stable(feature = "simd_aarch64", since = "1.60.0")] frintts: "frintts";
171/// FEAT_FRINTTS (float to integer rounding instructions)
172@FEATURE: #[unstable(feature = "stdarch_aarch64_feature_detection", issue = "127764")] hbc: "hbc";
173/// FEAT_HBC (Hinted conditional branches)
174@FEATURE: #[stable(feature = "simd_aarch64", since = "1.60.0")] i8mm: "i8mm";
175/// FEAT_I8MM (integer matrix multiplication, plus ASIMD support)
176@FEATURE: #[stable(feature = "simd_aarch64", since = "1.60.0")] jsconv: "jsconv";
177/// FEAT_JSCVT (JavaScript float conversion instructions)
178@FEATURE: #[stable(feature = "simd_aarch64", since = "1.60.0")] lse: "lse";
179/// FEAT_LSE (Large System Extension - atomics)
180@FEATURE: #[unstable(feature = "stdarch_aarch64_feature_detection", issue = "127764")] lse128: "lse128";
181/// FEAT_LSE128 (128-bit atomics)
182@FEATURE: #[stable(feature = "simd_aarch64", since = "1.60.0")] lse2: "lse2";
183/// FEAT_LSE2 (unaligned and register-pair atomics)
184@FEATURE: #[unstable(feature = "stdarch_aarch64_feature_detection", issue = "127764")] lut: "lut";
185/// FEAT_LUT (Lookup Table Instructions)
186@FEATURE: #[unstable(feature = "stdarch_aarch64_feature_detection", issue = "127764")] mops: "mops";
187/// FEAT_MOPS (Standardization of memory operations)
188@FEATURE: #[stable(feature = "simd_aarch64", since = "1.60.0")] mte: "mte";
189/// FEAT_MTE & FEAT_MTE2 (Memory Tagging Extension)
190@FEATURE: #[stable(feature = "simd_aarch64", since = "1.60.0")] paca: "paca";
191/// FEAT_PAuth (address authentication)
192@FEATURE: #[stable(feature = "simd_aarch64", since = "1.60.0")] pacg: "pacg";
193/// FEAT_PAuth (generic authentication)
194@FEATURE: #[unstable(feature = "stdarch_aarch64_feature_detection", issue = "127764")] pauth_lr: "pauth-lr";
195/// FEAT_PAuth_LR
196@FEATURE: #[stable(feature = "simd_aarch64", since = "1.60.0")] rand: "rand";
197/// FEAT_RNG (Random Number Generator)
198@FEATURE: #[stable(feature = "simd_aarch64", since = "1.60.0")] rcpc: "rcpc";
199/// FEAT_LRCPC (Release consistent Processor consistent)
200@FEATURE: #[stable(feature = "simd_aarch64", since = "1.60.0")] rcpc2: "rcpc2";
201/// FEAT_LRCPC2 (RCPC with immediate offsets)
202@FEATURE: #[unstable(feature = "stdarch_aarch64_feature_detection", issue = "127764")] rcpc3: "rcpc3";
203/// FEAT_LRCPC3 (RCPC Instructions v3)
204@FEATURE: #[stable(feature = "simd_aarch64", since = "1.60.0")] rdm: "rdm";
205/// FEAT_RDM (Rounding Doubling Multiply - ASIMDRDM)
206@FEATURE: #[stable(feature = "simd_aarch64", since = "1.60.0")] sb: "sb";
207/// FEAT_SB (speculation barrier)
208@FEATURE: #[stable(feature = "simd_aarch64", since = "1.60.0")] sha2: "sha2";
209/// FEAT_SHA1 & FEAT_SHA256 (SHA1 & SHA2-256 instructions)
210@FEATURE: #[stable(feature = "simd_aarch64", since = "1.60.0")] sha3: "sha3";
211/// FEAT_SHA512 & FEAT_SHA3 (SHA2-512 & SHA3 instructions)
212@FEATURE: #[stable(feature = "simd_aarch64", since = "1.60.0")] sm4: "sm4";
213/// FEAT_SM3 & FEAT_SM4 (SM3 & SM4 instructions)
214@FEATURE: #[unstable(feature = "stdarch_aarch64_feature_detection", issue = "127764")] sme: "sme";
215/// FEAT_SME (Scalable Matrix Extension)
216@FEATURE: #[unstable(feature = "stdarch_aarch64_feature_detection", issue = "127764")] sme2: "sme2";
217/// FEAT_SME2 (SME Version 2)
218@FEATURE: #[unstable(feature = "stdarch_aarch64_feature_detection", issue = "127764")] sme2p1: "sme2p1";
219/// FEAT_SME2p1 (SME Version 2.1)
220@FEATURE: #[unstable(feature = "stdarch_aarch64_feature_detection", issue = "127764")] sme_b16b16: "sme-b16b16";
221/// FEAT_SME_B16B16
222@FEATURE: #[unstable(feature = "stdarch_aarch64_feature_detection", issue = "127764")] sme_f16f16: "sme-f16f16";
223/// FEAT_SME_F16F16 (Non-widening half-precision FP16 to FP16 arithmetic for SME2)
224@FEATURE: #[unstable(feature = "stdarch_aarch64_feature_detection", issue = "127764")] sme_f64f64: "sme-f64f64";
225/// FEAT_SME_F64F64 (Double-precision floating-point outer product instructions)
226@FEATURE: #[unstable(feature = "stdarch_aarch64_feature_detection", issue = "127764")] sme_f8f16: "sme-f8f16";
227/// FEAT_SME_F8F16
228@FEATURE: #[unstable(feature = "stdarch_aarch64_feature_detection", issue = "127764")] sme_f8f32: "sme-f8f32";
229/// FEAT_SME_F8F32
230@FEATURE: #[unstable(feature = "stdarch_aarch64_feature_detection", issue = "127764")] sme_fa64: "sme-fa64";
231/// FEAT_SME_FA64 (Full A64 instruction set support in Streaming SVE mode)
232@FEATURE: #[unstable(feature = "stdarch_aarch64_feature_detection", issue = "127764")] sme_i16i64: "sme-i16i64";
233/// FEAT_SME_I16I64 (16-bit to 64-bit integer widening outer product instructions)
234@FEATURE: #[unstable(feature = "stdarch_aarch64_feature_detection", issue = "127764")] sme_lutv2: "sme-lutv2";
235/// FEAT_SME_LUTv2 (LUTI4 Instruction)
236@FEATURE: #[stable(feature = "simd_aarch64", since = "1.60.0")] ssbs: "ssbs";
237/// FEAT_SSBS & FEAT_SSBS2 (speculative store bypass safe)
238@FEATURE: #[unstable(feature = "stdarch_aarch64_feature_detection", issue = "127764")] ssve_fp8dot2: "ssve-fp8dot2";
239/// FEAT_SSVE_FP8DOT2
240@FEATURE: #[unstable(feature = "stdarch_aarch64_feature_detection", issue = "127764")] ssve_fp8dot4: "ssve-fp8dot4";
241/// FEAT_SSVE_FP8DOT4
242@FEATURE: #[unstable(feature = "stdarch_aarch64_feature_detection", issue = "127764")] ssve_fp8fma: "ssve-fp8fma";
243/// FEAT_SSVE_FP8FMA
244@FEATURE: #[stable(feature = "simd_aarch64", since = "1.60.0")] sve: "sve";
245/// FEAT_SVE (Scalable Vector Extension)
246@FEATURE: #[stable(feature = "simd_aarch64", since = "1.60.0")] sve2: "sve2";
247/// FEAT_SVE2 (Scalable Vector Extension 2)
248@FEATURE: #[unstable(feature = "stdarch_aarch64_feature_detection", issue = "127764")] sve2p1: "sve2p1";
249/// FEAT_SVE2p1 (Scalable Vector Extension 2.1)
250@FEATURE: #[stable(feature = "simd_aarch64", since = "1.60.0")] sve2_aes: "sve2-aes";
251/// FEAT_SVE_AES & FEAT_SVE_PMULL128 (SVE2 AES crypto)
252@FEATURE: #[unstable(feature = "stdarch_aarch64_feature_detection", issue = "127764")] sve_b16b16: "sve-b16b16";
253/// FEAT_SVE_B16B16 (SVE or SME Z-targeting instructions)
254@FEATURE: #[stable(feature = "simd_aarch64", since = "1.60.0")] sve2_bitperm: "sve2-bitperm";
255/// FEAT_SVE_BitPerm (SVE2 bit permutation instructions)
256@FEATURE: #[stable(feature = "simd_aarch64", since = "1.60.0")] sve2_sha3: "sve2-sha3";
257/// FEAT_SVE_SHA3 (SVE2 SHA3 crypto)
258@FEATURE: #[stable(feature = "simd_aarch64", since = "1.60.0")] sve2_sm4: "sve2-sm4";
259/// FEAT_SVE_SM4 (SVE2 SM4 crypto)
260@FEATURE: #[stable(feature = "simd_aarch64", since = "1.60.0")] tme: "tme";
261/// FEAT_TME (Transactional Memory Extensions)
262@FEATURE: #[unstable(feature = "stdarch_aarch64_feature_detection", issue = "127764")] wfxt: "wfxt";
263/// FEAT_WFxT (WFET and WFIT Instructions)
264}