Add bindings for _mm_blendv_epi8

Just wanted to test this out!
This commit is contained in:
Alex Crichton 2017-06-19 11:29:37 -07:00 committed by Andrew Gallant
parent 91a4849bba
commit 1450e641a5
2 changed files with 41 additions and 1 deletions

View file

@ -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;
mod avx2;

View file

@ -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);
}
}