@@ -17,6 +17,7 @@ fn main() {
1717 unsafe {
1818 test_avx512bitalg ( ) ;
1919 test_avx512vpopcntdq ( ) ;
20+ test_avx512ternarylogic ( ) ;
2021 }
2122}
2223
@@ -191,6 +192,77 @@ unsafe fn test_avx512vpopcntdq() {
191192 test_mm_popcnt_epi64 ( ) ;
192193}
193194
195+ #[ target_feature( enable = "avx512f,avx512vl" ) ]
196+ unsafe fn test_avx512ternarylogic ( ) {
197+ #[ target_feature( enable = "avx512f" ) ]
198+ unsafe fn test_mm512_ternarylogic_epi32 ( ) {
199+ let a = _mm512_set4_epi32 ( 0b100 , 0b110 , 0b001 , 0b101 ) ;
200+ let b = _mm512_set4_epi32 ( 0b010 , 0b011 , 0b001 , 0b110 ) ;
201+ let c = _mm512_set4_epi32 ( 0b001 , 0b000 , 0b001 , 0b111 ) ;
202+
203+ // Identity of A.
204+ let r = _mm512_ternarylogic_epi32 :: < 0b1111_0000 > ( a, b, c) ;
205+ assert_eq_m512i ( r, a) ;
206+
207+ // Bitwise xor.
208+ let r = _mm512_ternarylogic_epi32 :: < 0b10010110 > ( a, b, c) ;
209+ let e = _mm512_set4_epi32 ( 0b111 , 0b101 , 0b001 , 0b100 ) ;
210+ assert_eq_m512i ( r, e) ;
211+
212+ // Majority (2 or more bits set).
213+ let r = _mm512_ternarylogic_epi32 :: < 0b1110_1000 > ( a, b, c) ;
214+ let e = _mm512_set4_epi32 ( 0b000 , 0b010 , 0b001 , 0b111 ) ;
215+ assert_eq_m512i ( r, e) ;
216+ }
217+ test_mm512_ternarylogic_epi32 ( ) ;
218+
219+ #[ target_feature( enable = "avx512f,avx512vl" ) ]
220+ unsafe fn test_mm256_ternarylogic_epi32 ( ) {
221+ let _mm256_set4_epi32 = |a, b, c, d| _mm256_setr_epi32 ( a, b, c, d, a, b, c, d) ;
222+
223+ let a = _mm256_set4_epi32 ( 0b100 , 0b110 , 0b001 , 0b101 ) ;
224+ let b = _mm256_set4_epi32 ( 0b010 , 0b011 , 0b001 , 0b110 ) ;
225+ let c = _mm256_set4_epi32 ( 0b001 , 0b000 , 0b001 , 0b111 ) ;
226+
227+ // Identity of A.
228+ let r = _mm256_ternarylogic_epi32 :: < 0b1111_0000 > ( a, b, c) ;
229+ assert_eq_m256i ( r, a) ;
230+
231+ // Bitwise xor.
232+ let r = _mm256_ternarylogic_epi32 :: < 0b10010110 > ( a, b, c) ;
233+ let e = _mm256_set4_epi32 ( 0b111 , 0b101 , 0b001 , 0b100 ) ;
234+ assert_eq_m256i ( r, e) ;
235+
236+ // Majority (2 or more bits set).
237+ let r = _mm256_ternarylogic_epi32 :: < 0b1110_1000 > ( a, b, c) ;
238+ let e = _mm256_set4_epi32 ( 0b000 , 0b010 , 0b001 , 0b111 ) ;
239+ assert_eq_m256i ( r, e) ;
240+ }
241+ test_mm256_ternarylogic_epi32 ( ) ;
242+
243+ #[ target_feature( enable = "avx512f,avx512vl" ) ]
244+ unsafe fn test_mm_ternarylogic_epi32 ( ) {
245+ let a = _mm_setr_epi32 ( 0b100 , 0b110 , 0b001 , 0b101 ) ;
246+ let b = _mm_setr_epi32 ( 0b010 , 0b011 , 0b001 , 0b110 ) ;
247+ let c = _mm_setr_epi32 ( 0b001 , 0b000 , 0b001 , 0b111 ) ;
248+
249+ // Identity of A.
250+ let r = _mm_ternarylogic_epi32 :: < 0b1111_0000 > ( a, b, c) ;
251+ assert_eq_m128i ( r, a) ;
252+
253+ // Bitwise xor.
254+ let r = _mm_ternarylogic_epi32 :: < 0b10010110 > ( a, b, c) ;
255+ let e = _mm_setr_epi32 ( 0b111 , 0b101 , 0b001 , 0b100 ) ;
256+ assert_eq_m128i ( r, e) ;
257+
258+ // Majority (2 or more bits set).
259+ let r = _mm_ternarylogic_epi32 :: < 0b1110_1000 > ( a, b, c) ;
260+ let e = _mm_setr_epi32 ( 0b000 , 0b010 , 0b001 , 0b111 ) ;
261+ assert_eq_m128i ( r, e) ;
262+ }
263+ test_mm_ternarylogic_epi32 ( ) ;
264+ }
265+
194266#[ track_caller]
195267unsafe fn assert_eq_m512i ( a : __m512i , b : __m512i ) {
196268 assert_eq ! ( transmute:: <_, [ i32 ; 16 ] >( a) , transmute:: <_, [ i32 ; 16 ] >( b) )
0 commit comments