From 1b1af90cd756ec248a18ce4b8561b89802079184 Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Mon, 19 Jun 2017 11:29:37 -0700 Subject: [PATCH] Add bindings for _mm_blendv_epi8 Just wanted to test this out! --- src/x86/mod.rs | 4 +++- src/x86/sse41.rs | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 src/x86/sse41.rs diff --git a/src/x86/mod.rs b/src/x86/mod.rs index 839b531556..15d335b172 100644 --- a/src/x86/mod.rs +++ b/src/x86/mod.rs @@ -1,6 +1,7 @@ pub use self::sse::*; pub use self::sse2::*; pub use self::ssse3::*; +pub use self::sse41::*; pub use self::sse42::*; pub use self::avx::*; pub use self::avx2::*; @@ -13,6 +14,7 @@ pub type __m256i = ::v256::i8x32; mod sse; mod sse2; mod ssse3; +mod sse41; mod sse42; mod avx; -mod avx2; \ No newline at end of file +mod avx2; diff --git a/src/x86/sse41.rs b/src/x86/sse41.rs new file mode 100644 index 0000000000..2f4a8a307d --- /dev/null +++ b/src/x86/sse41.rs @@ -0,0 +1,38 @@ +// use v128::*; +use x86::__m128i; + +#[inline(always)] +#[target_feature = "+sse4.1"] +pub fn _mm_blendv_epi8( + a: __m128i, + b: __m128i, + mask: __m128i, +) -> __m128i { + unsafe { pblendvb(a, b, mask) } +} + +#[allow(improper_ctypes)] +extern { + #[link_name = "llvm.x86.sse41.pblendvb"] + fn pblendvb(a: __m128i, b: __m128i, mask: __m128i) -> __m128i; +} + +#[cfg(test)] +mod tests { + use v128::*; + use x86::sse41; + + #[test] + #[target_feature = "+sse4.2"] + fn _mm_blendv_epi8() { + let a = i8x16::new( + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15); + let b = i8x16::new( + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31); + let mask = i8x16::new( + 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1); + let e = i8x16::new( + 0, 17, 2, 19, 4, 21, 6, 23, 8, 25, 10, 27, 12, 29, 14, 31); + assert_eq!(sse41::_mm_blendv_epi8(a, b, mask), e); + } +}