#[cfg(not(all(any(target_arch = "x86", target_arch = "x86_64"), feature = "simd")))]
pub fn sqrt(x: f32) -> f32 {
const TINY: f32 = 1.0e-30;
let mut z: f32;
let sign: i32 = 0x80000000u32 as i32;
let mut ix: i32;
let mut s: i32;
let mut q: i32;
let mut m: i32;
let mut t: i32;
let mut i: i32;
let mut r: u32;
ix = x.to_bits() as i32;
if (ix as u32 & 0x7f800000) == 0x7f800000 {
return x * x + x;
}
if ix <= 0 {
if (ix & !sign) == 0 {
return x;
}
if ix < 0 {
#[allow(clippy::eq_op)] return (x - x) / (x - x);
}
}
m = ix >> 23;
if m == 0 {
i = 0;
while ix & 0x00800000 == 0 {
ix <<= 1;
i = i + 1;
}
m -= i - 1;
}
m -= 127;
ix = (ix & 0x007fffff) | 0x00800000;
if m & 1 == 1 {
ix += ix;
}
m >>= 1;
ix += ix;
q = 0;
s = 0;
r = 0x01000000;
while r != 0 {
t = s + r as i32;
if t <= ix {
s = t + r as i32;
ix -= t;
q += r as i32;
}
ix += ix;
r >>= 1;
}
if ix != 0 {
z = 1.0 - TINY;
if z >= 1.0 {
z = 1.0 + TINY;
if z > 1.0 {
q += 2;
} else {
q += q & 1;
}
}
}
ix = (q >> 1) + 0x3f000000;
ix += m << 23;
f32::from_bits(ix as u32)
}
#[cfg(all(any(target_arch = "x86", target_arch = "x86_64"), feature = "simd"))]
#[inline(always)]
pub fn sqrt(value: f32) -> f32 {
#[cfg(target_arch = "x86")]
use core::arch::x86::*;
#[cfg(target_arch = "x86_64")]
use core::arch::x86_64::*;
unsafe { _mm_cvtss_f32(_mm_sqrt_ss(_mm_set_ss(value))) }
}