Skip to content

Commit e56cb03

Browse files
alexcrichtonBurntSushi
authored andcommitted
Add bindings for _mm_blendv_epi8
Just wanted to test this out!
1 parent e589538 commit e56cb03

File tree

2 files changed

+41
-1
lines changed

2 files changed

+41
-1
lines changed

src/x86/mod.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
pub use self::sse::*;
22
pub use self::sse2::*;
33
pub use self::ssse3::*;
4+
pub use self::sse41::*;
45
pub use self::sse42::*;
56
pub use self::avx::*;
67
pub use self::avx2::*;
@@ -13,6 +14,7 @@ pub type __m256i = ::v256::i8x32;
1314
mod sse;
1415
mod sse2;
1516
mod ssse3;
17+
mod sse41;
1618
mod sse42;
1719
mod avx;
18-
mod avx2;
20+
mod avx2;

src/x86/sse41.rs

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
// use v128::*;
2+
use x86::__m128i;
3+
4+
#[inline(always)]
5+
#[target_feature = "+sse4.1"]
6+
pub fn _mm_blendv_epi8(
7+
a: __m128i,
8+
b: __m128i,
9+
mask: __m128i,
10+
) -> __m128i {
11+
unsafe { pblendvb(a, b, mask) }
12+
}
13+
14+
#[allow(improper_ctypes)]
15+
extern {
16+
#[link_name = "llvm.x86.sse41.pblendvb"]
17+
fn pblendvb(a: __m128i, b: __m128i, mask: __m128i) -> __m128i;
18+
}
19+
20+
#[cfg(test)]
21+
mod tests {
22+
use v128::*;
23+
use x86::sse41;
24+
25+
#[test]
26+
#[target_feature = "+sse4.2"]
27+
fn _mm_blendv_epi8() {
28+
let a = i8x16::new(
29+
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
30+
let b = i8x16::new(
31+
16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31);
32+
let mask = i8x16::new(
33+
0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1);
34+
let e = i8x16::new(
35+
0, 17, 2, 19, 4, 21, 6, 23, 8, 25, 10, 27, 12, 29, 14, 31);
36+
assert_eq!(sse41::_mm_blendv_epi8(a, b, mask), e);
37+
}
38+
}

0 commit comments

Comments
 (0)