use core::arch::x86_64::{_mm_cvtss_f32, _mm_cvtss_si32, _mm_cvttss_si32, _mm_set_ss, _mm_sqrt_ss};
#[inline]
pub fn cvtt(x: f32) -> i32 {
unsafe { _mm_cvttss_si32(_mm_set_ss(x)) }
}
#[inline]
pub fn cvt(x: f32) -> i32 {
unsafe { _mm_cvtss_si32(_mm_set_ss(x)) }
}
#[inline]
pub fn sqrt(x: f32) -> f32 {
unsafe { _mm_cvtss_f32(_mm_sqrt_ss(_mm_set_ss(x))) }
}
#[inline]
pub fn minss(a: f32, b: f32) -> f32 {
if a < b { a } else { b }
}
#[inline]
pub fn maxss(a: f32, b: f32) -> f32 {
if a > b { a } else { b }
}
#[inline]
pub fn floor_i(x: f32) -> i32 {
let t = cvtt(x);
if (t as f32) > x { t.wrapping_sub(1) } else { t }
}
#[inline]
pub fn ceil_i(x: f32) -> i32 {
let t = cvtt(x);
if (t as f32) < x { t.wrapping_add(1) } else { t }
}
#[inline]
pub fn div255(x: u32) -> u32 {
debug_assert!(x < 1 << 24, "div255 is for x <= 65025");
((x + 128) * 257) >> 16
}
#[inline]
pub fn sqrtd(x: f64) -> f64 {
use core::arch::x86_64::{_mm_cvtsd_f64, _mm_set_sd, _mm_sqrt_pd};
unsafe { _mm_cvtsd_f64(_mm_sqrt_pd(_mm_set_sd(x))) }
}
#[inline]
pub fn maxsd(a: f64, b: f64) -> f64 {
if a > b { a } else { b }
}
#[inline]
pub fn minsd(a: f64, b: f64) -> f64 {
if a < b { a } else { b }
}
#[inline]
pub fn cvttd(x: f64) -> i32 {
use core::arch::x86_64::{_mm_cvttsd_si32, _mm_set_sd};
unsafe { _mm_cvttsd_si32(_mm_set_sd(x)) }
}
#[inline]
pub fn cvtd(x: f64) -> i32 {
use core::arch::x86_64::{_mm_cvtsd_si32, _mm_set_sd};
unsafe { _mm_cvtsd_si32(_mm_set_sd(x)) }
}
#[inline]
pub fn cvtd64(x: f64) -> i64 {
use core::arch::x86_64::{_mm_cvtsd_si64, _mm_set_sd};
unsafe { _mm_cvtsd_si64(_mm_set_sd(x)) }
}
#[inline]
pub fn cvttd64(x: f64) -> i64 {
use core::arch::x86_64::{_mm_cvttsd_si64, _mm_set_sd};
unsafe { _mm_cvttsd_si64(_mm_set_sd(x)) }
}