Skip to content

Commit

Permalink
Replaced calls to external fmin/fmax by a Rust implementation.
Browse files Browse the repository at this point in the history
  • Loading branch information
Thiez committed May 29, 2013
1 parent e3e55c5 commit 6cc9a26
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 4 deletions.
18 changes: 16 additions & 2 deletions src/libstd/num/f32.rs
Expand Up @@ -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,
Expand Down Expand Up @@ -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.
Expand Down
17 changes: 15 additions & 2 deletions src/libstd/num/f64.rs
Expand Up @@ -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,
Expand Down Expand Up @@ -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

Expand Down

0 comments on commit 6cc9a26

Please sign in to comment.