66//@ignore-target-s390x
77//@ignore-target-thumbv7em
88//@ignore-target-wasm32
9- //@compile-flags: -C target-feature=+avx512bitalg,+ avx512f,+avx512vl
9+ //@compile-flags: -C target-feature=+avx512f,+avx512vl,+avx512bitalg,+avx512vpopcntdq
1010
1111#![ feature( avx512_target_feature) ]
1212#![ feature( stdsimd) ]
@@ -18,12 +18,14 @@ use std::arch::x86_64::*;
1818use std:: mem:: transmute;
1919
2020fn main ( ) {
21- assert ! ( is_x86_feature_detected!( "avx512bitalg" ) ) ;
2221 assert ! ( is_x86_feature_detected!( "avx512f" ) ) ;
2322 assert ! ( is_x86_feature_detected!( "avx512vl" ) ) ;
23+ assert ! ( is_x86_feature_detected!( "avx512bitalg" ) ) ;
24+ assert ! ( is_x86_feature_detected!( "avx512vpopcntdq" ) ) ;
2425
2526 unsafe {
2627 test_avx512bitalg ( ) ;
28+ test_avx512vpopcntdq ( ) ;
2729 }
2830}
2931
@@ -117,6 +119,87 @@ unsafe fn test_avx512bitalg() {
117119 test_mm_popcnt_epi8 ( ) ;
118120}
119121
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+
120203#[ track_caller]
121204unsafe fn assert_eq_m512i ( a : __m512i , b : __m512i ) {
122205 assert_eq ! ( transmute:: <_, [ i32 ; 16 ] >( a) , transmute:: <_, [ i32 ; 16 ] >( b) )
0 commit comments