@@ -45,7 +45,9 @@ fn functions(input: TokenStream, dirs: &[&str]) -> TokenStream {
45
45
for & mut ( ref mut file, ref path) in & mut files {
46
46
for mut item in file. items . drain ( ..) {
47
47
match item {
48
- syn:: Item :: Fn ( f) => functions. push ( ( f, path) ) ,
48
+ syn:: Item :: Fn ( f) => {
49
+ functions. push ( ( f, path) ) ;
50
+ }
49
51
syn:: Item :: Mod ( ref mut m) => {
50
52
if let Some ( ref mut m) = m. content {
51
53
for i in m. 1 . drain ( ..) {
@@ -71,12 +73,9 @@ fn functions(input: TokenStream, dirs: &[&str]) -> TokenStream {
71
73
assert ! ( !tests. is_empty( ) ) ;
72
74
73
75
functions. retain ( |( f, _) | {
74
- if let syn:: Visibility :: Public ( _) = f. vis {
75
- if f. sig . unsafety . is_some ( ) {
76
- return true ;
77
- }
78
- }
79
- false
76
+ matches ! ( f. vis, syn:: Visibility :: Public ( _) )
77
+ // Many SVE intrinsics are safe
78
+ && ( f. sig . unsafety . is_some ( ) || f. sig . ident . to_string ( ) . starts_with ( "sv" ) )
80
79
} ) ;
81
80
assert ! ( !functions. is_empty( ) ) ;
82
81
@@ -99,7 +98,7 @@ fn functions(input: TokenStream, dirs: &[&str]) -> TokenStream {
99
98
for generic in f. sig . generics . params . iter ( ) {
100
99
match * generic {
101
100
syn:: GenericParam :: Const ( ref c) => const_arguments. push ( to_type ( & c. ty ) ) ,
102
- syn:: GenericParam :: Type ( ref _t ) => ( ) ,
101
+ syn:: GenericParam :: Type ( _ ) => ( ) ,
103
102
_ => panic ! ( "invalid generic argument on {name}" ) ,
104
103
} ;
105
104
}
@@ -118,25 +117,31 @@ fn functions(input: TokenStream, dirs: &[&str]) -> TokenStream {
118
117
} ;
119
118
120
119
let required_const = find_required_const ( "rustc_args_required_const" , & f. attrs ) ;
121
- let mut legacy_const_generics =
120
+ let mut const_generics_indices =
122
121
find_required_const ( "rustc_legacy_const_generics" , & f. attrs ) ;
123
- if !required_const. is_empty ( ) && !legacy_const_generics . is_empty ( ) {
122
+ if !required_const. is_empty ( ) && !const_generics_indices . is_empty ( ) {
124
123
panic ! (
125
124
"Can't have both #[rustc_args_required_const] and \
126
125
#[rustc_legacy_const_generics]"
127
126
) ;
128
127
}
129
128
129
+ // Newer intrinsics don't have legacy support - assume they belong at the end of the argument list
130
+ if required_const. is_empty ( ) && const_generics_indices. is_empty ( ) {
131
+ const_generics_indices =
132
+ ( arguments. len ( ) ..( arguments. len ( ) + const_arguments. len ( ) ) ) . collect ( ) ;
133
+ }
134
+
130
135
// The list of required consts, used to verify the arguments, comes from either the
131
136
// `rustc_args_required_const` or the `rustc_legacy_const_generics` attribute.
132
137
let required_const = if required_const. is_empty ( ) {
133
- legacy_const_generics . clone ( )
138
+ const_generics_indices . clone ( )
134
139
} else {
135
140
required_const
136
141
} ;
137
142
138
- legacy_const_generics . sort ( ) ;
139
- for ( idx, ty) in legacy_const_generics
143
+ const_generics_indices . sort ( ) ;
144
+ for ( idx, ty) in const_generics_indices
140
145
. into_iter ( )
141
146
. zip ( const_arguments. into_iter ( ) )
142
147
{
@@ -145,12 +150,12 @@ fn functions(input: TokenStream, dirs: &[&str]) -> TokenStream {
145
150
146
151
// strip leading underscore from fn name when building a test
147
152
// _mm_foo -> mm_foo such that the test name is test_mm_foo.
148
- let test_name_string = format ! ( "{ name}" ) ;
149
- let mut test_name_id = test_name_string . as_str ( ) ;
150
- while test_name_id . starts_with ( '_' ) {
151
- test_name_id = & test_name_id [ 1 .. ] ;
152
- }
153
- let has_test = tests . contains ( & format ! ( "test_ {test_name_id}" ) ) ;
153
+ let test_name = name. to_string ( ) ;
154
+ let test_name_id = test_name . trim_start_matches ( '_' ) ;
155
+ let has_test = tests . contains ( & format ! ( "test_{test_name_id}" ) )
156
+ // SVE load/store tests
157
+ || tests . iter ( ) . any ( |t| t . starts_with ( & format ! ( "test_{test_name_id}" ) )
158
+ || t . ends_with ( & format ! ( "_with_ {test_name_id}" ) ) ) ;
154
159
155
160
let doc = find_doc ( & f. attrs ) ;
156
161
@@ -221,8 +226,53 @@ fn to_type(t: &syn::Type) -> proc_macro2::TokenStream {
221
226
"p16" => quote ! { & P16 } ,
222
227
"Ordering" => quote ! { & ORDERING } ,
223
228
"CpuidResult" => quote ! { & CPUID } ,
229
+ "T" => quote ! { & GENERICT } ,
224
230
225
231
// arm ...
232
+ "svbool_t" => quote ! { & SVBOOL } ,
233
+ "svint8_t" => quote ! { & SVI8 } ,
234
+ "svint8x2_t" => quote ! { & SVI8X2 } ,
235
+ "svint8x3_t" => quote ! { & SVI8X3 } ,
236
+ "svint8x4_t" => quote ! { & SVI8X4 } ,
237
+ "svint16_t" => quote ! { & SVI16 } ,
238
+ "svint16x2_t" => quote ! { & SVI16X2 } ,
239
+ "svint16x3_t" => quote ! { & SVI16X3 } ,
240
+ "svint16x4_t" => quote ! { & SVI16X4 } ,
241
+ "svint32_t" => quote ! { & SVI32 } ,
242
+ "svint32x2_t" => quote ! { & SVI32X2 } ,
243
+ "svint32x3_t" => quote ! { & SVI32X3 } ,
244
+ "svint32x4_t" => quote ! { & SVI32X4 } ,
245
+ "svint64_t" => quote ! { & SVI64 } ,
246
+ "svint64x2_t" => quote ! { & SVI64X2 } ,
247
+ "svint64x3_t" => quote ! { & SVI64X3 } ,
248
+ "svint64x4_t" => quote ! { & SVI64X4 } ,
249
+ "svuint8_t" => quote ! { & SVU8 } ,
250
+ "svuint8x2_t" => quote ! { & SVU8X2 } ,
251
+ "svuint8x3_t" => quote ! { & SVU8X3 } ,
252
+ "svuint8x4_t" => quote ! { & SVU8X4 } ,
253
+ "svuint16_t" => quote ! { & SVU16 } ,
254
+ "svuint16x2_t" => quote ! { & SVU16X2 } ,
255
+ "svuint16x3_t" => quote ! { & SVU16X3 } ,
256
+ "svuint16x4_t" => quote ! { & SVU16X4 } ,
257
+ "svuint32_t" => quote ! { & SVU32 } ,
258
+ "svuint32x2_t" => quote ! { & SVU32X2 } ,
259
+ "svuint32x3_t" => quote ! { & SVU32X3 } ,
260
+ "svuint32x4_t" => quote ! { & SVU32X4 } ,
261
+ "svuint64_t" => quote ! { & SVU64 } ,
262
+ "svuint64x2_t" => quote ! { & SVU64X2 } ,
263
+ "svuint64x3_t" => quote ! { & SVU64X3 } ,
264
+ "svuint64x4_t" => quote ! { & SVU64X4 } ,
265
+ "svfloat32_t" => quote ! { & SVF32 } ,
266
+ "svfloat32x2_t" => quote ! { & SVF32X2 } ,
267
+ "svfloat32x3_t" => quote ! { & SVF32X3 } ,
268
+ "svfloat32x4_t" => quote ! { & SVF32X4 } ,
269
+ "svfloat64_t" => quote ! { & SVF64 } ,
270
+ "svfloat64x2_t" => quote ! { & SVF64X2 } ,
271
+ "svfloat64x3_t" => quote ! { & SVF64X3 } ,
272
+ "svfloat64x4_t" => quote ! { & SVF64X4 } ,
273
+ "svprfop" => quote ! { & SVPRFOP } ,
274
+ "svpattern" => quote ! { & SVPATTERN } ,
275
+
226
276
"int8x4_t" => quote ! { & I8X4 } ,
227
277
"int8x8_t" => quote ! { & I8X8 } ,
228
278
"int8x8x2_t" => quote ! { & I8X8X2 } ,
0 commit comments