Skip to content

Commit

Permalink
Fix some typos/bugs with float comparison intrinsics
Browse files Browse the repository at this point in the history
* I believe `__gtdf2` erroneously used `f32` instead of `f64`
* Most of these needed `#[arm_aeabi_alias]` to ensure they're correctly called
  through the alias
* Some existing aliases were corrected with the right names
  • Loading branch information
alexcrichton committed Jan 24, 2018
1 parent 22f76e3 commit 683af61
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 5 deletions.
2 changes: 0 additions & 2 deletions build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5430,10 +5430,8 @@ mod c {
if target_arch == "arm" && target_os != "ios" {
sources.extend(
&[
"arm/aeabi_dcmp.S",
"arm/aeabi_div0.c",
"arm/aeabi_drsub.c",
"arm/aeabi_fcmp.S",
"arm/aeabi_frsub.c",
"arm/bswapdi2.S",
"arm/bswapsi2.S",
Expand Down
18 changes: 15 additions & 3 deletions src/float/cmp.rs
Original file line number Diff line number Diff line change
Expand Up @@ -112,61 +112,73 @@ fn unord<F: Float>(a: F, b: F) -> bool where
}

intrinsics! {
#[arm_aeabi_alias = __aeabi_fcmple]
pub extern "C" fn __lesf2(a: f32, b: f32) -> i32 {
cmp(a, b).to_le_abi()
}

#[arm_aeabi_alias = __aeabi_fcmpge]
pub extern "C" fn __gesf2(a: f32, b: f32) -> i32 {
cmp(a, b).to_ge_abi()
}

#[arm_aeabi_alias = fcmpun]
#[arm_aeabi_alias = __aeabi_fcmpun]
pub extern "C" fn __unordsf2(a: f32, b: f32) -> i32 {
unord(a, b) as i32
}

#[arm_aeabi_alias = __aeabi_fcmpeq]
pub extern "C" fn __eqsf2(a: f32, b: f32) -> i32 {
cmp(a, b).to_le_abi()
}

#[arm_aeabi_alias = __aeabi_fcmplt]
pub extern "C" fn __ltsf2(a: f32, b: f32) -> i32 {
cmp(a, b).to_le_abi()
}

#[arm_aeabi_alias = __aeabi_fcmpne]
pub extern "C" fn __nesf2(a: f32, b: f32) -> i32 {
cmp(a, b).to_le_abi()
}

#[arm_aeabi_alias = __aeabi_fcmpgt]
pub extern "C" fn __gtsf2(a: f32, b: f32) -> i32 {
cmp(a, b).to_ge_abi()
}

#[arm_aeabi_alias = __aeabi_dcmple]
pub extern "C" fn __ledf2(a: f64, b: f64) -> i32 {
cmp(a, b).to_le_abi()
}

#[arm_aeabi_alias = __aeabi_dcmpge]
pub extern "C" fn __gedf2(a: f64, b: f64) -> i32 {
cmp(a, b).to_ge_abi()
}

#[arm_aeabi_alias = dcmpun]
#[arm_aeabi_alias = __aeabi_dcmpun]
pub extern "C" fn __unorddf2(a: f64, b: f64) -> i32 {
unord(a, b) as i32
}

#[arm_aeabi_alias = __aeabi_dcmpeq]
pub extern "C" fn __eqdf2(a: f64, b: f64) -> i32 {
cmp(a, b).to_le_abi()
}

#[arm_aeabi_alias = __aeabi_dcmplt]
pub extern "C" fn __ltdf2(a: f64, b: f64) -> i32 {
cmp(a, b).to_le_abi()
}

#[arm_aeabi_alias = __aeabi_dcmpne]
pub extern "C" fn __nedf2(a: f64, b: f64) -> i32 {
cmp(a, b).to_le_abi()
}

pub extern "C" fn __gtdf2(a: f32, b: f32) -> i32 {
#[arm_aeabi_alias = __aeabi_dcmpgt]
pub extern "C" fn __gtdf2(a: f64, b: f64) -> i32 {
cmp(a, b).to_ge_abi()
}
}

0 comments on commit 683af61

Please sign in to comment.