Skip to content

Commit 0cfde68

Browse files
[aarch64] Add function multiversioning support
This adds initial support for function multiversioning on aarch64 using the target_version and target_clones attributes. This loosely follows the Beta specification in the ACLE [1], although with some differences that still need to be resolved (possibly as follow-up patches). Existing function multiversioning implementations are broken in various ways when used across translation units. This includes placing resolvers in the wrong translation units, and using symbol mangling that callers to unintentionally bypass the resolver in some circumstances. Fixing these issues for aarch64 will require modifications to our ACLE specification. It will also require further adjustments to existing middle end code, to facilitate different mangling and resolver placement while preserving existing target behaviours. The list of function multiversioning features specified in the ACLE is also inconsistent with the list of features supported in target option extensions. I intend to resolve some or all of these inconsistencies at a later stage. The target_version attribute is currently only supported in C++, since this is the only frontend with existing support for multiversioning using the target attribute. On the other hand, this patch happens to enable multiversioning with the target_clones attribute in Ada and D, as well as the entire C family, using their existing frontend support. This patch also does not support the following aspects of the Beta specification: - The target_clones attribute should allow an implicit unlisted "default" version. - There should be an option to disable function multiversioning at compile time. - Unrecognised target names in a target_clones attribute should be ignored (with an optional warning). This current patch raises an error instead. [1] https://github.com/ARM-software/acle/blob/main/main/acle.md#function-multi-versioning gcc/ChangeLog: * config/aarch64/aarch64-feature-deps.h (fmv_deps_<FEAT_NAME>): Define aarch64_feature_flags mask foreach FMV feature. * config/aarch64/aarch64-option-extensions.def: Use new macros to define FMV feature extensions. * config/aarch64/aarch64.cc (aarch64_option_valid_attribute_p): Check for target_version attribute after processing target attribute. (aarch64_fmv_feature_data): New. (aarch64_parse_fmv_features): New. (aarch64_process_target_version_attr): New. (aarch64_option_valid_version_attribute_p): New. (get_feature_mask_for_version): New. (compare_feature_masks): New. (aarch64_compare_version_priority): New. (build_ifunc_arg_type): New. (make_resolver_func): New. (add_condition_to_bb): New. (dispatch_function_versions): New. (aarch64_generate_version_dispatcher_body): New. (aarch64_get_function_versions_dispatcher): New. (aarch64_common_function_versions): New. (aarch64_mangle_decl_assembler_name): New. (TARGET_OPTION_VALID_VERSION_ATTRIBUTE_P): New implementation. (TARGET_OPTION_EXPANDED_CLONES_ATTRIBUTE): New implementation. (TARGET_OPTION_FUNCTION_VERSIONS): New implementation. (TARGET_COMPARE_VERSION_PRIORITY): New implementation. (TARGET_GENERATE_VERSION_DISPATCHER_BODY): New implementation. (TARGET_GET_FUNCTION_VERSIONS_DISPATCHER): New implementation. (TARGET_MANGLE_DECL_ASSEMBLER_NAME): New implementation. * config/aarch64/aarch64.h (TARGET_HAS_FMV_TARGET_ATTRIBUTE): Set target macro. * config/arm/aarch-common.h (enum aarch_parse_opt_result): Add new value to report duplicate FMV feature. * common/config/aarch64/cpuinfo.h: New file. libgcc/ChangeLog: * config/aarch64/cpuinfo.c (enum CPUFeatures): Move to shared copy in gcc/common gcc/testsuite/ChangeLog: * gcc.target/aarch64/options_set_17.c: Reorder expected flags. * gcc.target/aarch64/cpunative/native_cpu_0.c: Ditto. * gcc.target/aarch64/cpunative/native_cpu_13.c: Ditto. * gcc.target/aarch64/cpunative/native_cpu_16.c: Ditto. * gcc.target/aarch64/cpunative/native_cpu_17.c: Ditto. * gcc.target/aarch64/cpunative/native_cpu_18.c: Ditto. * gcc.target/aarch64/cpunative/native_cpu_19.c: Ditto. * gcc.target/aarch64/cpunative/native_cpu_20.c: Ditto. * gcc.target/aarch64/cpunative/native_cpu_21.c: Ditto. * gcc.target/aarch64/cpunative/native_cpu_22.c: Ditto. * gcc.target/aarch64/cpunative/native_cpu_6.c: Ditto. * gcc.target/aarch64/cpunative/native_cpu_7.c: Ditto.
1 parent 79891c4 commit 0cfde68

File tree

19 files changed

+1141
-124
lines changed

19 files changed

+1141
-124
lines changed

gcc/common/config/aarch64/cpuinfo.h

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
/* CPU feature detection for AArch64 architecture.
2+
Copyright (C) 2023 Free Software Foundation, Inc.
3+
4+
This file is part of GCC.
5+
6+
This file is free software; you can redistribute it and/or modify it
7+
under the terms of the GNU General Public License as published by the
8+
Free Software Foundation; either version 3, or (at your option) any
9+
later version.
10+
11+
This file is distributed in the hope that it will be useful, but
12+
WITHOUT ANY WARRANTY; without even the implied warranty of
13+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14+
General Public License for more details.
15+
16+
Under Section 7 of GPL version 3, you are granted additional
17+
permissions described in the GCC Runtime Library Exception, version
18+
3.1, as published by the Free Software Foundation.
19+
20+
You should have received a copy of the GNU General Public License and
21+
a copy of the GCC Runtime Library Exception along with this program;
22+
see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
23+
<http://www.gnu.org/licenses/>. */
24+
25+
/* This enum is used in libgcc feature detection, and in the function
26+
multiversioning implementation in aarch64.cc. The enum should use the same
27+
values as the corresponding enum in LLVM's compiler-rt, to faciliate
28+
compatibility between compilers. */
29+
30+
enum CPUFeatures {
31+
FEAT_RNG,
32+
FEAT_FLAGM,
33+
FEAT_FLAGM2,
34+
FEAT_FP16FML,
35+
FEAT_DOTPROD,
36+
FEAT_SM4,
37+
FEAT_RDM,
38+
FEAT_LSE,
39+
FEAT_FP,
40+
FEAT_SIMD,
41+
FEAT_CRC,
42+
FEAT_SHA1,
43+
FEAT_SHA2,
44+
FEAT_SHA3,
45+
FEAT_AES,
46+
FEAT_PMULL,
47+
FEAT_FP16,
48+
FEAT_DIT,
49+
FEAT_DPB,
50+
FEAT_DPB2,
51+
FEAT_JSCVT,
52+
FEAT_FCMA,
53+
FEAT_RCPC,
54+
FEAT_RCPC2,
55+
FEAT_FRINTTS,
56+
FEAT_DGH,
57+
FEAT_I8MM,
58+
FEAT_BF16,
59+
FEAT_EBF16,
60+
FEAT_RPRES,
61+
FEAT_SVE,
62+
FEAT_SVE_BF16,
63+
FEAT_SVE_EBF16,
64+
FEAT_SVE_I8MM,
65+
FEAT_SVE_F32MM,
66+
FEAT_SVE_F64MM,
67+
FEAT_SVE2,
68+
FEAT_SVE_AES,
69+
FEAT_SVE_PMULL128,
70+
FEAT_SVE_BITPERM,
71+
FEAT_SVE_SHA3,
72+
FEAT_SVE_SM4,
73+
FEAT_SME,
74+
FEAT_MEMTAG,
75+
FEAT_MEMTAG2,
76+
FEAT_MEMTAG3,
77+
FEAT_SB,
78+
FEAT_PREDRES,
79+
FEAT_SSBS,
80+
FEAT_SSBS2,
81+
FEAT_BTI,
82+
FEAT_LS64,
83+
FEAT_LS64_V,
84+
FEAT_LS64_ACCDATA,
85+
FEAT_WFXT,
86+
FEAT_SME_F64,
87+
FEAT_SME_I64,
88+
FEAT_SME2,
89+
FEAT_RCPC3,
90+
FEAT_MAX,
91+
FEAT_EXT = 62, /* Reserved to indicate presence of additional features field
92+
in __aarch64_cpu_features. */
93+
FEAT_INIT /* Used as flag of features initialization completion. */
94+
};

gcc/config/aarch64/aarch64-feature-deps.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,13 @@ get_flags_off (aarch64_feature_flags mask)
115115
constexpr auto cpu_##CORE_IDENT = ARCH_IDENT ().enable | get_enable FEATURES;
116116
#include "config/aarch64/aarch64-cores.def"
117117

118+
/* Define fmv_deps_<NAME> variables for each FMV feature, giving the transitive
119+
closure of all the features that the FMV feature enables. */
120+
#define AARCH64_FMV_FEATURE(A, FEAT_NAME, OPT_FLAGS) \
121+
constexpr auto fmv_deps_##FEAT_NAME = get_enable OPT_FLAGS;
122+
#include "config/aarch64/aarch64-option-extensions.def"
123+
124+
118125
}
119126
}
120127

gcc/config/aarch64/aarch64-option-extensions.def

Lines changed: 156 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,22 @@
1717
along with GCC; see the file COPYING3. If not see
1818
<http://www.gnu.org/licenses/>. */
1919

20-
/* This is a list of ISA extentsions in AArch64.
20+
/* This is a list of ISA extensions in AArch64.
2121

22-
Before using #include to read this file, define a macro:
22+
Before using #include to read this file, define one of the following
23+
macros:
2324

2425
AARCH64_OPT_EXTENSION(NAME, IDENT, REQUIRES, EXPLICIT_ON,
2526
EXPLICIT_OFF, FEATURE_STRING)
2627

28+
AARCH64_FMV_FEATURE(NAME, FEAT_NAME, IDENT)
29+
2730
- NAME is the name of the extension, represented as a string constant.
2831

2932
- IDENT is the canonical internal name for this flag.
3033

34+
- FEAT_NAME is the unprefixed name used in the CPUFeatures enum.
35+
3136
- REQUIRES is a list of features that must be enabled whenever this
3237
feature is enabled. The relationship is implicitly transitive:
3338
if A appears in B's REQUIRES and B appears in C's REQUIRES then
@@ -58,112 +63,224 @@
5863
that are required. Their order is not important. An empty string means
5964
do not detect this feature during auto detection.
6065

61-
The list of features must follow topological order wrt REQUIRES
62-
and EXPLICIT_ON. For example, if A is in B's REQUIRES list, A must
63-
come before B. This is enforced by aarch64-feature-deps.h.
66+
- OPT_FLAGS is a list of feature IDENTS that should be enabled (along with
67+
their transitive dependencies) when the specified FMV feature is present.
68+
69+
Where a feature is present as both an extension and a function
70+
multiversioning feature, and IDENT matches the FEAT_NAME suffix, then these
71+
can be listed here simultaneously using the macro:
72+
73+
AARCH64_OPT_FMV_EXTENSION(NAME, IDENT, REQUIRES, EXPLICIT_ON,
74+
EXPLICIT_OFF, FEATURE_STRING)
75+
76+
The list of features extensions must follow topological order wrt REQUIRES
77+
and EXPLICIT_ON. For example, if A is in B's REQUIRES list, A must come
78+
before B. This is enforced by aarch64-feature-deps.h.
79+
80+
The list of multiversioning features must be ordered by increasing priority,
81+
as defined in https://github.com/ARM-software/acle/blob/main/main/acle.md
6482

6583
NOTE: Any changes to the AARCH64_OPT_EXTENSION macro need to be mirrored in
6684
config.gcc. */
6785

86+
#ifndef AARCH64_OPT_EXTENSION
87+
#define AARCH64_OPT_EXTENSION(NAME, IDENT, REQUIRES, EXPLICIT_ON, \
88+
EXPLICIT_OFF, FEATURE_STRING)
89+
#endif
90+
91+
#ifndef AARCH64_FMV_FEATURE
92+
#define AARCH64_FMV_FEATURE(NAME, FEAT_NAME, OPT_FLAGS)
93+
#endif
94+
95+
#define AARCH64_OPT_FMV_EXTENSION(NAME, IDENT, REQUIRES, EXPLICIT_ON, \
96+
EXPLICIT_OFF, FEATURE_STRING) \
97+
AARCH64_OPT_EXTENSION(NAME, IDENT, REQUIRES, EXPLICIT_ON, EXPLICIT_OFF, \
98+
FEATURE_STRING) \
99+
AARCH64_FMV_FEATURE(NAME, IDENT, (IDENT))
100+
101+
68102
AARCH64_OPT_EXTENSION("fp", FP, (), (), (), "fp")
69103

70104
AARCH64_OPT_EXTENSION("simd", SIMD, (FP), (), (), "asimd")
71105

72-
AARCH64_OPT_EXTENSION("crc", CRC, (), (), (), "crc32")
106+
AARCH64_OPT_FMV_EXTENSION("rng", RNG, (), (), (), "rng")
73107

74-
AARCH64_OPT_EXTENSION("lse", LSE, (), (), (), "atomics")
108+
AARCH64_OPT_FMV_EXTENSION("flagm", FLAGM, (), (), (), "flagm")
75109

76-
/* +nofp16 disables an implicit F16FML, even though an implicit F16FML
77-
does not imply F16. See F16FML for more details. */
78-
AARCH64_OPT_EXTENSION("fp16", F16, (FP), (), (F16FML), "fphp asimdhp")
110+
AARCH64_FMV_FEATURE("flagm2", FLAGM2, (FLAGM))
111+
112+
AARCH64_FMV_FEATURE("fp16fml", FP16FML, (F16FML))
113+
114+
AARCH64_OPT_FMV_EXTENSION("dotprod", DOTPROD, (SIMD), (), (), "asimddp")
79115

80-
AARCH64_OPT_EXTENSION("rcpc", RCPC, (), (), (), "lrcpc")
116+
AARCH64_OPT_FMV_EXTENSION("sm4", SM4, (SIMD), (), (), "sm3 sm4")
81117

82118
/* An explicit +rdma implies +simd, but +rdma+nosimd still enables scalar
83119
RDMA instructions. */
84120
AARCH64_OPT_EXTENSION("rdma", RDMA, (), (SIMD), (), "asimdrdm")
85121

86-
AARCH64_OPT_EXTENSION("dotprod", DOTPROD, (SIMD), (), (), "asimddp")
122+
AARCH64_FMV_FEATURE("rmd", RDM, (RDMA))
123+
124+
AARCH64_OPT_FMV_EXTENSION("lse", LSE, (), (), (), "atomics")
125+
126+
AARCH64_FMV_FEATURE("fp", FP, (FP))
127+
128+
AARCH64_FMV_FEATURE("simd", SIMD, (SIMD))
129+
130+
AARCH64_OPT_FMV_EXTENSION("crc", CRC, (), (), (), "crc32")
131+
132+
AARCH64_FMV_FEATURE("sha1", SHA1, ())
87133

88-
AARCH64_OPT_EXTENSION("aes", AES, (SIMD), (), (), "aes")
134+
AARCH64_OPT_FMV_EXTENSION("sha2", SHA2, (SIMD), (), (), "sha1 sha2")
89135

90-
AARCH64_OPT_EXTENSION("sha2", SHA2, (SIMD), (), (), "sha1 sha2")
136+
AARCH64_FMV_FEATURE("sha3", SHA3, (SHA3))
137+
138+
AARCH64_OPT_FMV_EXTENSION("aes", AES, (SIMD), (), (), "aes")
139+
140+
AARCH64_FMV_FEATURE("pmull", PMULL, ())
91141

92142
/* +nocrypto disables AES, SHA2 and SM4, and anything that depends on them
93143
(such as SHA3 and the SVE2 crypto extensions). */
94144
AARCH64_OPT_EXTENSION("crypto", CRYPTO, (AES, SHA2), (), (AES, SHA2, SM4),
95145
"aes pmull sha1 sha2")
96146

147+
/* Listing sha3 after crypto means we pass "+aes+sha3" to the assembler
148+
instead of "+sha3+crypto". */
97149
AARCH64_OPT_EXTENSION("sha3", SHA3, (SHA2), (), (), "sha3 sha512")
98150

99-
AARCH64_OPT_EXTENSION("sm4", SM4, (SIMD), (), (), "sm3 sm4")
151+
/* +nofp16 disables an implicit F16FML, even though an implicit F16FML
152+
does not imply F16. See F16FML for more details. */
153+
AARCH64_OPT_EXTENSION("fp16", F16, (FP), (), (F16FML), "fphp asimdhp")
154+
155+
AARCH64_FMV_FEATURE("fp16", FP16, (F16))
100156

101157
/* An explicit +fp16fml implies +fp16, but a dependence on it does not.
102158
Thus -march=armv8.4-a implies F16FML but not F16. -march=armv8.4-a+fp16
103159
and -march=armv8.4-a+fp16fml are equivalent and enable both F16FML and F16.
104160
-march=armv8.4-a+nofp16+fp16 enables F16 but not F16FML. */
105161
AARCH64_OPT_EXTENSION("fp16fml", F16FML, (), (F16), (), "asimdfhm")
106162

107-
AARCH64_OPT_EXTENSION("sve", SVE, (SIMD, F16), (), (), "sve")
163+
AARCH64_FMV_FEATURE("dit", DIT, ())
108164

109-
AARCH64_OPT_EXTENSION("profile", PROFILE, (), (), (), "")
165+
AARCH64_FMV_FEATURE("dpb", DPB, ())
110166

111-
AARCH64_OPT_EXTENSION("rng", RNG, (), (), (), "rng")
167+
AARCH64_FMV_FEATURE("dpb2", DPB2, ())
112168

113-
AARCH64_OPT_EXTENSION("memtag", MEMTAG, (), (), (), "")
169+
AARCH64_FMV_FEATURE("jscvt", JSCVT, ())
114170

115-
AARCH64_OPT_EXTENSION("sb", SB, (), (), (), "sb")
171+
AARCH64_FMV_FEATURE("fcma", FCMA, (SIMD))
116172

117-
AARCH64_OPT_EXTENSION("ssbs", SSBS, (), (), (), "ssbs")
173+
AARCH64_OPT_FMV_EXTENSION("rcpc", RCPC, (), (), (), "lrcpc")
118174

119-
AARCH64_OPT_EXTENSION("predres", PREDRES, (), (), (), "")
175+
AARCH64_FMV_FEATURE("rcpc2", RCPC2, (RCPC))
120176

121-
AARCH64_OPT_EXTENSION("sve2", SVE2, (SVE), (), (), "sve2")
177+
AARCH64_OPT_FMV_EXTENSION("rcpc3", RCPC3, (), (), (), "rcpc3")
122178

123-
AARCH64_OPT_EXTENSION("sve2-sm4", SVE2_SM4, (SVE2, SM4), (), (), "svesm4")
179+
AARCH64_FMV_FEATURE("frintts", FRINTTS, ())
180+
181+
AARCH64_FMV_FEATURE("dgh", DGH, ())
182+
183+
AARCH64_OPT_FMV_EXTENSION("i8mm", I8MM, (SIMD), (), (), "i8mm")
184+
185+
/* An explicit +bf16 implies +simd, but +bf16+nosimd still enables scalar BF16
186+
instructions. */
187+
AARCH64_OPT_FMV_EXTENSION("bf16", BF16, (FP), (SIMD), (), "bf16")
188+
189+
AARCH64_FMV_FEATURE("ebf16", EBF16, (BF16))
190+
191+
AARCH64_FMV_FEATURE("rpres", RPRES, ())
192+
193+
AARCH64_OPT_FMV_EXTENSION("sve", SVE, (SIMD, F16), (), (), "sve")
194+
195+
AARCH64_FMV_FEATURE("sve-bf16", SVE_BF16, (SVE, BF16))
196+
197+
AARCH64_FMV_FEATURE("sve-ebf16", SVE_EBF16, (SVE, BF16))
198+
199+
AARCH64_FMV_FEATURE("sve-i8mm", SVE_I8MM, (SVE, I8MM))
200+
201+
AARCH64_OPT_EXTENSION("f32mm", F32MM, (SVE), (), (), "f32mm")
202+
203+
AARCH64_FMV_FEATURE("f32mm", SVE_F32MM, (F32MM))
204+
205+
AARCH64_OPT_EXTENSION("f64mm", F64MM, (SVE), (), (), "f64mm")
206+
207+
AARCH64_FMV_FEATURE("f64mm", SVE_F64MM, (F64MM))
208+
209+
AARCH64_OPT_FMV_EXTENSION("sve2", SVE2, (SVE), (), (), "sve2")
124210

125211
AARCH64_OPT_EXTENSION("sve2-aes", SVE2_AES, (SVE2, AES), (), (), "sveaes")
126212

127-
AARCH64_OPT_EXTENSION("sve2-sha3", SVE2_SHA3, (SVE2, SHA3), (), (), "svesha3")
213+
AARCH64_FMV_FEATURE("sve2-aes", SVE_AES, (SVE2_AES))
214+
215+
AARCH64_FMV_FEATURE("sve2-pmull128", SVE_PMULL128, (SVE2))
128216

129217
AARCH64_OPT_EXTENSION("sve2-bitperm", SVE2_BITPERM, (SVE2), (), (),
130218
"svebitperm")
131219

132-
AARCH64_OPT_EXTENSION("tme", TME, (), (), (), "")
220+
AARCH64_FMV_FEATURE("sve2-bitperm", SVE_BITPERM, (SVE2_BITPERM))
133221

134-
AARCH64_OPT_EXTENSION("i8mm", I8MM, (SIMD), (), (), "i8mm")
222+
AARCH64_OPT_EXTENSION("sve2-sha3", SVE2_SHA3, (SVE2, SHA3), (), (), "svesha3")
135223

136-
AARCH64_OPT_EXTENSION("f32mm", F32MM, (SVE), (), (), "f32mm")
224+
AARCH64_FMV_FEATURE("sve2-sha3", SVE_SHA3, (SVE2_SHA3))
137225

138-
AARCH64_OPT_EXTENSION("f64mm", F64MM, (SVE), (), (), "f64mm")
226+
AARCH64_OPT_EXTENSION("sve2-sm4", SVE2_SM4, (SVE2, SM4), (), (), "svesm4")
139227

140-
/* An explicit +bf16 implies +simd, but +bf16+nosimd still enables scalar BF16
141-
instructions. */
142-
AARCH64_OPT_EXTENSION("bf16", BF16, (FP), (SIMD), (), "bf16")
228+
AARCH64_FMV_FEATURE("sve2-sm4", SVE_SM4, (SVE2_SM4))
229+
230+
AARCH64_OPT_FMV_EXTENSION("sme", SME, (BF16, SVE2), (), (), "sme")
231+
232+
AARCH64_OPT_FMV_EXTENSION("memtag", MEMTAG, (), (), (), "")
233+
234+
AARCH64_FMV_FEATURE("memtag2", MEMTAG2, (MEMTAG))
235+
236+
AARCH64_FMV_FEATURE("memtag3", MEMTAG3, (MEMTAG))
143237

144-
AARCH64_OPT_EXTENSION("flagm", FLAGM, (), (), (), "flagm")
238+
AARCH64_OPT_FMV_EXTENSION("sb", SB, (), (), (), "sb")
239+
240+
AARCH64_OPT_FMV_EXTENSION("predres", PREDRES, (), (), (), "")
241+
242+
AARCH64_OPT_FMV_EXTENSION("ssbs", SSBS, (), (), (), "ssbs")
243+
244+
AARCH64_FMV_FEATURE("ssbs2", SSBS2, (SSBS))
245+
246+
AARCH64_FMV_FEATURE("bti", BTI, ())
247+
248+
AARCH64_OPT_EXTENSION("profile", PROFILE, (), (), (), "")
249+
250+
AARCH64_OPT_EXTENSION("tme", TME, (), (), (), "")
145251

146252
AARCH64_OPT_EXTENSION("pauth", PAUTH, (), (), (), "paca pacg")
147253

148254
AARCH64_OPT_EXTENSION("ls64", LS64, (), (), (), "")
149255

150-
AARCH64_OPT_EXTENSION("mops", MOPS, (), (), (), "")
256+
AARCH64_FMV_FEATURE("ls64", LS64, ())
151257

152-
AARCH64_OPT_EXTENSION("cssc", CSSC, (), (), (), "cssc")
258+
AARCH64_FMV_FEATURE("ls64_v", LS64_V, ())
153259

154-
AARCH64_OPT_EXTENSION("sme", SME, (BF16, SVE2), (), (), "sme")
260+
AARCH64_FMV_FEATURE("ls64_accdata", LS64_ACCDATA, (LS64))
155261

156-
AARCH64_OPT_EXTENSION("sme-i16i64", SME_I16I64, (SME), (), (), "")
262+
AARCH64_FMV_FEATURE("wfxt", WFXT, ())
157263

158264
AARCH64_OPT_EXTENSION("sme-f64f64", SME_F64F64, (SME), (), (), "")
159265

160-
AARCH64_OPT_EXTENSION("sme2", SME2, (SME), (), (), "sme2")
266+
AARCH64_FMV_FEATURE("sme-f64f64", SME_F64, (SME_F64F64))
267+
268+
AARCH64_OPT_EXTENSION("sme-i16i64", SME_I16I64, (SME), (), (), "")
269+
270+
AARCH64_FMV_FEATURE("sme-i16i64", SME_I64, (SME_I16I64))
271+
272+
AARCH64_OPT_FMV_EXTENSION("sme2", SME2, (SME), (), (), "sme2")
273+
274+
AARCH64_OPT_EXTENSION("mops", MOPS, (), (), (), "")
275+
276+
AARCH64_OPT_EXTENSION("cssc", CSSC, (), (), (), "cssc")
161277

162278
AARCH64_OPT_EXTENSION("d128", D128, (), (), (), "d128")
163279

164280
AARCH64_OPT_EXTENSION("the", THE, (), (), (), "the")
165281

166282
AARCH64_OPT_EXTENSION("gcs", GCS, (), (), (), "gcs")
167283

168-
AARCH64_OPT_EXTENSION("rcpc3", RCPC3, (), (), (), "rcpc3")
284+
#undef AARCH64_OPT_FMV_EXTENSION
169285
#undef AARCH64_OPT_EXTENSION
286+
#undef AARCH64_FMV_FEATURE

0 commit comments

Comments
 (0)