| // FIXME(f16b): | |
| // This file compiled unoptimised in some function calls, such as `to_bits()`, | |
| // emit a call to `__truncsfbf2` which fails in the CI see here for more; | |
| // <https://github.com/rust-lang/rust/pull/160859#issuecomment-5740296334> | |
| // Remove `-C-opt-level=3` once the `__truncsfbf2` symbol is in | |
| // compiler-builtins. | |
| // | |
| //@ compile-flags: --check-cfg=cfg(target_has_reliable_f16b) -Copt-level=3 | |
| //@ run-pass | |
| #![feature(f16b, cfg_target_has_reliable_f16b)] | |
| extern crate core; | |
| use core::num::f16b; | |
| #[cfg(target_has_reliable_f16b)] | |
| use std::fmt::{Debug, LowerExp, UpperExp}; | |
| #[cfg(target_has_reliable_f16b)] | |
| const ONE: f16b = f16b::from_bits(0x3f80); | |
| #[cfg(target_has_reliable_f16b)] | |
| const ONE_BITS: u16 = ONE.to_bits(); | |
| #[cfg(target_has_reliable_f16b)] | |
| fn assert_traits<T>() | |
| where | |
| T: Default + Copy + Clone + Debug + LowerExp + UpperExp + PartialEq + PartialOrd, | |
| { | |
| } | |
| fn main() { | |
| assert_eq!(size_of::<f16b>(), 2); | |
| assert_eq!(align_of::<f16b>(), 2); | |
| #[cfg(target_has_reliable_f16b)] | |
| { | |
| assert_traits::<f16b>(); | |
| assert_eq!(f16b::default().to_bits(), 0); | |
| assert_eq!(ONE_BITS, 0x3f80); | |
| assert_eq!(f32::from(ONE).to_bits(), 0x3f80_0000); | |
| let two = f16b::from_bits(0x4000); | |
| let negative_zero = f16b::from_bits(0x8000); | |
| let nan = f16b::from_bits(0x7fc0); | |
| assert!(ONE < two); | |
| assert_eq!(f16b::from_bits(0), negative_zero); | |
| assert!(nan != nan); | |
| assert_eq!(format!("{ONE:?}"), "1.0"); | |
| assert_eq!(format!("{ONE:e}"), "1e0"); | |
| assert_eq!(format!("{ONE:E}"), "1E0"); | |
| } | |
| } |