{"rcpc2", AARCH64_FEATURE (RCPC2), AARCH64_FEATURE (RCPC)},
{"dotprod", AARCH64_FEATURE (DOTPROD), AARCH64_FEATURE (SIMD)},
{"sha2", AARCH64_FEATURE (SHA2), AARCH64_FEATURE (SIMD)},
- {"frintts", AARCH64_FEATURE (FRINTTS), AARCH64_FEATURE (SIMD)},
+ {"frintts", AARCH64_FEATURE (FRINTTS), AARCH64_FEATURE (FP)},
{"sb", AARCH64_FEATURE (SB), AARCH64_NO_FEATURES},
{"predres", AARCH64_FEATURE (PREDRES), AARCH64_NO_FEATURES},
{"predres2", AARCH64_FEATURE (PREDRES2), AARCH64_FEATURE (PREDRES)},
{"sve2-bitperm", AARCH64_FEATURE (SVE2_BITPERM),
AARCH64_FEATURE (SVE2)},
{"sme", AARCH64_FEATURE (SME),
- AARCH64_FEATURES (2, SVE2, BFLOAT16)},
+ AARCH64_FEATURES (3, BFLOAT16, F16, COMPNUM)},
{"sme-f64", AARCH64_FEATURE (SME_F64F64), AARCH64_FEATURE (SME)},
{"sme-f64f64", AARCH64_FEATURE (SME_F64F64), AARCH64_FEATURE (SME)},
{"sme-i64", AARCH64_FEATURE (SME_I16I64), AARCH64_FEATURE (SME)},
{"brbe", AARCH64_FEATURE (BRBE), AARCH64_NO_FEATURES},
{"sme-lutv2", AARCH64_FEATURE (SME_LUTv2), AARCH64_FEATURE (SME2)},
{"fp8fma", AARCH64_FEATURE (FP8FMA), AARCH64_FEATURE (FP8)},
- {"fp8dot4", AARCH64_FEATURE (FP8DOT4), AARCH64_FEATURE (FP8FMA)},
- {"fp8dot2", AARCH64_FEATURE (FP8DOT2), AARCH64_FEATURE (FP8DOT4)},
+ {"fp8dot4", AARCH64_FEATURE (FP8DOT4), AARCH64_FEATURE (FP8)},
+ {"fp8dot2", AARCH64_FEATURE (FP8DOT2), AARCH64_FEATURE (FP8)},
{"ssve-fp8fma", AARCH64_FEATURE (SSVE_FP8FMA),
AARCH64_FEATURES (2, FP8, SME2)},
{"ssve-fp8dot4", AARCH64_FEATURE (SSVE_FP8DOT4),
- AARCH64_FEATURE (SSVE_FP8FMA)},
+ AARCH64_FEATURES (2, FP8, SME2)},
{"ssve-fp8dot2", AARCH64_FEATURE (SSVE_FP8DOT2),
- AARCH64_FEATURE (SSVE_FP8DOT4)},
+ AARCH64_FEATURES (2, FP8, SME2)},
{"sme-f8f32", AARCH64_FEATURE (SME_F8F32),
AARCH64_FEATURES (2, FP8, SME2)},
{"sme-f8f16", AARCH64_FEATURE (SME_F8F16),
- AARCH64_FEATURE (SME_F8F32)},
+ AARCH64_FEATURES (2, FP8, SME2)},
{"sme-f16f16", AARCH64_FEATURE (SME_F16F16), AARCH64_FEATURE (SME2)},
{"sme-b16b16", AARCH64_FEATURE (SME_B16B16),
AARCH64_FEATURES (2, SVE_B16B16, SME2)},
for (opt = aarch64_features; opt->name != NULL; opt++)
if (AARCH64_CPU_HAS_ALL_FEATURES (set, opt->value))
AARCH64_MERGE_FEATURE_SETS (set, set, opt->require);
+ /* As a special case, we want +sme to imply +sve2, without letting
+ +nosve2 imply +nosme. This is to ensure maximum compatibility with
+ both toolchains that assume this dependency and those that don't. */
+ aarch64_feature_set sme = AARCH64_FEATURE (SME);
+ aarch64_feature_set sve2 = AARCH64_FEATURE (SVE2);
+ if (AARCH64_CPU_HAS_ALL_FEATURES (set, sme))
+ AARCH64_MERGE_FEATURE_SETS (set, set, sve2);
}
return set;
}
str = ext;
};
+ /* The special handling in aarch64_feature_enable_set ought to be sufficient
+ to accommodate uncertainty over whether or not +sme in a target string
+ implies +sve2. Unfortunately, many streaming SVE instructions are
+ currently marked as requiring SVE or SVE2, and some parsing and error
+ reporting decisions also depend on SVE or SVE2 being specified. So for
+ now we will reenable the SVE and SVE2 bits if SME is enabled. This allows
+ us to support, for example, a compiler passing the command line
+ `-march=armv9-a+sme+nosve` and expecting all SME instructions to remain
+ enabled. */
+ aarch64_feature_set sme = AARCH64_FEATURE (SME);
+ aarch64_feature_set sve_sve2 = AARCH64_FEATURES (2, SVE, SVE2);
+ if (AARCH64_CPU_HAS_ALL_FEATURES (*ext_set, sme))
+ AARCH64_MERGE_FEATURE_SETS (*ext_set, *ext_set, sve_sve2);
+
*ext_set = aarch64_update_virtual_dependencies (*ext_set);
return 1;
}
@tab Enable floating-point extensions.
@item @code{fp8} @tab
@tab Enable the Floating Point 8 (FP8) extension.
-@item @code{fp8dot2} @tab @code{fp8dot4}
+@item @code{fp8dot2} @tab @code{fp8}
@tab Enable the FP8 2-way dot product instructions.
-@item @code{fp8dot4} @tab @code{fp8fma}
+@item @code{fp8dot4} @tab @code{fp8}
@tab Enable the FP8 4-way dot product instructions.
@item @code{fp8fma} @tab @code{fp8}
@tab Enable the FP8 FMA instructions.
@tab Enable Armv8.2 16-bit floating-point multiplication variant support.
@item @code{fp16} @tab @code{fp}
@tab Enable Armv8.2 16-bit floating-point support.
-@item @code{frintts} @tab @code{simd}
+@item @code{frintts} @tab @code{fp}
@tab Enable floating-point round to integral value instructions.
@item @code{gcs} @tab
@tab Enable the Guarded Control Stack Extension.
@tab Enable Advanced SIMD extensions.
@item @code{sm4} @tab @code{simd}
@tab Enable the SM3 and SM4 cryptographic extensions.
-@item @code{sme} @tab @code{sve2}, @code{bf16}
- @tab Enable the Scalable Matrix Extension.
+@item @code{sme} @tab @code{bf16}, @code{fp16}, @code{fcma}
+ @tab Enable the Scalable Matrix Extension. This will also enable @code{sve2}, but disabling @code{sve2} does not disable @code{sme}.
@item @code{sme-b16b16} @tab @code{sme2}, @code{sve-b16b16}
@tab Enable SME ZA-targeting non-widening BFloat16 instructions.
-@item @code{sme-f8f16} @tab @code{sme-f8f32}
+@item @code{sme-f8f16} @tab @code{sme2}, @code{fp8}
@tab Enable the SME F8F16 Extension.
@item @code{sme-f8f32} @tab @code{sme2}, @code{fp8}
@tab Enable the SME F8F32 Extension.
@tab Enable SME2.1.
@item @code{ssbs} @tab
@tab Enable Speculative Store Bypassing Safe state read and write.
-@item @code{ssve-fp8dot2} @tab @code{ssve-fp8dot4}
- @tab Enable the Streaming SVE FP8 2-way dot product instructions. These can also be enabled using @code{+fp8dot2+sme2}.
-@item @code{ssve-fp8dot4} @tab @code{ssve-fp8fma}
- @tab Enable the Streaming SVE FP8 4-way dot product instructions. These can also be enabled using @code{+fp8dot4+sme2}.
+@item @code{ssve-fp8dot2} @tab @code{sme2}, @code{fp8}
+ @tab Enable the Streaming SVE FP8 2-way dot product instructions.
+@item @code{ssve-fp8dot4} @tab @code{sme2}, @code{fp8}
+ @tab Enable the Streaming SVE FP8 4-way dot product instructions.
@item @code{ssve-fp8fma} @tab @code{sme2}, @code{fp8}
- @tab Enable the Streaming SVE FP8 FMA instructions. These can also be enabled using @code{+fp8fma+sme2}.
+ @tab Enable the Streaming SVE FP8 FMA instructions.
@item @code{sve} @tab @code{fcma}
@tab Enable the Scalable Vector Extension.
@item @code{sve-b16b16} @tab