Skip to content
This repository was archived by the owner on Apr 28, 2025. It is now read-only.

Commit af51ff8

Browse files
committed
Add f16 and f128 copysign and fabs
Use the generic algorithm to make these two functions available whenever `f16_enabled` or `f128_enabled` are true. These require the `unstable` feature.
1 parent c34bb5e commit af51ff8

File tree

7 files changed

+95
-3
lines changed

7 files changed

+95
-3
lines changed

crates/libm-macros/src/lib.rs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,13 @@ use syn::visit_mut::VisitMut;
1212
use syn::{Ident, ItemEnum};
1313

1414
const ALL_FUNCTIONS: &[(Ty, Signature, Option<Signature>, &[&str])] = &[
15+
(
16+
// `fn(f16) -> f16`
17+
Ty::F16,
18+
Signature { args: &[Ty::F16], returns: &[Ty::F16] },
19+
None,
20+
&["fabsf16"],
21+
),
1522
(
1623
// `fn(f32) -> f32`
1724
Ty::F32,
@@ -36,6 +43,20 @@ const ALL_FUNCTIONS: &[(Ty, Signature, Option<Signature>, &[&str])] = &[
3643
"tgamma", "trunc",
3744
],
3845
),
46+
(
47+
// `fn(f128) -> f128`
48+
Ty::F128,
49+
Signature { args: &[Ty::F128], returns: &[Ty::F128] },
50+
None,
51+
&["fabsf128"],
52+
),
53+
(
54+
// `(f16, f16) -> f16`
55+
Ty::F16,
56+
Signature { args: &[Ty::F16, Ty::F16], returns: &[Ty::F16] },
57+
None,
58+
&["copysignf16"],
59+
),
3960
(
4061
// `(f32, f32) -> f32`
4162
Ty::F32,
@@ -72,6 +93,13 @@ const ALL_FUNCTIONS: &[(Ty, Signature, Option<Signature>, &[&str])] = &[
7293
"remainder",
7394
],
7495
),
96+
(
97+
// `(f128, f128) -> f128`
98+
Ty::F128,
99+
Signature { args: &[Ty::F128, Ty::F128], returns: &[Ty::F128] },
100+
None,
101+
&["copysignf128"],
102+
),
75103
(
76104
// `(f32, f32, f32) -> f32`
77105
Ty::F32,

src/libm_helper.rs

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ macro_rules! libm_helper {
3030
}
3131
};
3232

33-
({$($func:tt);*}) => {
33+
({$($func:tt;)*}) => {
3434
$(
3535
libm_helper! { $func }
3636
)*
@@ -103,7 +103,7 @@ libm_helper! {
103103
(fn trunc(x: f32) -> (f32); => truncf);
104104
(fn y0(x: f32) -> (f32); => y0f);
105105
(fn y1(x: f32) -> (f32); => y1f);
106-
(fn yn(n: i32, x: f32) -> (f32); => ynf)
106+
(fn yn(n: i32, x: f32) -> (f32); => ynf);
107107
}
108108
}
109109

@@ -166,6 +166,24 @@ libm_helper! {
166166
(fn trunc(x: f64) -> (f64); => trunc);
167167
(fn y0(x: f64) -> (f64); => y0);
168168
(fn y1(x: f64) -> (f64); => y1);
169-
(fn yn(n: i32, x: f64) -> (f64); => yn)
169+
(fn yn(n: i32, x: f64) -> (f64); => yn);
170+
}
171+
}
172+
173+
#[cfg(f16_enabled)]
174+
libm_helper! {
175+
f16,
176+
funcs: {
177+
(fn abs(x: f16) -> (f16); => fabsf16);
178+
(fn copysign(x: f16, y: f16) -> (f16); => copysignf16);
179+
}
180+
}
181+
182+
#[cfg(f128_enabled)]
183+
libm_helper! {
184+
f128,
185+
funcs: {
186+
(fn abs(x: f128) -> (f128); => fabsf128);
187+
(fn copysign(x: f128, y: f128) -> (f128); => copysignf128);
170188
}
171189
}

src/math/copysignf128.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
/// Sign of Y, magnitude of X (f32)
2+
///
3+
/// Constructs a number with the magnitude (absolute value) of its
4+
/// first argument, `x`, and the sign of its second argument, `y`.
5+
#[cfg_attr(all(test, assert_no_panic), no_panic::no_panic)]
6+
pub fn copysignf128(x: f128, y: f128) -> f128 {
7+
super::generic::copysign::copysign(x, y)
8+
}

src/math/copysignf16.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
/// Sign of Y, magnitude of X (f32)
2+
///
3+
/// Constructs a number with the magnitude (absolute value) of its
4+
/// first argument, `x`, and the sign of its second argument, `y`.
5+
#[cfg_attr(all(test, assert_no_panic), no_panic::no_panic)]
6+
pub fn copysignf16(x: f16, y: f16) -> f16 {
7+
super::generic::copysign::copysign(x, y)
8+
}

src/math/fabsf128.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
/// Absolute value (magnitude) of a `f128` value.
2+
#[cfg_attr(all(test, assert_no_panic), no_panic::no_panic)]
3+
pub fn fabsf128(x: f128) -> f128 {
4+
super::generic::abs::abs(x)
5+
}

src/math/fabsf16.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
/// Absolute value (magnitude) of a `f16` value.
2+
#[cfg_attr(all(test, assert_no_panic), no_panic::no_panic)]
3+
pub fn fabsf16(x: f16) -> f16 {
4+
super::generic::abs::abs(x)
5+
}

src/math/mod.rs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,26 @@ pub use self::tgammaf::tgammaf;
332332
pub use self::trunc::trunc;
333333
pub use self::truncf::truncf;
334334

335+
cfg_if! {
336+
if #[cfg(f16_enabled)] {
337+
mod copysignf16;
338+
mod fabsf16;
339+
340+
pub use self::fabsf16::fabsf16;
341+
pub use self::copysignf16::copysignf16;
342+
}
343+
}
344+
345+
cfg_if! {
346+
if #[cfg(f128_enabled)] {
347+
mod copysignf128;
348+
mod fabsf128;
349+
350+
pub use self::fabsf128::fabsf128;
351+
pub use self::copysignf128::copysignf128;
352+
}
353+
}
354+
335355
#[inline]
336356
fn get_high_word(x: f64) -> u32 {
337357
(x.to_bits() >> 32) as u32

0 commit comments

Comments
 (0)