@@ -55,6 +55,94 @@ unsafe fn test_avx512() {
5555 assert_eq_m512i ( r, e) ;
5656 }
5757 test_mm512_sad_epu8 ( ) ;
58+
59+ #[ target_feature( enable = "avx512bw" ) ]
60+ unsafe fn test_mm512_maddubs_epi16 ( ) {
61+ // `a` is interpreted as `u8x16`, but `_mm512_set_epi8` expects `i8`, so we have to cast.
62+ #[ rustfmt:: skip]
63+ let a = _mm512_set_epi8 (
64+ 255u8 as i8 , 255u8 as i8 , 60 , 50 , 100 , 100 , 255u8 as i8 , 200u8 as i8 ,
65+ 255u8 as i8 , 200u8 as i8 , 200u8 as i8 , 100 , 60 , 50 , 20 , 10 ,
66+
67+ 255u8 as i8 , 255u8 as i8 , 60 , 50 , 100 , 100 , 255u8 as i8 , 200u8 as i8 ,
68+ 255u8 as i8 , 200u8 as i8 , 200u8 as i8 , 100 , 60 , 50 , 20 , 10 ,
69+
70+ 255u8 as i8 , 255u8 as i8 , 60 , 50 , 100 , 100 , 255u8 as i8 , 200u8 as i8 ,
71+ 255u8 as i8 , 200u8 as i8 , 200u8 as i8 , 100 , 60 , 50 , 20 , 10 ,
72+
73+ 255u8 as i8 , 255u8 as i8 , 60 , 50 , 100 , 100 , 255u8 as i8 , 200u8 as i8 ,
74+ 255u8 as i8 , 200u8 as i8 , 200u8 as i8 , 100 , 60 , 50 , 20 , 10 ,
75+ ) ;
76+
77+ let b = _mm512_set_epi8 (
78+ 64 , 64 , -2 , 1 , 100 , 100 , -128 , -128 , //
79+ 127 , 127 , -1 , 1 , 2 , 2 , 1 , 1 , //
80+ 64 , 64 , -2 , 1 , 100 , 100 , -128 , -128 , //
81+ 127 , 127 , -1 , 1 , 2 , 2 , 1 , 1 , //
82+ 64 , 64 , -2 , 1 , 100 , 100 , -128 , -128 , //
83+ 127 , 127 , -1 , 1 , 2 , 2 , 1 , 1 , //
84+ 64 , 64 , -2 , 1 , 100 , 100 , -128 , -128 , //
85+ 127 , 127 , -1 , 1 , 2 , 2 , 1 , 1 , //
86+ ) ;
87+
88+ let r = _mm512_maddubs_epi16 ( a, b) ;
89+
90+ let e = _mm512_set_epi16 (
91+ 32640 , -70 , 20000 , -32768 , 32767 , -100 , 220 , 30 , //
92+ 32640 , -70 , 20000 , -32768 , 32767 , -100 , 220 , 30 , //
93+ 32640 , -70 , 20000 , -32768 , 32767 , -100 , 220 , 30 , //
94+ 32640 , -70 , 20000 , -32768 , 32767 , -100 , 220 , 30 , //
95+ ) ;
96+
97+ assert_eq_m512i ( r, e) ;
98+ }
99+ test_mm512_maddubs_epi16 ( ) ;
100+
101+ #[ target_feature( enable = "avx512f" ) ]
102+ unsafe fn test_mm512_permutexvar_epi32 ( ) {
103+ let a = _mm512_set_epi32 (
104+ 15 , 14 , 13 , 12 , //
105+ 11 , 10 , 9 , 8 , //
106+ 7 , 6 , 5 , 4 , //
107+ 3 , 2 , 1 , 0 , //
108+ ) ;
109+
110+ let idx_identity = _mm512_set_epi32 (
111+ 15 , 14 , 13 , 12 , //
112+ 11 , 10 , 9 , 8 , //
113+ 7 , 6 , 5 , 4 , //
114+ 3 , 2 , 1 , 0 , //
115+ ) ;
116+ let r_id = _mm512_permutexvar_epi32 ( idx_identity, a) ;
117+ assert_eq_m512i ( r_id, a) ;
118+
119+ // Test some out-of-bounds indices.
120+ let edge_cases = _mm512_set_epi32 (
121+ 0 ,
122+ -1 ,
123+ -128 ,
124+ i32:: MIN ,
125+ 15 ,
126+ 16 ,
127+ 128 ,
128+ i32:: MAX ,
129+ 0 ,
130+ -1 ,
131+ -128 ,
132+ i32:: MIN ,
133+ 15 ,
134+ 16 ,
135+ 128 ,
136+ i32:: MAX ,
137+ ) ;
138+
139+ let r = _mm512_permutexvar_epi32 ( edge_cases, a) ;
140+
141+ let e = _mm512_set_epi32 ( 0 , 15 , 0 , 0 , 15 , 0 , 0 , 15 , 0 , 15 , 0 , 0 , 15 , 0 , 0 , 15 ) ;
142+
143+ assert_eq_m512i ( r, e) ;
144+ }
145+ test_mm512_permutexvar_epi32 ( ) ;
58146}
59147
60148// Some of the constants in the tests below are just bit patterns. They should not
0 commit comments