#![allow(non_camel_case_types)]
use core::ops::{Add, AddAssign, Div, DivAssign, Mul, MulAssign, Sub, SubAssign};
#[cfg(target_arch = "x86")]
use core::arch::x86::*;
#[cfg(target_arch = "x86_64")]
use core::arch::x86_64::*;
#[derive(Copy, Clone)]
#[repr(transparent)]
pub struct f32x4(__m128);
impl f32x4 {
#[inline(always)]
pub fn new(x0: f32, x1: f32, x2: f32, x3: f32) -> Self {
f32x4(unsafe { _mm_set_ps(x3, x2, x1, x0) })
}
#[inline(always)]
pub fn new_u32(x0: u32, x1: u32, x2: u32, x3: u32) -> Self {
f32x4(unsafe {
_mm_set_ps(
core::mem::transmute(x3),
core::mem::transmute(x2),
core::mem::transmute(x1),
core::mem::transmute(x0),
)
})
}
#[inline(always)]
pub fn splat(value: f32) -> Self {
f32x4(unsafe { _mm_set1_ps(value) })
}
pub fn sub_integer(&self, other: f32x4) -> f32x4 {
f32x4(unsafe { _mm_castsi128_ps(_mm_sub_epi32(_mm_castps_si128(self.0), _mm_castps_si128(other.0))) })
}
#[inline(always)]
pub fn zero() -> Self {
f32x4(unsafe { _mm_setzero_ps() })
}
#[inline(always)]
pub fn copied(self) -> (f32, f32, f32, f32) {
unsafe { core::mem::transmute(self.0) }
}
#[inline(always)]
pub fn trunc(self) -> Self {
unsafe { f32x4(_mm_cvtepi32_ps(_mm_cvttps_epi32(self.0))) }
}
#[inline(always)]
pub fn sqrt(self) -> Self {
unsafe { f32x4(_mm_sqrt_ps(self.0)) }
}
}
impl Add for f32x4 {
type Output = f32x4;
#[inline(always)]
fn add(self, other: f32x4) -> f32x4 {
unsafe { f32x4(_mm_add_ps(self.0, other.0)) }
}
}
impl AddAssign for f32x4 {
#[inline(always)]
fn add_assign(&mut self, other: f32x4) {
self.0 = unsafe { _mm_add_ps(self.0, other.0) };
}
}
impl Sub for f32x4 {
type Output = f32x4;
#[inline(always)]
fn sub(self, other: f32x4) -> f32x4 {
unsafe { f32x4(_mm_sub_ps(self.0, other.0)) }
}
}
impl SubAssign for f32x4 {
#[inline(always)]
fn sub_assign(&mut self, other: f32x4) {
self.0 = unsafe { _mm_sub_ps(self.0, other.0) };
}
}
impl Mul for f32x4 {
type Output = f32x4;
#[inline(always)]
fn mul(self, other: f32x4) -> f32x4 {
unsafe { f32x4(_mm_mul_ps(self.0, other.0)) }
}
}
impl MulAssign for f32x4 {
#[inline(always)]
fn mul_assign(&mut self, other: f32x4) {
self.0 = unsafe { _mm_mul_ps(self.0, other.0) };
}
}
impl Div for f32x4 {
type Output = f32x4;
#[inline(always)]
fn div(self, other: f32x4) -> f32x4 {
unsafe { f32x4(_mm_div_ps(self.0, other.0)) }
}
}
impl DivAssign for f32x4 {
#[inline(always)]
fn div_assign(&mut self, other: f32x4) {
self.0 = unsafe { _mm_div_ps(self.0, other.0) };
}
}