@@ -33,25 +33,47 @@ pub fn simd_test(
33
33
TokenNode :: Op ( '=' , _) => { }
34
34
_ => panic ! ( "expected #[simd_test = \" feature\" ]" ) ,
35
35
}
36
- let target_feature = & tokens[ 1 ] ;
36
+ let target_features = match tokens[ 1 ] . kind {
37
+ TokenNode :: Literal ( ref l) => l. to_string ( ) ,
38
+ _ => panic ! ( "expected #[simd_test = \" feature\" ]" ) ,
39
+ } ;
40
+ let target_features: Vec < String > = target_features
41
+ . replace ( '"' , "" )
42
+ . replace ( '+' , "" )
43
+ . split ( ',' )
44
+ . map ( |v| String :: from ( v) )
45
+ . collect ( ) ;
46
+
37
47
let enable_feature = match tokens[ 1 ] . kind {
38
48
TokenNode :: Literal ( ref l) => l. to_string ( ) ,
39
49
_ => panic ! ( "expected #[simd_test = \" feature\" ]" ) ,
40
50
} ;
41
51
let enable_feature = enable_feature
42
52
. trim_left_matches ( '"' )
43
53
. trim_right_matches ( '"' ) ;
44
- let enable_feature = string ( & format ! ( "+{}" , enable_feature) ) ;
54
+ let enable_feature =
55
+ string ( & ( format ! ( "+{}" , enable_feature) . replace ( ',' , ",+" ) ) ) ;
45
56
let item = TokenStream :: from ( item) ;
46
57
let name = find_name ( item. clone ( ) ) ;
47
58
48
59
let name: TokenStream = name. as_str ( ) . parse ( ) . unwrap ( ) ;
49
60
61
+ let mut cfg_target_features = quote:: Tokens :: new ( ) ;
62
+ use quote:: ToTokens ;
63
+ for feature in target_features {
64
+ let q = quote ! {
65
+ cfg_feature_enabled!( #feature) &&
66
+ } ;
67
+ q. to_tokens ( & mut cfg_target_features) ;
68
+ }
69
+ let q = quote ! { true } ;
70
+ q. to_tokens ( & mut cfg_target_features) ;
71
+
50
72
let ret: TokenStream = quote ! {
51
73
#[ allow( non_snake_case) ]
52
74
#[ test]
53
75
fn #name( ) {
54
- if cfg_feature_enabled! ( #target_feature ) {
76
+ if #cfg_target_features {
55
77
return unsafe { #name( ) } ;
56
78
} else {
57
79
:: stdsimd_test:: assert_skip_test_ok( stringify!( #name) ) ;
0 commit comments