@@ -298,18 +298,18 @@ fn test_next_up() {
298
298
let smallest_normal = f64:: from_bits ( 0x0010_0000_0000_0000 ) ;
299
299
300
300
// Check that NaNs roundtrip.
301
- // Because x87 can lose NaN bits when passed through a function, ensure the reference value
302
- // also passes through a function boundary.
303
- #[ inline( never) ]
304
- fn identity ( x : f64 ) -> f64 {
305
- crate :: hint:: black_box ( x)
301
+ // Ignore test on x87 floating point, the code is still correct but these
302
+ // platforms do not guarantee NaN payloads are preserved, which caused these
303
+ // tests to fail.
304
+ #[ cfg( not( all( target_arch = "x86" , not( target_feature = "fxsr" ) ) ) ) ]
305
+ {
306
+ let nan0 = f64:: NAN ;
307
+ let nan1 = f64:: from_bits ( f64:: NAN . to_bits ( ) ^ 0x000a_aaaa_aaaa_aaaa ) ;
308
+ let nan2 = f64:: from_bits ( f64:: NAN . to_bits ( ) ^ 0x0005_5555_5555_5555 ) ;
309
+ assert_eq ! ( nan0. next_up( ) . to_bits( ) , nan0. to_bits( ) ) ;
310
+ assert_eq ! ( nan1. next_up( ) . to_bits( ) , nan1. to_bits( ) ) ;
311
+ assert_eq ! ( nan2. next_up( ) . to_bits( ) , nan2. to_bits( ) ) ;
306
312
}
307
- let nan0 = f64:: NAN ;
308
- let nan1 = f64:: from_bits ( f64:: NAN . to_bits ( ) ^ 0x000a_aaaa_aaaa_aaaa ) ;
309
- let nan2 = f64:: from_bits ( f64:: NAN . to_bits ( ) ^ 0x0005_5555_5555_5555 ) ;
310
- assert_eq ! ( nan0. next_up( ) . to_bits( ) , identity( nan0) . to_bits( ) ) ;
311
- assert_eq ! ( nan1. next_up( ) . to_bits( ) , identity( nan1) . to_bits( ) ) ;
312
- assert_eq ! ( nan2. next_up( ) . to_bits( ) , identity( nan2) . to_bits( ) ) ;
313
313
314
314
assert_eq ! ( f64 :: NEG_INFINITY . next_up( ) , f64 :: MIN ) ;
315
315
assert_eq ! ( f64 :: MIN . next_up( ) , -max_down) ;
@@ -335,18 +335,18 @@ fn test_next_down() {
335
335
let smallest_normal = f64:: from_bits ( 0x0010_0000_0000_0000 ) ;
336
336
337
337
// Check that NaNs roundtrip.
338
- // Because x87 can lose NaN bits when passed through a function, ensure the reference value
339
- // also passes through a function boundary.
340
- #[ inline( never) ]
341
- fn identity ( x : f64 ) -> f64 {
342
- crate :: hint:: black_box ( x)
338
+ // Ignore test on x87 floating point, the code is still correct but these
339
+ // platforms do not guarantee NaN payloads are preserved, which caused these
340
+ // tests to fail.
341
+ #[ cfg( not( all( target_arch = "x86" , not( target_feature = "fxsr" ) ) ) ) ]
342
+ {
343
+ let nan0 = f64:: NAN ;
344
+ let nan1 = f64:: from_bits ( f64:: NAN . to_bits ( ) ^ 0x000a_aaaa_aaaa_aaaa ) ;
345
+ let nan2 = f64:: from_bits ( f64:: NAN . to_bits ( ) ^ 0x0005_5555_5555_5555 ) ;
346
+ assert_eq ! ( nan0. next_down( ) . to_bits( ) , nan0. to_bits( ) ) ;
347
+ assert_eq ! ( nan1. next_down( ) . to_bits( ) , nan1. to_bits( ) ) ;
348
+ assert_eq ! ( nan2. next_down( ) . to_bits( ) , nan2. to_bits( ) ) ;
343
349
}
344
- let nan0 = f64:: NAN ;
345
- let nan1 = f64:: from_bits ( f64:: NAN . to_bits ( ) ^ 0x000a_aaaa_aaaa_aaaa ) ;
346
- let nan2 = f64:: from_bits ( f64:: NAN . to_bits ( ) ^ 0x0005_5555_5555_5555 ) ;
347
- assert_eq ! ( nan0. next_down( ) . to_bits( ) , identity( nan0) . to_bits( ) ) ;
348
- assert_eq ! ( nan1. next_down( ) . to_bits( ) , identity( nan1) . to_bits( ) ) ;
349
- assert_eq ! ( nan2. next_down( ) . to_bits( ) , identity( nan2) . to_bits( ) ) ;
350
350
351
351
assert_eq ! ( f64 :: NEG_INFINITY . next_down( ) , f64 :: NEG_INFINITY ) ;
352
352
assert_eq ! ( f64 :: MIN . next_down( ) , f64 :: NEG_INFINITY ) ;
0 commit comments