Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 6a0e784

Browse files
authoredMar 13, 2025
Rollup merge of rust-lang#138343 - tgross35:f16-powf, r=joboet
Enable `f16` tests for `powf` The LLVM issue [1] was fixed with [2], which is included in the LLVM20 upgrade. Tests no longer fail, so enable them here. [1]: llvm/llvm-project#98681 [2]: llvm/llvm-project#98681 try-job: aarch64-gnu try-job: x86_64-gnu-aux
2 parents b296531 + 889b773 commit 6a0e784

File tree

1 file changed

+41
-43
lines changed

1 file changed

+41
-43
lines changed
 

‎std/tests/floats/f16.rs

+41-43
Original file line numberDiff line numberDiff line change
@@ -461,18 +461,16 @@ fn test_recip() {
461461
#[test]
462462
#[cfg(reliable_f16_math)]
463463
fn test_powi() {
464-
// FIXME(llvm19): LLVM misoptimizes `powi.f16`
465-
// <https://github.com/llvm/llvm-project/issues/98665>
466-
// let nan: f16 = f16::NAN;
467-
// let inf: f16 = f16::INFINITY;
468-
// let neg_inf: f16 = f16::NEG_INFINITY;
469-
// assert_eq!(1.0f16.powi(1), 1.0);
470-
// assert_approx_eq!((-3.1f16).powi(2), 9.61, TOL_0);
471-
// assert_approx_eq!(5.9f16.powi(-2), 0.028727, TOL_N2);
472-
// assert_eq!(8.3f16.powi(0), 1.0);
473-
// assert!(nan.powi(2).is_nan());
474-
// assert_eq!(inf.powi(3), inf);
475-
// assert_eq!(neg_inf.powi(2), inf);
464+
let nan: f16 = f16::NAN;
465+
let inf: f16 = f16::INFINITY;
466+
let neg_inf: f16 = f16::NEG_INFINITY;
467+
assert_eq!(1.0f16.powi(1), 1.0);
468+
assert_approx_eq!((-3.1f16).powi(2), 9.61, TOL_0);
469+
assert_approx_eq!(5.9f16.powi(-2), 0.028727, TOL_N2);
470+
assert_eq!(8.3f16.powi(0), 1.0);
471+
assert!(nan.powi(2).is_nan());
472+
assert_eq!(inf.powi(3), inf);
473+
assert_eq!(neg_inf.powi(2), inf);
476474
}
477475

478476
#[test]
@@ -813,21 +811,21 @@ fn test_clamp_max_is_nan() {
813811
}
814812

815813
#[test]
814+
#[cfg(reliable_f16_math)]
816815
fn test_total_cmp() {
817816
use core::cmp::Ordering;
818817

819818
fn quiet_bit_mask() -> u16 {
820819
1 << (f16::MANTISSA_DIGITS - 2)
821820
}
822821

823-
// FIXME(f16_f128): test subnormals when powf is available
824-
// fn min_subnorm() -> f16 {
825-
// f16::MIN_POSITIVE / f16::powf(2.0, f16::MANTISSA_DIGITS as f16 - 1.0)
826-
// }
822+
fn min_subnorm() -> f16 {
823+
f16::MIN_POSITIVE / f16::powf(2.0, f16::MANTISSA_DIGITS as f16 - 1.0)
824+
}
827825

828-
// fn max_subnorm() -> f16 {
829-
// f16::MIN_POSITIVE - min_subnorm()
830-
// }
826+
fn max_subnorm() -> f16 {
827+
f16::MIN_POSITIVE - min_subnorm()
828+
}
831829

832830
fn q_nan() -> f16 {
833831
f16::from_bits(f16::NAN.to_bits() | quiet_bit_mask())
@@ -846,12 +844,12 @@ fn test_total_cmp() {
846844
assert_eq!(Ordering::Equal, (-1.5_f16).total_cmp(&-1.5));
847845
assert_eq!(Ordering::Equal, (-0.5_f16).total_cmp(&-0.5));
848846
assert_eq!(Ordering::Equal, (-f16::MIN_POSITIVE).total_cmp(&-f16::MIN_POSITIVE));
849-
// assert_eq!(Ordering::Equal, (-max_subnorm()).total_cmp(&-max_subnorm()));
850-
// assert_eq!(Ordering::Equal, (-min_subnorm()).total_cmp(&-min_subnorm()));
847+
assert_eq!(Ordering::Equal, (-max_subnorm()).total_cmp(&-max_subnorm()));
848+
assert_eq!(Ordering::Equal, (-min_subnorm()).total_cmp(&-min_subnorm()));
851849
assert_eq!(Ordering::Equal, (-0.0_f16).total_cmp(&-0.0));
852850
assert_eq!(Ordering::Equal, 0.0_f16.total_cmp(&0.0));
853-
// assert_eq!(Ordering::Equal, min_subnorm().total_cmp(&min_subnorm()));
854-
// assert_eq!(Ordering::Equal, max_subnorm().total_cmp(&max_subnorm()));
851+
assert_eq!(Ordering::Equal, min_subnorm().total_cmp(&min_subnorm()));
852+
assert_eq!(Ordering::Equal, max_subnorm().total_cmp(&max_subnorm()));
855853
assert_eq!(Ordering::Equal, f16::MIN_POSITIVE.total_cmp(&f16::MIN_POSITIVE));
856854
assert_eq!(Ordering::Equal, 0.5_f16.total_cmp(&0.5));
857855
assert_eq!(Ordering::Equal, 1.0_f16.total_cmp(&1.0));
@@ -870,13 +868,13 @@ fn test_total_cmp() {
870868
assert_eq!(Ordering::Less, (-1.5_f16).total_cmp(&-1.0));
871869
assert_eq!(Ordering::Less, (-1.0_f16).total_cmp(&-0.5));
872870
assert_eq!(Ordering::Less, (-0.5_f16).total_cmp(&-f16::MIN_POSITIVE));
873-
// assert_eq!(Ordering::Less, (-f16::MIN_POSITIVE).total_cmp(&-max_subnorm()));
874-
// assert_eq!(Ordering::Less, (-max_subnorm()).total_cmp(&-min_subnorm()));
875-
// assert_eq!(Ordering::Less, (-min_subnorm()).total_cmp(&-0.0));
871+
assert_eq!(Ordering::Less, (-f16::MIN_POSITIVE).total_cmp(&-max_subnorm()));
872+
assert_eq!(Ordering::Less, (-max_subnorm()).total_cmp(&-min_subnorm()));
873+
assert_eq!(Ordering::Less, (-min_subnorm()).total_cmp(&-0.0));
876874
assert_eq!(Ordering::Less, (-0.0_f16).total_cmp(&0.0));
877-
// assert_eq!(Ordering::Less, 0.0_f16.total_cmp(&min_subnorm()));
878-
// assert_eq!(Ordering::Less, min_subnorm().total_cmp(&max_subnorm()));
879-
// assert_eq!(Ordering::Less, max_subnorm().total_cmp(&f16::MIN_POSITIVE));
875+
assert_eq!(Ordering::Less, 0.0_f16.total_cmp(&min_subnorm()));
876+
assert_eq!(Ordering::Less, min_subnorm().total_cmp(&max_subnorm()));
877+
assert_eq!(Ordering::Less, max_subnorm().total_cmp(&f16::MIN_POSITIVE));
880878
assert_eq!(Ordering::Less, f16::MIN_POSITIVE.total_cmp(&0.5));
881879
assert_eq!(Ordering::Less, 0.5_f16.total_cmp(&1.0));
882880
assert_eq!(Ordering::Less, 1.0_f16.total_cmp(&1.5));
@@ -894,13 +892,13 @@ fn test_total_cmp() {
894892
assert_eq!(Ordering::Greater, (-1.0_f16).total_cmp(&-1.5));
895893
assert_eq!(Ordering::Greater, (-0.5_f16).total_cmp(&-1.0));
896894
assert_eq!(Ordering::Greater, (-f16::MIN_POSITIVE).total_cmp(&-0.5));
897-
// assert_eq!(Ordering::Greater, (-max_subnorm()).total_cmp(&-f16::MIN_POSITIVE));
898-
// assert_eq!(Ordering::Greater, (-min_subnorm()).total_cmp(&-max_subnorm()));
899-
// assert_eq!(Ordering::Greater, (-0.0_f16).total_cmp(&-min_subnorm()));
895+
assert_eq!(Ordering::Greater, (-max_subnorm()).total_cmp(&-f16::MIN_POSITIVE));
896+
assert_eq!(Ordering::Greater, (-min_subnorm()).total_cmp(&-max_subnorm()));
897+
assert_eq!(Ordering::Greater, (-0.0_f16).total_cmp(&-min_subnorm()));
900898
assert_eq!(Ordering::Greater, 0.0_f16.total_cmp(&-0.0));
901-
// assert_eq!(Ordering::Greater, min_subnorm().total_cmp(&0.0));
902-
// assert_eq!(Ordering::Greater, max_subnorm().total_cmp(&min_subnorm()));
903-
// assert_eq!(Ordering::Greater, f16::MIN_POSITIVE.total_cmp(&max_subnorm()));
899+
assert_eq!(Ordering::Greater, min_subnorm().total_cmp(&0.0));
900+
assert_eq!(Ordering::Greater, max_subnorm().total_cmp(&min_subnorm()));
901+
assert_eq!(Ordering::Greater, f16::MIN_POSITIVE.total_cmp(&max_subnorm()));
904902
assert_eq!(Ordering::Greater, 0.5_f16.total_cmp(&f16::MIN_POSITIVE));
905903
assert_eq!(Ordering::Greater, 1.0_f16.total_cmp(&0.5));
906904
assert_eq!(Ordering::Greater, 1.5_f16.total_cmp(&1.0));
@@ -918,12 +916,12 @@ fn test_total_cmp() {
918916
assert_eq!(Ordering::Less, (-q_nan()).total_cmp(&-1.0));
919917
assert_eq!(Ordering::Less, (-q_nan()).total_cmp(&-0.5));
920918
assert_eq!(Ordering::Less, (-q_nan()).total_cmp(&-f16::MIN_POSITIVE));
921-
// assert_eq!(Ordering::Less, (-q_nan()).total_cmp(&-max_subnorm()));
922-
// assert_eq!(Ordering::Less, (-q_nan()).total_cmp(&-min_subnorm()));
919+
assert_eq!(Ordering::Less, (-q_nan()).total_cmp(&-max_subnorm()));
920+
assert_eq!(Ordering::Less, (-q_nan()).total_cmp(&-min_subnorm()));
923921
assert_eq!(Ordering::Less, (-q_nan()).total_cmp(&-0.0));
924922
assert_eq!(Ordering::Less, (-q_nan()).total_cmp(&0.0));
925-
// assert_eq!(Ordering::Less, (-q_nan()).total_cmp(&min_subnorm()));
926-
// assert_eq!(Ordering::Less, (-q_nan()).total_cmp(&max_subnorm()));
923+
assert_eq!(Ordering::Less, (-q_nan()).total_cmp(&min_subnorm()));
924+
assert_eq!(Ordering::Less, (-q_nan()).total_cmp(&max_subnorm()));
927925
assert_eq!(Ordering::Less, (-q_nan()).total_cmp(&f16::MIN_POSITIVE));
928926
assert_eq!(Ordering::Less, (-q_nan()).total_cmp(&0.5));
929927
assert_eq!(Ordering::Less, (-q_nan()).total_cmp(&1.0));
@@ -940,12 +938,12 @@ fn test_total_cmp() {
940938
assert_eq!(Ordering::Less, (-s_nan()).total_cmp(&-1.0));
941939
assert_eq!(Ordering::Less, (-s_nan()).total_cmp(&-0.5));
942940
assert_eq!(Ordering::Less, (-s_nan()).total_cmp(&-f16::MIN_POSITIVE));
943-
// assert_eq!(Ordering::Less, (-s_nan()).total_cmp(&-max_subnorm()));
944-
// assert_eq!(Ordering::Less, (-s_nan()).total_cmp(&-min_subnorm()));
941+
assert_eq!(Ordering::Less, (-s_nan()).total_cmp(&-max_subnorm()));
942+
assert_eq!(Ordering::Less, (-s_nan()).total_cmp(&-min_subnorm()));
945943
assert_eq!(Ordering::Less, (-s_nan()).total_cmp(&-0.0));
946944
assert_eq!(Ordering::Less, (-s_nan()).total_cmp(&0.0));
947-
// assert_eq!(Ordering::Less, (-s_nan()).total_cmp(&min_subnorm()));
948-
// assert_eq!(Ordering::Less, (-s_nan()).total_cmp(&max_subnorm()));
945+
assert_eq!(Ordering::Less, (-s_nan()).total_cmp(&min_subnorm()));
946+
assert_eq!(Ordering::Less, (-s_nan()).total_cmp(&max_subnorm()));
949947
assert_eq!(Ordering::Less, (-s_nan()).total_cmp(&f16::MIN_POSITIVE));
950948
assert_eq!(Ordering::Less, (-s_nan()).total_cmp(&0.5));
951949
assert_eq!(Ordering::Less, (-s_nan()).total_cmp(&1.0));

0 commit comments

Comments
 (0)
Failed to load comments.