Skip to content

Commit 8c97ff0

Browse files
committed
Add mm256_blendv_epi8
1 parent d2ef239 commit 8c97ff0

File tree

1 file changed

+18
-0
lines changed

1 file changed

+18
-0
lines changed

src/avx2.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,11 @@ extern "platform-intrinsic" {
1717
fn x86_mm256_avg_epu16(x: u16x16, y: u16x16) -> u16x16;
1818
}
1919

20+
extern {
21+
#[link_name = "llvm.x86.avx2.pblendvb"]
22+
fn avx2_pblendvb(a: i8x32, b: i8x32, c: i8x32) -> i8x32;
23+
}
24+
2025
// vpabsw
2126
// __m256i _mm256_abs_epi16 (__m256i a)
2227
#[inline]
@@ -155,6 +160,11 @@ pub fn mm256_blend_epi32(a: m256i, b: m256i, imm8: i32) -> m256i {
155160

156161
// vpblendvb
157162
// __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+
158168
// vpbroadcastb
159169
// __m128i _mm_broadcastb_epi8 (__m128i a)
160170
// vpbroadcastb
@@ -697,6 +707,14 @@ mod tests {
697707

698708
#[test]
699709
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+
}
700718
{
701719
let a = mm256_setr_epi16(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16);
702720
let b = mm256_setr_epi16(17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32);

0 commit comments

Comments
 (0)