use crate::intrin::abs::Abs;
use crate::vektor::x86_64::*;
use crate::vektor::x86::*;
use crate::vektor::x86::*;
use crate::arch::current::vecs::*;
use crate::core::mem::transmute;
impl Abs for f32x4 {
type Out = f32x4;
#[inline(always)]
#[cfg(target_feature = "sse")]
fn abs(&self) -> Self::Out {
optimized!();
unsafe { _mm_and_ps(*self, Self::splat(transmute::<u32, f32>(0x7FFFFFFF))) }
}
#[inline(always)]
#[cfg(not(target_feature = "sse"))]
fn abs(&self) -> Self::Out {
fallback!();
Self::Out::new(self.extract(0).abs(),
self.extract(1).abs(),
self.extract(2).abs(),
self.extract(3).abs())
}
}
impl Abs for f64x2 {
type Out = f64x2;
#[inline(always)]
#[cfg(target_feature = "sse2")]
fn abs(&self) -> Self::Out {
optimized!();
unsafe { _mm_and_pd(*self, Self::splat(transmute::<u64, f64>(0x7FFFFFFFFFFFFFFF))) }
}
#[inline(always)]
#[cfg(not(target_feature = "sse2"))]
fn abs(&self) -> Self::Out {
fallback!();
Self::Out::new(self.extract(0).abs(),
self.extract(1).abs())
}
}
impl Abs for f32x8 {
type Out = f32x8;
#[inline(always)]
#[cfg(target_feature = "avx")]
fn abs(&self) -> Self::Out {
optimized!();
unsafe { _mm256_and_ps(*self, Self::splat(transmute::<u32, f32>(0x7FFFFFFF))) }
}
#[inline(always)]
#[cfg(not(target_feature = "avx"))]
fn abs(&self) -> Self::Out {
fallback!();
Self::Out::new(self.extract(0).abs(),
self.extract(1).abs(),
self.extract(2).abs(),
self.extract(3).abs(),
self.extract(4).abs(),
self.extract(5).abs(),
self.extract(6).abs(),
self.extract(7).abs())
}
}
impl Abs for f64x4 {
type Out = f64x4;
#[inline(always)]
#[cfg(target_feature = "avx")]
fn abs(&self) -> Self::Out {
optimized!();
unsafe { _mm256_and_pd(*self, Self::splat(transmute::<u64, f64>(0x7FFFFFFFFFFFFFFF))) }
}
#[inline(always)]
#[cfg(not(target_feature = "avx"))]
fn abs(&self) -> Self::Out {
fallback!();
Self::Out::new(self.extract(0).abs(),
self.extract(1).abs(),
self.extract(2).abs(),
self.extract(3).abs())
}
}
impl Abs for i8x16 {
type Out = u8x16;
#[inline(always)]
#[cfg(target_feature = "ssse3")]
fn abs(&self) -> Self::Out {
optimized!();
unsafe { _mm_abs_epi8(*self) }
}
#[inline(always)]
#[cfg(not(target_feature = "ssse3"))]
fn abs(&self) -> Self::Out {
fallback!();
Self::Out::new(unsafe { transmute::<i8, u8>(self.extract(0).overflowing_abs().0) },
unsafe { transmute::<i8, u8>(self.extract(1).overflowing_abs().0) },
unsafe { transmute::<i8, u8>(self.extract(2).overflowing_abs().0) },
unsafe { transmute::<i8, u8>(self.extract(3).overflowing_abs().0) },
unsafe { transmute::<i8, u8>(self.extract(4).overflowing_abs().0) },
unsafe { transmute::<i8, u8>(self.extract(5).overflowing_abs().0) },
unsafe { transmute::<i8, u8>(self.extract(6).overflowing_abs().0) },
unsafe { transmute::<i8, u8>(self.extract(7).overflowing_abs().0) },
unsafe { transmute::<i8, u8>(self.extract(8).overflowing_abs().0) },
unsafe { transmute::<i8, u8>(self.extract(9).overflowing_abs().0) },
unsafe { transmute::<i8, u8>(self.extract(10).overflowing_abs().0) },
unsafe { transmute::<i8, u8>(self.extract(11).overflowing_abs().0) },
unsafe { transmute::<i8, u8>(self.extract(12).overflowing_abs().0) },
unsafe { transmute::<i8, u8>(self.extract(13).overflowing_abs().0) },
unsafe { transmute::<i8, u8>(self.extract(14).overflowing_abs().0) },
unsafe { transmute::<i8, u8>(self.extract(15).overflowing_abs().0) })
}
}
impl Abs for i16x8 {
type Out = u16x8;
#[inline(always)]
#[cfg(target_feature = "ssse3")]
fn abs(&self) -> Self::Out {
optimized!();
unsafe { _mm_abs_epi16(*self) }
}
#[inline(always)]
#[cfg(not(target_feature = "ssse3"))]
fn abs(&self) -> Self::Out {
fallback!();
Self::Out::new(unsafe { transmute::<i16, u16>(self.extract(0).overflowing_abs().0) },
unsafe { transmute::<i16, u16>(self.extract(1).overflowing_abs().0) },
unsafe { transmute::<i16, u16>(self.extract(2).overflowing_abs().0) },
unsafe { transmute::<i16, u16>(self.extract(3).overflowing_abs().0) },
unsafe { transmute::<i16, u16>(self.extract(4).overflowing_abs().0) },
unsafe { transmute::<i16, u16>(self.extract(5).overflowing_abs().0) },
unsafe { transmute::<i16, u16>(self.extract(6).overflowing_abs().0) },
unsafe { transmute::<i16, u16>(self.extract(7).overflowing_abs().0) })
}
}
impl Abs for i32x4 {
type Out = u32x4;
#[inline(always)]
#[cfg(target_feature = "ssse3")]
fn abs(&self) -> Self::Out {
optimized!();
unsafe { _mm_abs_epi32(*self) }
}
#[inline(always)]
#[cfg(not(target_feature = "ssse3"))]
fn abs(&self) -> Self::Out {
fallback!();
Self::Out::new(unsafe { transmute::<i32, u32>(self.extract(0).overflowing_abs().0) },
unsafe { transmute::<i32, u32>(self.extract(1).overflowing_abs().0) },
unsafe { transmute::<i32, u32>(self.extract(2).overflowing_abs().0) },
unsafe { transmute::<i32, u32>(self.extract(3).overflowing_abs().0) })
}
}
impl Abs for i8x32 {
type Out = u8x32;
#[inline(always)]
#[cfg(target_feature = "avx2")]
fn abs(&self) -> Self::Out {
optimized!();
unsafe { _mm256_abs_epi8(*self) }
}
#[inline(always)]
#[cfg(not(target_feature = "avx2"))]
fn abs(&self) -> Self::Out {
fallback!();
Self::Out::new(unsafe { transmute::<i8, u8>(self.extract(0).overflowing_abs().0) },
unsafe { transmute::<i8, u8>(self.extract(1).overflowing_abs().0) },
unsafe { transmute::<i8, u8>(self.extract(2).overflowing_abs().0) },
unsafe { transmute::<i8, u8>(self.extract(3).overflowing_abs().0) },
unsafe { transmute::<i8, u8>(self.extract(4).overflowing_abs().0) },
unsafe { transmute::<i8, u8>(self.extract(5).overflowing_abs().0) },
unsafe { transmute::<i8, u8>(self.extract(6).overflowing_abs().0) },
unsafe { transmute::<i8, u8>(self.extract(7).overflowing_abs().0) },
unsafe { transmute::<i8, u8>(self.extract(8).overflowing_abs().0) },
unsafe { transmute::<i8, u8>(self.extract(9).overflowing_abs().0) },
unsafe { transmute::<i8, u8>(self.extract(10).overflowing_abs().0) },
unsafe { transmute::<i8, u8>(self.extract(11).overflowing_abs().0) },
unsafe { transmute::<i8, u8>(self.extract(12).overflowing_abs().0) },
unsafe { transmute::<i8, u8>(self.extract(13).overflowing_abs().0) },
unsafe { transmute::<i8, u8>(self.extract(14).overflowing_abs().0) },
unsafe { transmute::<i8, u8>(self.extract(15).overflowing_abs().0) },
unsafe { transmute::<i8, u8>(self.extract(16).overflowing_abs().0) },
unsafe { transmute::<i8, u8>(self.extract(17).overflowing_abs().0) },
unsafe { transmute::<i8, u8>(self.extract(18).overflowing_abs().0) },
unsafe { transmute::<i8, u8>(self.extract(19).overflowing_abs().0) },
unsafe { transmute::<i8, u8>(self.extract(20).overflowing_abs().0) },
unsafe { transmute::<i8, u8>(self.extract(21).overflowing_abs().0) },
unsafe { transmute::<i8, u8>(self.extract(22).overflowing_abs().0) },
unsafe { transmute::<i8, u8>(self.extract(23).overflowing_abs().0) },
unsafe { transmute::<i8, u8>(self.extract(24).overflowing_abs().0) },
unsafe { transmute::<i8, u8>(self.extract(25).overflowing_abs().0) },
unsafe { transmute::<i8, u8>(self.extract(26).overflowing_abs().0) },
unsafe { transmute::<i8, u8>(self.extract(27).overflowing_abs().0) },
unsafe { transmute::<i8, u8>(self.extract(28).overflowing_abs().0) },
unsafe { transmute::<i8, u8>(self.extract(29).overflowing_abs().0) },
unsafe { transmute::<i8, u8>(self.extract(30).overflowing_abs().0) },
unsafe { transmute::<i8, u8>(self.extract(31).overflowing_abs().0) })
}
}
impl Abs for i16x16 {
type Out = u16x16;
#[inline(always)]
#[cfg(target_feature = "avx2")]
fn abs(&self) -> Self::Out {
optimized!();
unsafe { _mm256_abs_epi16(*self) }
}
#[inline(always)]
#[cfg(not(target_feature = "avx2"))]
fn abs(&self) -> Self::Out {
fallback!();
Self::Out::new(unsafe { transmute::<i16, u16>(self.extract(0).overflowing_abs().0) },
unsafe { transmute::<i16, u16>(self.extract(1).overflowing_abs().0) },
unsafe { transmute::<i16, u16>(self.extract(2).overflowing_abs().0) },
unsafe { transmute::<i16, u16>(self.extract(3).overflowing_abs().0) },
unsafe { transmute::<i16, u16>(self.extract(4).overflowing_abs().0) },
unsafe { transmute::<i16, u16>(self.extract(5).overflowing_abs().0) },
unsafe { transmute::<i16, u16>(self.extract(6).overflowing_abs().0) },
unsafe { transmute::<i16, u16>(self.extract(7).overflowing_abs().0) },
unsafe { transmute::<i16, u16>(self.extract(8).overflowing_abs().0) },
unsafe { transmute::<i16, u16>(self.extract(9).overflowing_abs().0) },
unsafe { transmute::<i16, u16>(self.extract(10).overflowing_abs().0) },
unsafe { transmute::<i16, u16>(self.extract(11).overflowing_abs().0) },
unsafe { transmute::<i16, u16>(self.extract(12).overflowing_abs().0) },
unsafe { transmute::<i16, u16>(self.extract(13).overflowing_abs().0) },
unsafe { transmute::<i16, u16>(self.extract(14).overflowing_abs().0) },
unsafe { transmute::<i16, u16>(self.extract(15).overflowing_abs().0) })
}
}
impl Abs for i32x8 {
type Out = u32x8;
#[inline(always)]
#[cfg(target_feature = "avx2")]
fn abs(&self) -> Self::Out {
optimized!();
unsafe { _mm256_abs_epi32(*self) }
}
#[inline(always)]
#[cfg(not(target_feature = "avx2"))]
fn abs(&self) -> Self::Out {
fallback!();
Self::Out::new(unsafe { transmute::<i32, u32>(self.extract(0).overflowing_abs().0) },
unsafe { transmute::<i32, u32>(self.extract(1).overflowing_abs().0) },
unsafe { transmute::<i32, u32>(self.extract(2).overflowing_abs().0) },
unsafe { transmute::<i32, u32>(self.extract(3).overflowing_abs().0) },
unsafe { transmute::<i32, u32>(self.extract(4).overflowing_abs().0) },
unsafe { transmute::<i32, u32>(self.extract(5).overflowing_abs().0) },
unsafe { transmute::<i32, u32>(self.extract(6).overflowing_abs().0) },
unsafe { transmute::<i32, u32>(self.extract(7).overflowing_abs().0) })
}
}
impl Abs for i64x2 {
type Out = u64x2;
#[inline(always)]
fn abs(&self) -> Self::Out {
fallback!();
Self::Out::new(unsafe { transmute::<i64, u64>(self.extract(0).overflowing_abs().0) },
unsafe { transmute::<i64, u64>(self.extract(1).overflowing_abs().0) })
}
}
impl Abs for i64x4 {
type Out = u64x4;
#[inline(always)]
fn abs(&self) -> Self::Out {
fallback!();
Self::Out::new(unsafe { transmute::<i64, u64>(self.extract(0).overflowing_abs().0) },
unsafe { transmute::<i64, u64>(self.extract(1).overflowing_abs().0) },
unsafe { transmute::<i64, u64>(self.extract(2).overflowing_abs().0) },
unsafe { transmute::<i64, u64>(self.extract(3).overflowing_abs().0) })
}
}
impl Abs for i64x8 {
type Out = u64x8;
#[inline(always)]
fn abs(&self) -> Self::Out {
fallback!();
Self::Out::new(unsafe { transmute::<i64, u64>(self.extract(0).overflowing_abs().0) },
unsafe { transmute::<i64, u64>(self.extract(1).overflowing_abs().0) },
unsafe { transmute::<i64, u64>(self.extract(2).overflowing_abs().0) },
unsafe { transmute::<i64, u64>(self.extract(3).overflowing_abs().0) },
unsafe { transmute::<i64, u64>(self.extract(4).overflowing_abs().0) },
unsafe { transmute::<i64, u64>(self.extract(5).overflowing_abs().0) },
unsafe { transmute::<i64, u64>(self.extract(6).overflowing_abs().0) },
unsafe { transmute::<i64, u64>(self.extract(7).overflowing_abs().0) })
}
}