https://gcc.gnu.org/g:643112df90a3c0a5b7b5520a2dd5be089cfca5f7
commit r16-4957-g643112df90a3c0a5b7b5520a2dd5be089cfca5f7 Author: Alfie Richards <[email protected]> Date: Mon Oct 20 12:01:13 2025 +0000 aarch64: Add missing fmv features. Add all the missing FMV features from the ACLE. gcc/ChangeLog: * config/aarch64/aarch64-option-extensions.def (dit): New fmv feature. (dpb): New fmv feature. (dpb2): New fmv feature. (memtag): Change to also define an FMV feature. (ssbs): Change to also define an FMV feature. (bti): New fmv feature. * config/aarch64/aarch64.cc (FEAT_SSBS): Add macro. (FEAT_MEMTAG): Ditto. gcc/testsuite/ChangeLog: * gcc.target/aarch64/fmv_priority.in: Update for new features. * gcc.target/aarch64/fmv_priority1.c: Ditto. * gcc.target/aarch64/fmv_priority2.c: Ditto. Diff: --- gcc/config/aarch64/aarch64-option-extensions.def | 12 ++++++++++-- gcc/config/aarch64/aarch64.cc | 2 ++ gcc/testsuite/gcc.target/aarch64/fmv_priority.in | 23 ++++++++++++----------- gcc/testsuite/gcc.target/aarch64/fmv_priority1.c | 22 +++++++++++----------- gcc/testsuite/gcc.target/aarch64/fmv_priority2.c | 8 ++++++-- 5 files changed, 41 insertions(+), 26 deletions(-) diff --git a/gcc/config/aarch64/aarch64-option-extensions.def b/gcc/config/aarch64/aarch64-option-extensions.def index a70375c053f2..083515d890d5 100644 --- a/gcc/config/aarch64/aarch64-option-extensions.def +++ b/gcc/config/aarch64/aarch64-option-extensions.def @@ -155,6 +155,12 @@ AARCH64_OPT_EXTENSION("fp16fml", F16FML, (), (F16), (), "asimdfhm") AARCH64_FMV_FEATURE("fp16fml", FP16FML, (F16FML)) +AARCH64_FMV_FEATURE("dit", DIT, ()) + +AARCH64_FMV_FEATURE("dpb", DPB, ()) + +AARCH64_FMV_FEATURE("dpb2", DPB2, ()) + AARCH64_OPT_FMV_EXTENSION("jscvt", JSCVT, (FP), (), (), "jscvt") AARCH64_OPT_FMV_EXTENSION("fcma", FCMA, (SIMD), (), (), "fcma") @@ -209,13 +215,15 @@ AARCH64_OPT_EXTENSION("sve2p1", SVE2p1, (SVE2), (), (), "sve2p1") AARCH64_OPT_FMV_EXTENSION("sme", SME, (BF16, FCMA, F16, F16FML), (), (), "sme") -AARCH64_OPT_EXTENSION("memtag", MEMTAG, (), (), (), "") +AARCH64_OPT_FMV_EXTENSION("memtag", MEMTAG, (), (), (), "") AARCH64_OPT_FMV_EXTENSION("sb", SB, (), (), (), "sb") AARCH64_OPT_EXTENSION("predres", PREDRES, (), (), (), "") -AARCH64_OPT_EXTENSION("ssbs", SSBS, (), (), (), "ssbs") +AARCH64_OPT_FMV_EXTENSION("ssbs", SSBS, (), (), (), "ssbs") + +AARCH64_FMV_FEATURE("bti", BTI, ()) AARCH64_OPT_EXTENSION("profile", PROFILE, (), (), (), "") diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc index 6f6dea67e0dc..74e2f20de4e1 100644 --- a/gcc/config/aarch64/aarch64.cc +++ b/gcc/config/aarch64/aarch64.cc @@ -20380,6 +20380,8 @@ typedef struct /* The "rdma" alias uses a different FEAT_NAME to avoid a duplicate feature_deps name. */ #define FEAT_RDMA FEAT_RDM +#define FEAT_SSBS FEAT_SSBS2 +#define FEAT_MEMTAG FEAT_MEMTAG2 /* FMV features are listed in priority order, to make it easier to sort target strings. */ diff --git a/gcc/testsuite/gcc.target/aarch64/fmv_priority.in b/gcc/testsuite/gcc.target/aarch64/fmv_priority.in index 93209bce0f23..4637369f019c 100644 --- a/gcc/testsuite/gcc.target/aarch64/fmv_priority.in +++ b/gcc/testsuite/gcc.target/aarch64/fmv_priority.in @@ -30,10 +30,12 @@ int fn [[gnu::target_version("fp16")]] (int) { return 1; } int fn_fp16(int) asm("fn._Mfp16"); int fn [[gnu::target_version("fp16fml")]] (int) { return 1; } int fn_fp16fml(int) asm("fn._Mfp16fml"); -/* TODO: These FMV features are not yet supported in GCC. */ -// int fn [[gnu::target_version("dit")]] (int) { return 1; } -// int fn [[gnu::target_version("dpb")]] (int) { return 1; } -// int fn [[gnu::target_version("dpb2")]] (int) { return 1; } +int fn [[gnu::target_version("dit")]] (int) { return 1; } +int fn_dit(int) asm("fn._Mdit"); +int fn [[gnu::target_version("dpb")]] (int) { return 1; } +int fn_dpb(int) asm("fn._Mdpb"); +int fn [[gnu::target_version("dpb2")]] (int) { return 1; } +int fn_dpb2(int) asm("fn._Mdpb2"); int fn [[gnu::target_version("jscvt")]] (int) { return 1; } int fn_jscvt(int) asm("fn._Mjscvt"); int fn [[gnu::target_version("fcma")]] (int) { return 1; } @@ -68,15 +70,14 @@ int fn [[gnu::target_version("sve2-sm4")]] (int) { return 1; } int fn_sve2_sm4(int) asm("fn._Msve2_sm4"); int fn [[gnu::target_version("sve2+sme")]] (int) { return 1; } int fn_sve2_sme(int) asm("fn._Msve2Msme"); -/* TODO: This FMV features is not yet supported in GCC. */ -// int fn [[gnu::target_version("memtag")]] (int) { return 1; } +int fn [[gnu::target_version("memtag")]] (int) { return 1; } +int fn_memtag(int) asm("fn._Mmemtag"); int fn [[gnu::target_version("sb")]] (int) { return 1; } int fn_sb(int) asm("fn._Msb"); -/* TODO: This FMV feature is not yet supported in GCC. */ -// int fn [[gnu::target_version("ssbs")]] (int) { return 1; } -// int fn_ssbs(int) asm("fn._Mssbs"); -/* TODO: This FMV feature is not yet supported in GCC. */ -// int fn [[gnu::target_version("bti")]] (int) { return 1; } +int fn [[gnu::target_version("ssbs")]] (int) { return 1; } +int fn_ssbs(int) asm("fn._Mssbs"); +int fn [[gnu::target_version("bti")]] (int) { return 1; } +int fn_bti(int) asm("fn._Mbti"); int fn [[gnu::target_version("wfxt")]] (int) { return 1; } int fn_wfxt(int) asm("fn._Mwfxt"); int fn [[gnu::target_version("sve2+sme-f64f64")]] (int) { return 1; } diff --git a/gcc/testsuite/gcc.target/aarch64/fmv_priority1.c b/gcc/testsuite/gcc.target/aarch64/fmv_priority1.c index 942b7a71c3a4..6075ccf4a401 100644 --- a/gcc/testsuite/gcc.target/aarch64/fmv_priority1.c +++ b/gcc/testsuite/gcc.target/aarch64/fmv_priority1.c @@ -81,14 +81,14 @@ int main () { if(resolver() != &fn_fp16fml) return 1; setCPUFeature (FEAT_DIT); - // if(resolver() != &fn_dit) return 1; - // + if(resolver() != &fn_dit) return 1; + setCPUFeature (FEAT_DPB); - // if(resolver() != &fn_dpb) return 1; - // + if(resolver() != &fn_dpb) return 1; + setCPUFeature (FEAT_DPB2); - // if(resolver() != &fn_dpb2) return 1; - // + if(resolver() != &fn_dpb2) return 1; + setCPUFeature (FEAT_JSCVT); if (resolver () != &fn_jscvt) return 1; @@ -102,8 +102,8 @@ int main () { if (resolver () != &fn_rcpc2) return 1; setCPUFeature (FEAT_RCPC3); - // if(resolver() != &fn_rcpc3) return 1; - // + if(resolver() != &fn_rcpc3) return 1; + setCPUFeature (FEAT_FRINTTS); if (resolver () != &fn_frintts) return 1; @@ -141,16 +141,16 @@ int main () { if (resolver () != &fn_sve2_sme) return 1; setCPUFeature(FEAT_MEMTAG2); - // if(resolver() != &fn_memtag) return 1; + if(resolver() != &fn_memtag) return 1; setCPUFeature (FEAT_SB); if (resolver () != &fn_sb) return 1; setCPUFeature(FEAT_SSBS2); - // if(resolver() != &fn_ssbs) return 1; + if(resolver() != &fn_ssbs) return 1; setCPUFeature(FEAT_BTI); - // if(resolver() != &fn_bti) return 1; + if(resolver() != &fn_bti) return 1; setCPUFeature (FEAT_WFXT); if (resolver () != &fn_wfxt) return 1; diff --git a/gcc/testsuite/gcc.target/aarch64/fmv_priority2.c b/gcc/testsuite/gcc.target/aarch64/fmv_priority2.c index dbeb15e4f62d..94640153ee37 100644 --- a/gcc/testsuite/gcc.target/aarch64/fmv_priority2.c +++ b/gcc/testsuite/gcc.target/aarch64/fmv_priority2.c @@ -14,7 +14,9 @@ /* { dg-final { scan-ipa-dump-times "fn\._Msm4/\[0-9\]+\\nfn\._MrdmaMrdm/\[0-9\]+\\nfn\._Mcrc/\[0-9\]+\\n" 1 "targetclone1" } } */ /* { dg-final { scan-ipa-dump-times "fn\._Mcrc/\[0-9\]+\\nfn\._Msha2/\[0-9\]+\\nfn\._Msha3/\[0-9\]+\\n" 1 "targetclone1" } } */ /* { dg-final { scan-ipa-dump-times "fn\._Msha3/\[0-9\]+\\nfn\._Maes/\[0-9\]+\\nfn\._Mfp16/\[0-9\]+\\n" 1 "targetclone1" } } */ -/* { dg-final { scan-ipa-dump-times "fn\._Mfp16/\[0-9\]+\\nfn\._Mfp16fml/\[0-9\]+\\nfn\._Mjscvt/\[0-9\]+\\n" 1 "targetclone1" } } */ +/* { dg-final { scan-ipa-dump-times "fn\._Mfp16/\[0-9\]+\\nfn\._Mfp16fml/\[0-9\]+\\nfn\._Mdit/\[0-9\]+\\n" 1 "targetclone1" } } */ +/* { dg-final { scan-ipa-dump-times "fn\._Mdit/\[0-9\]+\\nfn\._Mdpb/\[0-9\]+\\nfn\._Mdpb2/\[0-9\]+\\n" 1 "targetclone1" } } */ +/* { dg-final { scan-ipa-dump-times "fn\._Mdpb2/\[0-9\]+\\nfn\._Mjscvt/\[0-9\]+\\n" 1 "targetclone1" } } */ /* { dg-final { scan-ipa-dump-times "fn\._Mjscvt/\[0-9\]+\\nfn\._Mfcma/\[0-9\]+\\nfn\._Mrcpc/\[0-9\]+\\n" 1 "targetclone1" } } */ /* { dg-final { scan-ipa-dump-times "fn\._Mrcpc/\[0-9\]+\\nfn\._Mrcpc2/\[0-9\]+\\nfn\._Mrcpc3/\[0-9\]+\\n" 1 "targetclone1" } } */ /* { dg-final { scan-ipa-dump-times "fn\._Mrcpc3/\[0-9\]+\\nfn\._Mfrintts/\[0-9\]+\\nfn\._Mi8mm/\[0-9\]+\\n" 1 "targetclone1" } } */ @@ -23,7 +25,9 @@ /* { dg-final { scan-ipa-dump-times "fn\._Mf64mm/\[0-9\]+\\nfn\._Msve2/\[0-9\]+\\nfn\._Msve2_aes/\[0-9\]+\\n" 1 "targetclone1" } } */ /* { dg-final { scan-ipa-dump-times "fn\._Msve2_aes/\[0-9\]+\\nfn\._Msve2_bitperm/\[0-9\]+\\nfn\._Msve2_sha3/\[0-9\]+\\n" 1 "targetclone1" } } */ /* { dg-final { scan-ipa-dump-times "fn\._Msve2_sha3/\[0-9\]+\\nfn\._Msve2_sm4/\[0-9\]+\\nfn\._Msve2Msme/\[0-9\]+\\n" 1 "targetclone1" } } */ -/* { dg-final { scan-ipa-dump-times "fn\._Msve2Msme/\[0-9\]+\\nfn\._Msb/\[0-9\]+\\nfn\._Mwfxt/\[0-9\]+\\n" 1 "targetclone1" } } */ +/* { dg-final { scan-ipa-dump-times "fn\._Msve2Msme/\[0-9\]+\\nfn\._Mmemtag/\[0-9\]+\\nfn\._Msb/\[0-9\]+\\n" 1 "targetclone1" } } */ +/* { dg-final { scan-ipa-dump-times "fn\._Msb/\[0-9\]+\\nfn\._Mssbs/\[0-9\]+\\nfn\._Mbti/\[0-9\]+\\n" 1 "targetclone1" } } */ +/* { dg-final { scan-ipa-dump-times "fn\._Mbti/\[0-9\]+\\nfn\._Mwfxt/\[0-9\]+\\n" 1 "targetclone1" } } */ /* { dg-final { scan-ipa-dump-times "fn\._Mwfxt/\[0-9\]+\\nfn\._Msve2Msme_f64f64/\[0-9\]+\\nfn\._Msve2Msme_i16i64/\[0-9\]+\\n" 1 "targetclone1" } } */ /* { dg-final { scan-ipa-dump-times "fn\._Msve2Msme_i16i64/\[0-9\]+\\nfn\._Msve2Msme2/\[0-9\]+\\nfn\._Mmops/\[0-9\]+\\n" 1 "targetclone1" } } */ /* { dg-final { scan-ipa-dump-times "fn\._Mmops/\[0-9\]+\\nfn\._Mcssc/\[0-9\]+\\n" 1 "targetclone1" } } */
