@@ -17,6 +17,11 @@ extern "platform-intrinsic" {
17
17
fn x86_mm256_avg_epu16 ( x : u16x16 , y : u16x16 ) -> u16x16 ;
18
18
}
19
19
20
+ extern {
21
+ #[ link_name = "llvm.x86.avx2.pblendvb" ]
22
+ fn avx2_pblendvb ( a : i8x32 , b : i8x32 , c : i8x32 ) -> i8x32 ;
23
+ }
24
+
20
25
// vpabsw
21
26
// __m256i _mm256_abs_epi16 (__m256i a)
22
27
#[ inline]
@@ -155,6 +160,11 @@ pub fn mm256_blend_epi32(a: m256i, b: m256i, imm8: i32) -> m256i {
155
160
156
161
// vpblendvb
157
162
// __m256i _mm256_blendv_epi8 (__m256i a, __m256i b, __m256i mask)
163
+ #[ inline]
164
+ pub fn mm256_blendv_epi8 ( a : m256i , b : m256i , mask : m256i ) -> m256i {
165
+ unsafe { avx2_pblendvb ( a. as_i8x32 ( ) , b. as_i8x32 ( ) , mask. as_i8x32 ( ) ) . as_m256i ( ) }
166
+ }
167
+
158
168
// vpbroadcastb
159
169
// __m128i _mm_broadcastb_epi8 (__m128i a)
160
170
// vpbroadcastb
@@ -697,6 +707,14 @@ mod tests {
697
707
698
708
#[ test]
699
709
fn test_blend ( ) {
710
+ {
711
+ let mask = mm256_setr_epi8 ( 0 , !0 , 0 , !0 , 0 , !0 , 0 , !0 , 0 , !0 , 0 , !0 , 0 , !0 , 0 , !0 ,
712
+ 0 , !0 , 0 , !0 , 0 , !0 , 0 , !0 , 0 , !0 , 0 , !0 , 0 , !0 , 0 , !0 ) ;
713
+
714
+ assert_eq ! ( mm256_blendv_epi8( seq8( ) , mseq8( ) , mask) . as_i8x32( ) . as_array( ) ,
715
+ [ 1 , -2 , 3 , -4 , 5 , -6 , 7 , -8 , 9 , -10 , 11 , -12 , 13 , -14 , 15 , -16 ,
716
+ 17 , -18 , 19 , -20 , 21 , -22 , 23 , -24 , 25 , -26 , 27 , -28 , 29 , -30 , 31 , -32 ] ) ;
717
+ }
700
718
{
701
719
let a = mm256_setr_epi16 ( 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 ) ;
702
720
let b = mm256_setr_epi16 ( 17 , 18 , 19 , 20 , 21 , 22 , 23 , 24 , 25 , 26 , 27 , 28 , 29 , 30 , 31 , 32 ) ;
0 commit comments