forked from WebAssembly/wasi-sdk
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Use wasm's builtin min and max operators to implement libc `fmin`, `fmax, `fminf`, and `fmaxf`, by handling the NaN cases explicitly. Credit to emscripten-core/emscripten#9689 for spotting this opportunity!
- Loading branch information
1 parent
deb8eae
commit cf81683
Showing
2 changed files
with
37 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
// Wasm's `min` and `max` operators implement the IEEE 754-2019 | ||
// `minimum` and `maximum` operations, meaning that given a choice | ||
// between NaN and a number, they return NaN. This differs from | ||
// the C standard library's `fmin` and `fmax` functions, which | ||
// return the number. However, we can still use wasm's builtins | ||
// by handling the NaN cases explicitly, and it still turns out | ||
// to be faster than doing the whole operation in | ||
// target-independent C. And, it's smaller. | ||
|
||
#include <math.h> | ||
|
||
float fminf(float x, float y) { | ||
if (isnan(x)) return y; | ||
if (isnan(y)) return x; | ||
return __builtin_wasm_min_f32(x, y); | ||
} | ||
|
||
float fmaxf(float x, float y) { | ||
if (isnan(x)) return y; | ||
if (isnan(y)) return x; | ||
return __builtin_wasm_max_f32(x, y); | ||
} | ||
|
||
double fmin(double x, double y) { | ||
if (isnan(x)) return y; | ||
if (isnan(y)) return x; | ||
return __builtin_wasm_min_f64(x, y); | ||
} | ||
|
||
double fmax(double x, double y) { | ||
if (isnan(x)) return y; | ||
if (isnan(y)) return x; | ||
return __builtin_wasm_max_f64(x, y); | ||
} |