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

Commit 3d70168

Browse files
committed
Add scalbnf16 and scalbnf128
The `scalbn` functions are similar enough that they can easily be made generic. Do so and `f16` and `f128` versions.
1 parent 2a03ae6 commit 3d70168

File tree

16 files changed

+111
-62
lines changed

16 files changed

+111
-62
lines changed

crates/libm-macros/src/shared.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,13 @@ const ALL_OPERATIONS_NESTED: &[(FloatTy, Signature, Option<Signature>, &[&str])]
134134
None,
135135
&["jn", "yn"],
136136
),
137+
(
138+
// `(f16, i32) -> f16`
139+
FloatTy::F16,
140+
Signature { args: &[Ty::F16, Ty::I32], returns: &[Ty::F16] },
141+
None,
142+
&["scalbnf16"],
143+
),
137144
(
138145
// `(f32, i32) -> f32`
139146
FloatTy::F32,
@@ -148,6 +155,13 @@ const ALL_OPERATIONS_NESTED: &[(FloatTy, Signature, Option<Signature>, &[&str])]
148155
None,
149156
&["scalbn", "ldexp"],
150157
),
158+
(
159+
// `(f128, i32) -> f128`
160+
FloatTy::F128,
161+
Signature { args: &[Ty::F128, Ty::I32], returns: &[Ty::F128] },
162+
None,
163+
&["scalbnf128"],
164+
),
151165
(
152166
// `(f32, &mut f32) -> f32` as `(f32) -> (f32, f32)`
153167
FloatTy::F32,

crates/libm-test/benches/random.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ 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 => (false, None),
120+
copysignf16 | copysignf128 | fabsf16 | fabsf128 | scalbnf16 | scalbnf128 => (false, None),
121121

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

crates/libm-test/src/mpfloat.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ libm_macros::for_each_function! {
137137
fmod, fmodf, frexp, frexpf, ilogb, ilogbf, jn, jnf, ldexp, ldexpf,
138138
lgamma_r, lgammaf_r, modf, modff, nextafter, nextafterf, pow,powf,
139139
remquo, remquof, scalbn, scalbnf, sincos, sincosf, yn, ynf,
140-
copysignf16, copysignf128, fabsf16, fabsf128,
140+
copysignf16, copysignf128, fabsf16, fabsf128, scalbnf16, scalbnf128,
141141
],
142142
fn_extra: match MACRO_FN_NAME {
143143
// Remap function names that are different between mpfr and libm

crates/libm-test/src/precision.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -403,5 +403,9 @@ fn bessel_prec_dropoff<F: Float>(
403403

404404
impl MaybeOverride<(f32, f32, f32)> for SpecialCase {}
405405
impl MaybeOverride<(f64, f64, f64)> for SpecialCase {}
406+
#[cfg(f16_enabled)]
407+
impl MaybeOverride<(f16, i32)> for SpecialCase {}
406408
impl MaybeOverride<(f32, i32)> for SpecialCase {}
407409
impl MaybeOverride<(f64, i32)> for SpecialCase {}
410+
#[cfg(f128_enabled)]
411+
impl MaybeOverride<(f128, i32)> for SpecialCase {}

crates/libm-test/tests/compare_built_musl.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ where
4747
libm_macros::for_each_function! {
4848
callback: musl_rand_tests,
4949
// Musl does not support `f16` and `f128` on all platforms.
50-
skip: [copysignf16, copysignf128, fabsf16, fabsf128],
50+
skip: [copysignf16, copysignf128, fabsf16, fabsf128, scalbnf16, scalbnf128],
5151
attributes: [
5252
#[cfg_attr(x86_no_sse, ignore)] // FIXME(correctness): wrong result on i586
5353
[exp10, exp10f, exp2, exp2f, rint]

crates/libm-test/tests/multiprecision.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,8 @@ libm_macros::for_each_function! {
154154
remquof,
155155
scalbn,
156156
scalbnf,
157+
scalbnf16,
158+
scalbnf128,
157159
yn,
158160
ynf,
159161

crates/libm-test/tests/z_extensive/run.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,8 @@ fn register_all_tests() -> Vec<Trial> {
6161
remquof,
6262
scalbn,
6363
scalbnf,
64+
scalbnf16,
65+
scalbnf128,
6466

6567
// FIXME: test needed, see
6668
// https://github.com/rust-lang/libm/pull/311#discussion_r1818273392

etc/function-definitions.json

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -630,16 +630,32 @@
630630
"scalbn": {
631631
"sources": [
632632
"src/libm_helper.rs",
633+
"src/math/generic/scalbn.rs",
633634
"src/math/scalbn.rs"
634635
],
635636
"type": "f64"
636637
},
637638
"scalbnf": {
638639
"sources": [
640+
"src/math/generic/scalbn.rs",
639641
"src/math/scalbnf.rs"
640642
],
641643
"type": "f32"
642644
},
645+
"scalbnf128": {
646+
"sources": [
647+
"src/math/generic/scalbn.rs",
648+
"src/math/scalbnf128.rs"
649+
],
650+
"type": "f128"
651+
},
652+
"scalbnf16": {
653+
"sources": [
654+
"src/math/generic/scalbn.rs",
655+
"src/math/scalbnf16.rs"
656+
],
657+
"type": "f16"
658+
},
643659
"sin": {
644660
"sources": [
645661
"src/libm_helper.rs",

etc/function-list.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,8 @@ round
9595
roundf
9696
scalbn
9797
scalbnf
98+
scalbnf128
99+
scalbnf16
98100
sin
99101
sincos
100102
sincosf

src/math/generic/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
mod copysign;
22
mod fabs;
3+
mod scalbn;
34

45
pub use copysign::copysign;
56
pub use fabs::fabs;
7+
pub use scalbn::scalbn;

0 commit comments

Comments
 (0)