From 07c82d220028bb89c9977e59fc0f0e26f2a517b0 Mon Sep 17 00:00:00 2001 From: Paolo Teti Date: Sun, 4 Feb 2018 09:48:06 +0100 Subject: [PATCH] Fix __aeabi_fcmple and add test cases `le` in __aeabi_fcmple means `less or equal` --- library/compiler-builtins/src/float/cmp.rs | 2 +- library/compiler-builtins/testcrate/build.rs | 92 ++++++++++++++++++++ 2 files changed, 93 insertions(+), 1 deletion(-) diff --git a/library/compiler-builtins/src/float/cmp.rs b/library/compiler-builtins/src/float/cmp.rs index e3c584084adc..4986d056052b 100644 --- a/library/compiler-builtins/src/float/cmp.rs +++ b/library/compiler-builtins/src/float/cmp.rs @@ -174,7 +174,7 @@ intrinsics! { #[cfg(target_arch = "arm")] intrinsics! { pub extern "aapcs" fn __aeabi_fcmple(a: f32, b: f32) -> i32 { - (__lesf2(a, b) < 0) as i32 + (__lesf2(a, b) <= 0) as i32 } pub extern "aapcs" fn __aeabi_fcmpge(a: f32, b: f32) -> i32 { diff --git a/library/compiler-builtins/testcrate/build.rs b/library/compiler-builtins/testcrate/build.rs index 98a0934c0d90..a32dc741b35e 100644 --- a/library/compiler-builtins/testcrate/build.rs +++ b/library/compiler-builtins/testcrate/build.rs @@ -121,6 +121,98 @@ fn main() { }, "compiler_builtins::float::cmp::__lesf2(a, b)"); + if target_arch_arm { + gen(|(a, b): (MyF32, MyF32)| { + if a.0.is_nan() || b.0.is_nan() { + return None; + } + let c = (a.0 <= b.0) as i32; + Some(c) + }, + "compiler_builtins::float::cmp::__aeabi_fcmple(a, b)"); + + gen(|(a, b): (MyF32, MyF32)| { + if a.0.is_nan() || b.0.is_nan() { + return None; + } + let c = (a.0 >= b.0) as i32; + Some(c) + }, + "compiler_builtins::float::cmp::__aeabi_fcmpge(a, b)"); + + gen(|(a, b): (MyF32, MyF32)| { + if a.0.is_nan() || b.0.is_nan() { + return None; + } + let c = (a.0 == b.0) as i32; + Some(c) + }, + "compiler_builtins::float::cmp::__aeabi_fcmpeq(a, b)"); + + gen(|(a, b): (MyF32, MyF32)| { + if a.0.is_nan() || b.0.is_nan() { + return None; + } + let c = (a.0 < b.0) as i32; + Some(c) + }, + "compiler_builtins::float::cmp::__aeabi_fcmplt(a, b)"); + + gen(|(a, b): (MyF32, MyF32)| { + if a.0.is_nan() || b.0.is_nan() { + return None; + } + let c = (a.0 > b.0) as i32; + Some(c) + }, + "compiler_builtins::float::cmp::__aeabi_fcmpgt(a, b)"); + + gen(|(a, b): (MyF64, MyF64)| { + if a.0.is_nan() || b.0.is_nan() { + return None; + } + let c = (a.0 <= b.0) as i32; + Some(c) + }, + "compiler_builtins::float::cmp::__aeabi_dcmple(a, b)"); + + gen(|(a, b): (MyF64, MyF64)| { + if a.0.is_nan() || b.0.is_nan() { + return None; + } + let c = (a.0 >= b.0) as i32; + Some(c) + }, + "compiler_builtins::float::cmp::__aeabi_dcmpge(a, b)"); + + gen(|(a, b): (MyF64, MyF64)| { + if a.0.is_nan() || b.0.is_nan() { + return None; + } + let c = (a.0 == b.0) as i32; + Some(c) + }, + "compiler_builtins::float::cmp::__aeabi_dcmpeq(a, b)"); + + gen(|(a, b): (MyF64, MyF64)| { + if a.0.is_nan() || b.0.is_nan() { + return None; + } + let c = (a.0 < b.0) as i32; + Some(c) + }, + "compiler_builtins::float::cmp::__aeabi_dcmplt(a, b)"); + + gen(|(a, b): (MyF64, MyF64)| { + if a.0.is_nan() || b.0.is_nan() { + return None; + } + let c = (a.0 > b.0) as i32; + Some(c) + }, + "compiler_builtins::float::cmp::__aeabi_dcmpgt(a, b)"); + } + // float/conv.rs gen(|a: MyF64| i64(a.0).ok(), "compiler_builtins::float::conv::__fixdfdi(a)");