6
6
//@ignore-target-s390x
7
7
//@ignore-target-thumbv7em
8
8
//@ignore-target-wasm32
9
- //@compile-flags: -C target-feature=+avx512bitalg,+ avx512f,+avx512vl
9
+ //@compile-flags: -C target-feature=+avx512f,+avx512vl,+avx512bitalg,+avx512vpopcntdq
10
10
11
11
#![ feature( avx512_target_feature) ]
12
12
#![ feature( stdsimd) ]
@@ -18,12 +18,14 @@ use std::arch::x86_64::*;
18
18
use std:: mem:: transmute;
19
19
20
20
fn main ( ) {
21
- assert ! ( is_x86_feature_detected!( "avx512bitalg" ) ) ;
22
21
assert ! ( is_x86_feature_detected!( "avx512f" ) ) ;
23
22
assert ! ( is_x86_feature_detected!( "avx512vl" ) ) ;
23
+ assert ! ( is_x86_feature_detected!( "avx512bitalg" ) ) ;
24
+ assert ! ( is_x86_feature_detected!( "avx512vpopcntdq" ) ) ;
24
25
25
26
unsafe {
26
27
test_avx512bitalg ( ) ;
28
+ test_avx512vpopcntdq ( ) ;
27
29
}
28
30
}
29
31
@@ -117,6 +119,87 @@ unsafe fn test_avx512bitalg() {
117
119
test_mm_popcnt_epi8 ( ) ;
118
120
}
119
121
122
+ #[ target_feature( enable = "avx512vpopcntdq,avx512f,avx512vl" ) ]
123
+ unsafe fn test_avx512vpopcntdq ( ) {
124
+ // Mostly copied from library/stdarch/crates/core_arch/src/x86/avx512vpopcntdq.rs
125
+
126
+ #[ target_feature( enable = "avx512vpopcntdq,avx512f" ) ]
127
+ unsafe fn test_mm512_popcnt_epi32 ( ) {
128
+ let test_data = _mm512_set_epi32 (
129
+ 0 ,
130
+ 1 ,
131
+ -1 ,
132
+ 2 ,
133
+ 7 ,
134
+ 0xFF_FE ,
135
+ 0x7F_FF_FF_FF ,
136
+ -100 ,
137
+ 0x40_00_00_00 ,
138
+ 103 ,
139
+ 371 ,
140
+ 552 ,
141
+ 432_948 ,
142
+ 818_826_998 ,
143
+ 255 ,
144
+ 256 ,
145
+ ) ;
146
+ let actual_result = _mm512_popcnt_epi32 ( test_data) ;
147
+ let reference_result =
148
+ _mm512_set_epi32 ( 0 , 1 , 32 , 1 , 3 , 15 , 31 , 28 , 1 , 5 , 6 , 3 , 10 , 17 , 8 , 1 ) ;
149
+ assert_eq_m512i ( actual_result, reference_result) ;
150
+ }
151
+ test_mm512_popcnt_epi32 ( ) ;
152
+
153
+ #[ target_feature( enable = "avx512vpopcntdq,avx512f,avx512vl" ) ]
154
+ unsafe fn test_mm256_popcnt_epi32 ( ) {
155
+ let test_data = _mm256_set_epi32 ( 0 , 1 , -1 , 2 , 7 , 0xFF_FE , 0x7F_FF_FF_FF , -100 ) ;
156
+ let actual_result = _mm256_popcnt_epi32 ( test_data) ;
157
+ let reference_result = _mm256_set_epi32 ( 0 , 1 , 32 , 1 , 3 , 15 , 31 , 28 ) ;
158
+ assert_eq_m256i ( actual_result, reference_result) ;
159
+ }
160
+ test_mm256_popcnt_epi32 ( ) ;
161
+
162
+ #[ target_feature( enable = "avx512vpopcntdq,avx512f,avx512vl" ) ]
163
+ unsafe fn test_mm_popcnt_epi32 ( ) {
164
+ let test_data = _mm_set_epi32 ( 0 , 1 , -1 , -100 ) ;
165
+ let actual_result = _mm_popcnt_epi32 ( test_data) ;
166
+ let reference_result = _mm_set_epi32 ( 0 , 1 , 32 , 28 ) ;
167
+ assert_eq_m128i ( actual_result, reference_result) ;
168
+ }
169
+ test_mm_popcnt_epi32 ( ) ;
170
+
171
+ #[ target_feature( enable = "avx512vpopcntdq,avx512f" ) ]
172
+ unsafe fn test_mm512_popcnt_epi64 ( ) {
173
+ let test_data = _mm512_set_epi64 ( 0 , 1 , -1 , 2 , 7 , 0xFF_FE , 0x7F_FF_FF_FF_FF_FF_FF_FF , -100 ) ;
174
+ let actual_result = _mm512_popcnt_epi64 ( test_data) ;
175
+ let reference_result = _mm512_set_epi64 ( 0 , 1 , 64 , 1 , 3 , 15 , 63 , 60 ) ;
176
+ assert_eq_m512i ( actual_result, reference_result) ;
177
+ }
178
+ test_mm512_popcnt_epi64 ( ) ;
179
+
180
+ #[ target_feature( enable = "avx512vpopcntdq,avx512vl" ) ]
181
+ unsafe fn test_mm256_popcnt_epi64 ( ) {
182
+ let test_data = _mm256_set_epi64x ( 0 , 1 , -1 , -100 ) ;
183
+ let actual_result = _mm256_popcnt_epi64 ( test_data) ;
184
+ let reference_result = _mm256_set_epi64x ( 0 , 1 , 64 , 60 ) ;
185
+ assert_eq_m256i ( actual_result, reference_result) ;
186
+ }
187
+ test_mm256_popcnt_epi64 ( ) ;
188
+
189
+ #[ target_feature( enable = "avx512vpopcntdq,avx512vl" ) ]
190
+ unsafe fn test_mm_popcnt_epi64 ( ) {
191
+ let test_data = _mm_set_epi64x ( 0 , 1 ) ;
192
+ let actual_result = _mm_popcnt_epi64 ( test_data) ;
193
+ let reference_result = _mm_set_epi64x ( 0 , 1 ) ;
194
+ assert_eq_m128i ( actual_result, reference_result) ;
195
+ let test_data = _mm_set_epi64x ( -1 , -100 ) ;
196
+ let actual_result = _mm_popcnt_epi64 ( test_data) ;
197
+ let reference_result = _mm_set_epi64x ( 64 , 60 ) ;
198
+ assert_eq_m128i ( actual_result, reference_result) ;
199
+ }
200
+ test_mm_popcnt_epi64 ( ) ;
201
+ }
202
+
120
203
#[ track_caller]
121
204
unsafe fn assert_eq_m512i ( a : __m512i , b : __m512i ) {
122
205
assert_eq ! ( transmute:: <_, [ i32 ; 16 ] >( a) , transmute:: <_, [ i32 ; 16 ] >( b) )
0 commit comments