about summary refs log tree commit diff
path: root/src/libstd/num
diff options
context:
space:
mode:
authorMatthijs Hofstra <thiezz@gmail.com>2013-05-29 16:21:29 +0200
committerMatthijs Hofstra <thiezz@gmail.com>2013-05-29 18:26:50 +0200
commit6cc9a26a2d61acc0b1d707104f8c2a8b7c990012 (patch)
tree66ff400df83299f6a92da6285673e7c7f34b9082 /src/libstd/num
parente3e55c5c042778b0e50710221d6c0abdfc1119f0 (diff)
downloadrust-6cc9a26a2d61acc0b1d707104f8c2a8b7c990012.tar.gz
rust-6cc9a26a2d61acc0b1d707104f8c2a8b7c990012.zip
Replaced calls to external fmin/fmax by a Rust implementation.
Diffstat (limited to 'src/libstd/num')
-rw-r--r--src/libstd/num/f32.rs18
-rw-r--r--src/libstd/num/f64.rs17
2 files changed, 31 insertions, 4 deletions
diff --git a/src/libstd/num/f32.rs b/src/libstd/num/f32.rs
index 94cff78375a..0d166c8887c 100644
--- a/src/libstd/num/f32.rs
+++ b/src/libstd/num/f32.rs
@@ -86,8 +86,6 @@ delegate!(
     fn erfc(n: c_float) -> c_float = c_float_utils::erfc,
     fn exp_m1(n: c_float) -> c_float = c_float_utils::exp_m1,
     fn abs_sub(a: c_float, b: c_float) -> c_float = c_float_utils::abs_sub,
-    fn fmax(a: c_float, b: c_float) -> c_float = c_float_utils::fmax,
-    fn fmin(a: c_float, b: c_float) -> c_float = c_float_utils::fmin,
     fn next_after(x: c_float, y: c_float) -> c_float = c_float_utils::next_after,
     fn frexp(n: c_float, value: &mut c_int) -> c_float = c_float_utils::frexp,
     fn hypot(x: c_float, y: c_float) -> c_float = c_float_utils::hypot,
@@ -147,6 +145,22 @@ pub fn ge(x: f32, y: f32) -> bool { return x >= y; }
 #[inline(always)]
 pub fn gt(x: f32, y: f32) -> bool { return x > y; }
 
+#[inline(always)]
+pub fn fmax(x: f32, y: f32) -> f32 {
+    if x.is_NaN() { y }
+    else if y.is_NaN() { x }
+    else if x > y { x }
+    else { y }
+}
+
+#[inline(always)]
+pub fn fmin(x: f32, y: f32) -> f32 {
+    if x.is_NaN() { y }
+    else if y.is_NaN() { x }
+    else if x < y { x }
+    else { y }
+}
+
 
 // FIXME (#1999): replace the predicates below with llvm intrinsics or
 // calls to the libmath macros in the rust runtime for performance.
diff --git a/src/libstd/num/f64.rs b/src/libstd/num/f64.rs
index b7754ed07ad..910e2e1e692 100644
--- a/src/libstd/num/f64.rs
+++ b/src/libstd/num/f64.rs
@@ -87,8 +87,6 @@ delegate!(
     fn erfc(n: c_double) -> c_double = c_double_utils::erfc,
     fn exp_m1(n: c_double) -> c_double = c_double_utils::exp_m1,
     fn abs_sub(a: c_double, b: c_double) -> c_double = c_double_utils::abs_sub,
-    fn fmax(a: c_double, b: c_double) -> c_double = c_double_utils::fmax,
-    fn fmin(a: c_double, b: c_double) -> c_double = c_double_utils::fmin,
     fn next_after(x: c_double, y: c_double) -> c_double = c_double_utils::next_after,
     fn frexp(n: c_double, value: &mut c_int) -> c_double = c_double_utils::frexp,
     fn hypot(x: c_double, y: c_double) -> c_double = c_double_utils::hypot,
@@ -172,6 +170,21 @@ pub fn ge(x: f64, y: f64) -> bool { return x >= y; }
 #[inline(always)]
 pub fn gt(x: f64, y: f64) -> bool { return x > y; }
 
+#[inline(always)]
+pub fn fmax(x: f64, y: f64) -> f64 {
+    if x.is_NaN() { y }
+    else if y.is_NaN() { x }
+    else if x > y { x }
+    else { y }
+}
+
+#[inline(always)]
+pub fn fmin(x: f64, y: f64) -> f64 {
+    if x.is_NaN() { y }
+    else if y.is_NaN() { x }
+    else if x < y { x }
+    else { y }
+}
 
 // FIXME (#1999): add is_normal, is_subnormal, and fpclassify