@@ -298,12 +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)
306
+ }
301
307
let nan0 = f64:: NAN ;
302
308
let nan1 = f64:: from_bits ( f64:: NAN . to_bits ( ) ^ 0x000a_aaaa_aaaa_aaaa ) ;
303
309
let nan2 = f64:: from_bits ( f64:: NAN . to_bits ( ) ^ 0x0005_5555_5555_5555 ) ;
304
- assert_eq ! ( nan0. next_up( ) . to_bits( ) , nan0. to_bits( ) ) ;
305
- assert_eq ! ( nan1. next_up( ) . to_bits( ) , nan1. to_bits( ) ) ;
306
- assert_eq ! ( nan2. next_up( ) . to_bits( ) , nan2. to_bits( ) ) ;
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( ) ) ;
307
313
308
314
assert_eq ! ( f64 :: NEG_INFINITY . next_up( ) , f64 :: MIN ) ;
309
315
assert_eq ! ( f64 :: MIN . next_up( ) , -max_down) ;
@@ -329,12 +335,18 @@ fn test_next_down() {
329
335
let smallest_normal = f64:: from_bits ( 0x0010_0000_0000_0000 ) ;
330
336
331
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)
343
+ }
332
344
let nan0 = f64:: NAN ;
333
345
let nan1 = f64:: from_bits ( f64:: NAN . to_bits ( ) ^ 0x000a_aaaa_aaaa_aaaa ) ;
334
346
let nan2 = f64:: from_bits ( f64:: NAN . to_bits ( ) ^ 0x0005_5555_5555_5555 ) ;
335
- assert_eq ! ( nan0. next_down( ) . to_bits( ) , nan0. to_bits( ) ) ;
336
- assert_eq ! ( nan1. next_down( ) . to_bits( ) , nan1. to_bits( ) ) ;
337
- assert_eq ! ( nan2. next_down( ) . to_bits( ) , nan2. to_bits( ) ) ;
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( ) ) ;
338
350
339
351
assert_eq ! ( f64 :: NEG_INFINITY . next_down( ) , f64 :: NEG_INFINITY ) ;
340
352
assert_eq ! ( f64 :: MIN . next_down( ) , f64 :: NEG_INFINITY ) ;
0 commit comments