Skip to content

Commit 35655a0

Browse files
committed
auto merge of #6803 : Thiez/rust/native_fmax_fmin, r=brson
Calls to the libc versions of fmin and fmax were relatively slow (perhaps because they could not be inlined?). This pull request provides f32 and f64 with fmin and fmax written in Rust, and shows a significant speed increase on my system; I used https://github.com/thiez/rustray as my benchmark, with --opt-level 3 it brings the ray-tracing time down from 10.8 seconds to about 9.2, which seemed significant to me. r?
2 parents d295709 + 3141acf commit 35655a0

File tree

2 files changed

+19
-4
lines changed

2 files changed

+19
-4
lines changed

src/libstd/num/f32.rs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,6 @@ delegate!(
8686
fn erfc(n: c_float) -> c_float = c_float_utils::erfc,
8787
fn exp_m1(n: c_float) -> c_float = c_float_utils::exp_m1,
8888
fn abs_sub(a: c_float, b: c_float) -> c_float = c_float_utils::abs_sub,
89-
fn fmax(a: c_float, b: c_float) -> c_float = c_float_utils::fmax,
90-
fn fmin(a: c_float, b: c_float) -> c_float = c_float_utils::fmin,
9189
fn next_after(x: c_float, y: c_float) -> c_float = c_float_utils::next_after,
9290
fn frexp(n: c_float, value: &mut c_int) -> c_float = c_float_utils::frexp,
9391
fn hypot(x: c_float, y: c_float) -> c_float = c_float_utils::hypot,
@@ -147,6 +145,16 @@ pub fn ge(x: f32, y: f32) -> bool { return x >= y; }
147145
#[inline(always)]
148146
pub fn gt(x: f32, y: f32) -> bool { return x > y; }
149147

148+
#[inline(always)]
149+
pub fn fmax(x: f32, y: f32) -> f32 {
150+
if x >= y || y.is_NaN() { x } else { y }
151+
}
152+
153+
#[inline(always)]
154+
pub fn fmin(x: f32, y: f32) -> f32 {
155+
if x <= y || y.is_NaN() { x } else { y }
156+
}
157+
150158

151159
// FIXME (#1999): replace the predicates below with llvm intrinsics or
152160
// calls to the libmath macros in the rust runtime for performance.

src/libstd/num/f64.rs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,6 @@ delegate!(
8787
fn erfc(n: c_double) -> c_double = c_double_utils::erfc,
8888
fn exp_m1(n: c_double) -> c_double = c_double_utils::exp_m1,
8989
fn abs_sub(a: c_double, b: c_double) -> c_double = c_double_utils::abs_sub,
90-
fn fmax(a: c_double, b: c_double) -> c_double = c_double_utils::fmax,
91-
fn fmin(a: c_double, b: c_double) -> c_double = c_double_utils::fmin,
9290
fn next_after(x: c_double, y: c_double) -> c_double = c_double_utils::next_after,
9391
fn frexp(n: c_double, value: &mut c_int) -> c_double = c_double_utils::frexp,
9492
fn hypot(x: c_double, y: c_double) -> c_double = c_double_utils::hypot,
@@ -172,6 +170,15 @@ pub fn ge(x: f64, y: f64) -> bool { return x >= y; }
172170
#[inline(always)]
173171
pub fn gt(x: f64, y: f64) -> bool { return x > y; }
174172

173+
#[inline(always)]
174+
pub fn fmax(x: f64, y: f64) -> f64 {
175+
if x >= y || y.is_NaN() { x } else { y }
176+
}
177+
178+
#[inline(always)]
179+
pub fn fmin(x: f64, y: f64) -> f64 {
180+
if x <= y || y.is_NaN() { x } else { y }
181+
}
175182

176183
// FIXME (#1999): add is_normal, is_subnormal, and fpclassify
177184

0 commit comments

Comments
 (0)