use std::mem::transmute;
pub const ROUND_NEAR_EVEN: u8 = 0;
pub const ROUND_MIN_MAG: u8 = 1;
pub const ROUND_MIN: u8 = 2;
pub const ROUND_MAX: u8 = 3;
pub const ROUND_NEAR_MAXMAG: u8 = 4;
pub const FLAG_INEXACT: u8 = 1;
pub const FLAG_UNDERFLOW: u8 = 2;
pub const FLAG_OVERFLOW: u8 = 4;
pub const FLAG_INFINITE: u8 = 8;
pub const FLAG_INVALID: u8 = 16;
#[repr(C)]
#[derive(Clone,Copy,Debug)]
#[cfg_attr(feature = "serialize", derive(Serialize,Deserialize))]
pub struct Sf32(pub u32);
impl Sf32 {
pub const NAN: Sf32 = Sf32(0x7fc0_0000);
pub fn negate(self) -> Sf32 {
Sf32(self.0 ^ 0x8000_0000)
}
}
impl From<f32> for Sf32 {
fn from(x: f32) -> Sf32 {
unsafe { transmute(x) }
}
}
impl From<Sf32> for f32 {
fn from(x: Sf32) -> f32 {
unsafe { transmute(x) }
}
}
#[repr(C)]
#[derive(Clone,Copy,Debug)]
#[cfg_attr(feature = "serialize", derive(Serialize,Deserialize))]
pub struct Sf64(pub u64);
impl Sf64 {
pub const NAN: Sf64 = Sf64(0x7ff8_0000_0000_0000);
pub fn negate(self) -> Sf64 {
Sf64(self.0 ^ 0x8000_0000_0000_0000)
}
}
impl From<f64> for Sf64 {
fn from(x: f64) -> Sf64 {
unsafe { transmute(x) }
}
}
impl From<Sf64> for f64 {
fn from(x: Sf64) -> f64 {
unsafe { transmute(x) }
}
}
impl From<Sf32> for Sf64 {
fn from(x: Sf32) -> Sf64 {
Sf64(0xffff_ffff_0000_0000 | u64::from(x.0))
}
}
impl From<Sf64> for Sf32 {
fn from(x: Sf64) -> Sf32 {
Sf32(x.0 as u32)
}
}
impl From<f32> for Sf64 {
fn from(x: f32) -> Sf64 {
Sf32::from(x).into()
}
}
impl From<Sf64> for f32 {
fn from(x: Sf64) -> f32 {
Sf32::from(x).into()
}
}
extern "C" {
#[link_name = "softfloat_getFlags"]
pub fn get_flags() -> u8;
#[link_name = "softfloat_setFlags"]
pub fn set_flags(arg1: u8);
#[link_name = "softfloat_raiseFlags"]
pub fn raise_flags(arg1: u8);
#[link_name = "softfloat_getRoundingMode"]
pub fn get_rounding_mode() -> u8;
#[link_name = "softfloat_setRoundingMode"]
pub fn set_rounding_mode(arg1: u8);
#[link_name = "ui32_to_f32"]
pub fn u32_to_f32(arg1: u32) -> Sf32;
#[link_name = "ui32_to_f64"]
pub fn u32_to_f64(arg1: u32) -> Sf64;
pub fn i32_to_f32(arg1: i32) -> Sf32;
pub fn i32_to_f64(arg1: i32) -> Sf64;
#[link_name = "f32_to_ui32"]
pub fn f32_to_u32(arg1: Sf32, arg2: u8, arg3: bool) -> u32;
pub fn f32_to_i32(arg1: Sf32, arg2: u8, arg3: bool) -> i32;
pub fn f32_to_f64(arg1: Sf32) -> Sf64;
pub fn f32_add(arg1: Sf32, arg2: Sf32) -> Sf32;
pub fn f32_sub(arg1: Sf32, arg2: Sf32) -> Sf32;
pub fn f32_mul(arg1: Sf32, arg2: Sf32) -> Sf32;
pub fn f32_mulAdd(arg1: Sf32, arg2: Sf32, arg3: Sf32) -> Sf32;
pub fn f32_div(arg1: Sf32, arg2: Sf32) -> Sf32;
pub fn f32_rem(arg1: Sf32, arg2: Sf32) -> Sf32;
pub fn f32_sqrt(arg1: Sf32) -> Sf32;
pub fn f32_eq(arg1: Sf32, arg2: Sf32) -> bool;
pub fn f32_le(arg1: Sf32, arg2: Sf32) -> bool;
pub fn f32_lt(arg1: Sf32, arg2: Sf32) -> bool;
#[link_name = "f32_isSignalingNaN"]
pub fn f32_is_signaling_nan(arg1: Sf32) -> bool;
#[link_name = "f64_to_ui32"]
pub fn f64_to_u32(arg1: Sf64, arg2: u8, arg3: bool) -> u32;
pub fn f64_to_i32(arg1: Sf64, arg2: u8, arg3: bool) -> i32;
pub fn f64_to_f32(arg1: Sf64) -> Sf32;
pub fn f64_add(arg1: Sf64, arg2: Sf64) -> Sf64;
pub fn f64_sub(arg1: Sf64, arg2: Sf64) -> Sf64;
pub fn f64_mul(arg1: Sf64, arg2: Sf64) -> Sf64;
pub fn f64_mulAdd(arg1: Sf64, arg2: Sf64, arg3: Sf64) -> Sf64;
pub fn f64_div(arg1: Sf64, arg2: Sf64) -> Sf64;
pub fn f64_rem(arg1: Sf64, arg2: Sf64) -> Sf64;
pub fn f64_sqrt(arg1: Sf64) -> Sf64;
pub fn f64_eq(arg1: Sf64, arg2: Sf64) -> bool;
pub fn f64_le(arg1: Sf64, arg2: Sf64) -> bool;
pub fn f64_lt(arg1: Sf64, arg2: Sf64) -> bool;
#[link_name = "f64_isSignalingNaN"]
pub fn f64_is_signaling_nan(arg1: Sf64) -> bool;
}