Skip to content

Commit b8005ac

Browse files
authored
Merge pull request #438 from tgross35/generic-fdim
Add `fdimf16` and `fdimf128`
2 parents 02e78f8 + 31f0e1f commit b8005ac

File tree

18 files changed

+114
-32
lines changed

18 files changed

+114
-32
lines changed

crates/compiler-builtins-smoke-test/src/lib.rs

+2
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,8 @@ no_mangle! {
9393
fabsf16(x: f16) -> f16;
9494
fdim(x: f64, y: f64) -> f64;
9595
fdimf(x: f32, y: f32) -> f32;
96+
fdimf128(x: f128, y: f128) -> f128;
97+
fdimf16(x: f16, y: f16) -> f16;
9698
floor(x: f64) -> f64;
9799
floorf(x: f32) -> f32;
98100
fma(x: f64, y: f64, z: f64) -> f64;

crates/libm-macros/src/shared.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ const ALL_OPERATIONS_NESTED: &[(FloatTy, Signature, Option<Signature>, &[&str])]
4747
FloatTy::F16,
4848
Signature { args: &[Ty::F16, Ty::F16], returns: &[Ty::F16] },
4949
None,
50-
&["copysignf16"],
50+
&["copysignf16", "fdimf16"],
5151
),
5252
(
5353
// `(f32, f32) -> f32`
@@ -90,7 +90,7 @@ const ALL_OPERATIONS_NESTED: &[(FloatTy, Signature, Option<Signature>, &[&str])]
9090
FloatTy::F128,
9191
Signature { args: &[Ty::F128, Ty::F128], returns: &[Ty::F128] },
9292
None,
93-
&["copysignf128"],
93+
&["copysignf128", "fdimf128"],
9494
),
9595
(
9696
// `(f32, f32, f32) -> f32`

crates/libm-test/benches/random.rs

+8-1
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,14 @@ libm_macros::for_each_function! {
117117
exp10 | exp10f | exp2 | exp2f => (true, Some(musl_math_sys::MACRO_FN_NAME)),
118118

119119
// Musl does not provide `f16` and `f128` functions
120-
copysignf16 | copysignf128 | fabsf16 | fabsf128 | truncf16 | truncf128 => (false, None),
120+
copysignf128
121+
| copysignf16
122+
| fabsf128
123+
| fabsf16
124+
| fdimf128
125+
| fdimf16
126+
| truncf128
127+
| truncf16 => (false, None),
121128

122129
// By default we never skip (false) and always have a musl function available
123130
_ => (false, Some(musl_math_sys::MACRO_FN_NAME))

crates/libm-test/src/domain.rs

+10
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,16 @@ impl HasDomain<f128> for crate::op::fabsf128::Routine {
200200
const DOMAIN: Domain<f128> = Domain::<f128>::UNBOUNDED;
201201
}
202202

203+
#[cfg(f16_enabled)]
204+
impl HasDomain<f16> for crate::op::fdimf16::Routine {
205+
const DOMAIN: Domain<f16> = Domain::<f16>::UNBOUNDED;
206+
}
207+
208+
#[cfg(f128_enabled)]
209+
impl HasDomain<f128> for crate::op::fdimf128::Routine {
210+
const DOMAIN: Domain<f128> = Domain::<f128>::UNBOUNDED;
211+
}
212+
203213
#[cfg(f16_enabled)]
204214
impl HasDomain<f16> for crate::op::truncf16::Routine {
205215
const DOMAIN: Domain<f16> = Domain::<f16>::UNBOUNDED;

crates/libm-test/src/mpfloat.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ libm_macros::for_each_function! {
181181
// Remap function names that are different between mpfr and libm
182182
expm1 | expm1f => exp_m1,
183183
fabs | fabsf => abs,
184-
fdim | fdimf => positive_diff,
184+
fdim | fdimf | fdimf16 | fdimf128 => positive_diff,
185185
fma | fmaf => mul_add,
186186
fmax | fmaxf => max,
187187
fmin | fminf => min,

crates/libm-test/tests/compare_built_musl.rs

+14-3
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,16 @@ where
4848
libm_macros::for_each_function! {
4949
callback: musl_rand_tests,
5050
// Musl does not support `f16` and `f128` on all platforms.
51-
skip: [copysignf16, copysignf128, fabsf16, fabsf128, truncf16, truncf128],
51+
skip: [
52+
copysignf128,
53+
copysignf16,
54+
fabsf128,
55+
fabsf16,
56+
fdimf128,
57+
fdimf16,
58+
truncf128,
59+
truncf16,
60+
],
5261
attributes: [
5362
#[cfg_attr(x86_no_sse, ignore)] // FIXME(correctness): wrong result on i586
5463
[exp10, exp10f, exp2, exp2f, rint]
@@ -144,9 +153,11 @@ libm_macros::for_each_function! {
144153
ynf,
145154

146155
// Not provided by musl
147-
fabsf16,
148156
fabsf128,
149-
truncf16,
157+
fabsf16,
158+
fdimf128,
159+
fdimf16,
150160
truncf128,
161+
truncf16,
151162
],
152163
}

crates/libm-test/tests/multiprecision.rs

+2
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,8 @@ libm_macros::for_each_function! {
120120
copysignf128,
121121
fdim,
122122
fdimf,
123+
fdimf16,
124+
fdimf128,
123125
fma,
124126
fmaf,
125127
fmax,

crates/util/src/main.rs

+8-1
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,14 @@ fn do_eval(basis: &str, op: &str, inputs: &[&str]) {
8484
emit_types: [CFn, RustFn, RustArgs],
8585
extra: (basis, op, inputs),
8686
fn_extra: match MACRO_FN_NAME {
87-
copysignf16 | copysignf128 | fabsf16 | fabsf128 | truncf16 | truncf128 => None,
87+
copysignf128
88+
| copysignf16
89+
| fabsf128
90+
| fabsf16
91+
| fdimf128
92+
| fdimf16
93+
| truncf128
94+
| truncf16 => None,
8895
_ => Some(musl_math_sys::MACRO_FN_NAME)
8996
}
9097
}

etc/function-definitions.json

+18-2
Original file line numberDiff line numberDiff line change
@@ -289,16 +289,32 @@
289289
"fdim": {
290290
"sources": [
291291
"src/libm_helper.rs",
292-
"src/math/fdim.rs"
292+
"src/math/fdim.rs",
293+
"src/math/generic/fdim.rs"
293294
],
294295
"type": "f64"
295296
},
296297
"fdimf": {
297298
"sources": [
298-
"src/math/fdimf.rs"
299+
"src/math/fdimf.rs",
300+
"src/math/generic/fdim.rs"
299301
],
300302
"type": "f32"
301303
},
304+
"fdimf128": {
305+
"sources": [
306+
"src/math/fdimf128.rs",
307+
"src/math/generic/fdim.rs"
308+
],
309+
"type": "f128"
310+
},
311+
"fdimf16": {
312+
"sources": [
313+
"src/math/fdimf16.rs",
314+
"src/math/generic/fdim.rs"
315+
],
316+
"type": "f16"
317+
},
302318
"floor": {
303319
"sources": [
304320
"src/libm_helper.rs",

etc/function-list.txt

+2
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ fabsf128
4343
fabsf16
4444
fdim
4545
fdimf
46+
fdimf128
47+
fdimf16
4648
floor
4749
floorf
4850
fma

src/libm_helper.rs

+2
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,7 @@ libm_helper! {
176176
funcs: {
177177
(fn copysign(x: f16, y: f16) -> (f16); => copysignf16);
178178
(fn fabs(x: f16) -> (f16); => fabsf16);
179+
(fn fdim(x: f16, y: f16) -> (f16); => fdimf16);
179180
}
180181
}
181182

@@ -185,5 +186,6 @@ libm_helper! {
185186
funcs: {
186187
(fn copysign(x: f128, y: f128) -> (f128); => copysignf128);
187188
(fn fabs(x: f128) -> (f128); => fabsf128);
189+
(fn fdim(x: f128, y: f128) -> (f128); => fdimf128);
188190
}
189191
}

src/math/fdim.rs

+1-11
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
use core::f64;
2-
31
/// Positive difference (f64)
42
///
53
/// Determines the positive difference between arguments, returning:
@@ -10,13 +8,5 @@ use core::f64;
108
/// A range error may occur.
119
#[cfg_attr(all(test, assert_no_panic), no_panic::no_panic)]
1210
pub fn fdim(x: f64, y: f64) -> f64 {
13-
if x.is_nan() {
14-
x
15-
} else if y.is_nan() {
16-
y
17-
} else if x > y {
18-
x - y
19-
} else {
20-
0.0
21-
}
11+
super::generic::fdim(x, y)
2212
}

src/math/fdimf.rs

+1-11
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
use core::f32;
2-
31
/// Positive difference (f32)
42
///
53
/// Determines the positive difference between arguments, returning:
@@ -10,13 +8,5 @@ use core::f32;
108
/// A range error may occur.
119
#[cfg_attr(all(test, assert_no_panic), no_panic::no_panic)]
1210
pub fn fdimf(x: f32, y: f32) -> f32 {
13-
if x.is_nan() {
14-
x
15-
} else if y.is_nan() {
16-
y
17-
} else if x > y {
18-
x - y
19-
} else {
20-
0.0
21-
}
11+
super::generic::fdim(x, y)
2212
}

src/math/fdimf128.rs

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
/// Positive difference (f128)
2+
///
3+
/// Determines the positive difference between arguments, returning:
4+
/// * x - y if x > y, or
5+
/// * +0 if x <= y, or
6+
/// * NAN if either argument is NAN.
7+
///
8+
/// A range error may occur.
9+
#[cfg_attr(all(test, assert_no_panic), no_panic::no_panic)]
10+
pub fn fdimf128(x: f128, y: f128) -> f128 {
11+
super::generic::fdim(x, y)
12+
}

src/math/fdimf16.rs

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
/// Positive difference (f16)
2+
///
3+
/// Determines the positive difference between arguments, returning:
4+
/// * x - y if x > y, or
5+
/// * +0 if x <= y, or
6+
/// * NAN if either argument is NAN.
7+
///
8+
/// A range error may occur.
9+
#[cfg_attr(all(test, assert_no_panic), no_panic::no_panic)]
10+
pub fn fdimf16(x: f16, y: f16) -> f16 {
11+
super::generic::fdim(x, y)
12+
}

src/math/generic/fdim.rs

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
use super::super::Float;
2+
3+
pub fn fdim<F: Float>(x: F, y: F) -> F {
4+
if x.is_nan() {
5+
x
6+
} else if y.is_nan() {
7+
y
8+
} else if x > y {
9+
x - y
10+
} else {
11+
F::ZERO
12+
}
13+
}

src/math/generic/mod.rs

+2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
mod copysign;
22
mod fabs;
3+
mod fdim;
34
mod trunc;
45

56
pub use copysign::copysign;
67
pub use fabs::fabs;
8+
pub use fdim::fdim;
79
pub use trunc::trunc;

src/math/mod.rs

+4
Original file line numberDiff line numberDiff line change
@@ -343,10 +343,12 @@ cfg_if! {
343343
if #[cfg(f16_enabled)] {
344344
mod copysignf16;
345345
mod fabsf16;
346+
mod fdimf16;
346347
mod truncf16;
347348

348349
pub use self::copysignf16::copysignf16;
349350
pub use self::fabsf16::fabsf16;
351+
pub use self::fdimf16::fdimf16;
350352
pub use self::truncf16::truncf16;
351353
}
352354
}
@@ -355,10 +357,12 @@ cfg_if! {
355357
if #[cfg(f128_enabled)] {
356358
mod copysignf128;
357359
mod fabsf128;
360+
mod fdimf128;
358361
mod truncf128;
359362

360363
pub use self::copysignf128::copysignf128;
361364
pub use self::fabsf128::fabsf128;
365+
pub use self::fdimf128::fdimf128;
362366
pub use self::truncf128::truncf128;
363367
}
364368
}

0 commit comments

Comments
 (0)