1use core::arch::x86_64::{_mm_cvtss_f32, _mm_cvtss_si32, _mm_cvttss_si32, _mm_set_ss, _mm_sqrt_ss};
6
7#[inline]
9pub fn cvtt(x: f32) -> i32 {
10 unsafe { _mm_cvttss_si32(_mm_set_ss(x)) }
12}
13
14#[inline]
16pub fn cvt(x: f32) -> i32 {
17 unsafe { _mm_cvtss_si32(_mm_set_ss(x)) }
19}
20
21#[inline]
22pub fn sqrt(x: f32) -> f32 {
23 unsafe { _mm_cvtss_f32(_mm_sqrt_ss(_mm_set_ss(x))) }
25}
26
27#[inline]
29pub fn minss(a: f32, b: f32) -> f32 {
30 if a < b { a } else { b }
31}
32
33#[inline]
35pub fn maxss(a: f32, b: f32) -> f32 {
36 if a > b { a } else { b }
37}
38
39#[inline]
41pub fn floor_i(x: f32) -> i32 {
42 let t = cvtt(x);
43 if (t as f32) > x { t.wrapping_sub(1) } else { t }
44}
45
46#[inline]
47pub fn ceil_i(x: f32) -> i32 {
48 let t = cvtt(x);
49 if (t as f32) < x { t.wrapping_add(1) } else { t }
50}
51
52#[inline]
55pub fn div255(x: u32) -> u32 {
56 debug_assert!(x < 1 << 24, "div255 is for x <= 65025");
57 ((x + 128) * 257) >> 16
58}
59
60#[inline]
64pub fn sqrtd(x: f64) -> f64 {
65 use core::arch::x86_64::{_mm_cvtsd_f64, _mm_set_sd, _mm_sqrt_pd};
66 unsafe { _mm_cvtsd_f64(_mm_sqrt_pd(_mm_set_sd(x))) }
68}
69
70#[inline]
72pub fn maxsd(a: f64, b: f64) -> f64 {
73 if a > b { a } else { b }
74}
75
76#[inline]
78pub fn minsd(a: f64, b: f64) -> f64 {
79 if a < b { a } else { b }
80}
81
82#[inline]
84pub fn cvttd(x: f64) -> i32 {
85 use core::arch::x86_64::{_mm_cvttsd_si32, _mm_set_sd};
86 unsafe { _mm_cvttsd_si32(_mm_set_sd(x)) }
88}
89
90#[inline]
92pub fn cvtd(x: f64) -> i32 {
93 use core::arch::x86_64::{_mm_cvtsd_si32, _mm_set_sd};
94 unsafe { _mm_cvtsd_si32(_mm_set_sd(x)) }
96}
97
98#[inline]
100pub fn cvtd64(x: f64) -> i64 {
101 use core::arch::x86_64::{_mm_cvtsd_si64, _mm_set_sd};
102 unsafe { _mm_cvtsd_si64(_mm_set_sd(x)) }
104}
105
106#[inline]
108pub fn cvttd64(x: f64) -> i64 {
109 use core::arch::x86_64::{_mm_cvttsd_si64, _mm_set_sd};
110 unsafe { _mm_cvttsd_si64(_mm_set_sd(x)) }
112}