diff options
| author | bors <bors@rust-lang.org> | 2024-05-17 11:24:07 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2024-05-17 11:24:07 +0000 |
| commit | ddba1dc97e83f22165b36dd6158477c49bbbd019 (patch) | |
| tree | 96d3215c779ba13947f8abff14fe36b2660ef873 | |
| parent | a5c37eea5aa922f4d6b543f2d35bdbd892fea2a8 (diff) | |
| parent | 76857343845900e1f5dda72d9e6e8b10a0f79e24 (diff) | |
| download | rust-ddba1dc97e83f22165b36dd6158477c49bbbd019.tar.gz rust-ddba1dc97e83f22165b36dd6158477c49bbbd019.zip | |
Auto merge of #125188 - tgross35:f16-f128-powi, r=Nilstrieb
Add `powi` fo `f16` and `f128` This will unblock adding support to compiler_builtins (<https://github.com/rust-lang/compiler-builtins/pull/614>), which will then unblock adding tests for these new functions.
| -rw-r--r-- | library/core/src/intrinsics.rs | 12 | ||||
| -rw-r--r-- | library/core/src/num/f128.rs | 20 | ||||
| -rw-r--r-- | library/core/src/num/f16.rs | 20 | ||||
| -rw-r--r-- | library/core/src/num/f64.rs | 1 | ||||
| -rw-r--r-- | library/std/src/f128.rs | 24 | ||||
| -rw-r--r-- | library/std/src/f16.rs | 24 |
6 files changed, 100 insertions, 1 deletions
diff --git a/library/core/src/intrinsics.rs b/library/core/src/intrinsics.rs index d1450bf12ce..d58e1dbb3e4 100644 --- a/library/core/src/intrinsics.rs +++ b/library/core/src/intrinsics.rs @@ -1594,6 +1594,12 @@ extern "rust-intrinsic" { #[rustc_nounwind] pub fn sqrtf64(x: f64) -> f64; + /// Raises an `f16` to an integer power. + /// + /// The stabilized version of this intrinsic is + /// [`f16::powi`](../../std/primitive.f16.html#method.powi) + #[rustc_nounwind] + pub fn powif16(a: f16, x: i32) -> f16; /// Raises an `f32` to an integer power. /// /// The stabilized version of this intrinsic is @@ -1606,6 +1612,12 @@ extern "rust-intrinsic" { /// [`f64::powi`](../../std/primitive.f64.html#method.powi) #[rustc_nounwind] pub fn powif64(a: f64, x: i32) -> f64; + /// Raises an `f128` to an integer power. + /// + /// The stabilized version of this intrinsic is + /// [`f128::powi`](../../std/primitive.f128.html#method.powi) + #[rustc_nounwind] + pub fn powif128(a: f128, x: i32) -> f128; /// Returns the sine of an `f32`. /// diff --git a/library/core/src/num/f128.rs b/library/core/src/num/f128.rs index 8fe81a9f528..9362dc87654 100644 --- a/library/core/src/num/f128.rs +++ b/library/core/src/num/f128.rs @@ -228,6 +228,16 @@ impl f128 { /// the bit pattern of NaNs are conserved over arithmetic operations, the result of /// `is_sign_positive` on a NaN might produce an unexpected result in some cases. /// See [explanation of NaN as a special value](f32) for more info. + /// + /// ``` + /// #![feature(f128)] + /// + /// let f = 7.0_f128; + /// let g = -7.0_f128; + /// + /// assert!(f.is_sign_positive()); + /// assert!(!g.is_sign_positive()); + /// ``` #[inline] #[must_use] #[unstable(feature = "f128", issue = "116909")] @@ -241,6 +251,16 @@ impl f128 { /// the bit pattern of NaNs are conserved over arithmetic operations, the result of /// `is_sign_negative` on a NaN might produce an unexpected result in some cases. /// See [explanation of NaN as a special value](f32) for more info. + /// + /// ``` + /// #![feature(f128)] + /// + /// let f = 7.0_f128; + /// let g = -7.0_f128; + /// + /// assert!(!f.is_sign_negative()); + /// assert!(g.is_sign_negative()); + /// ``` #[inline] #[must_use] #[unstable(feature = "f128", issue = "116909")] diff --git a/library/core/src/num/f16.rs b/library/core/src/num/f16.rs index 4290245ab29..c4d4584544b 100644 --- a/library/core/src/num/f16.rs +++ b/library/core/src/num/f16.rs @@ -224,6 +224,16 @@ impl f16 { /// the bit pattern of NaNs are conserved over arithmetic operations, the result of /// `is_sign_positive` on a NaN might produce an unexpected result in some cases. /// See [explanation of NaN as a special value](f32) for more info. + /// + /// ``` + /// #![feature(f16)] + /// + /// let f = 7.0_f16; + /// let g = -7.0_f16; + /// + /// assert!(f.is_sign_positive()); + /// assert!(!g.is_sign_positive()); + /// ``` #[inline] #[must_use] #[unstable(feature = "f16", issue = "116909")] @@ -237,6 +247,16 @@ impl f16 { /// the bit pattern of NaNs are conserved over arithmetic operations, the result of /// `is_sign_negative` on a NaN might produce an unexpected result in some cases. /// See [explanation of NaN as a special value](f32) for more info. + /// + /// ``` + /// #![feature(f16)] + /// + /// let f = 7.0_f16; + /// let g = -7.0_f16; + /// + /// assert!(!f.is_sign_negative()); + /// assert!(g.is_sign_negative()); + /// ``` #[inline] #[must_use] #[unstable(feature = "f16", issue = "116909")] diff --git a/library/core/src/num/f64.rs b/library/core/src/num/f64.rs index d56f346d95e..db8e1f318ad 100644 --- a/library/core/src/num/f64.rs +++ b/library/core/src/num/f64.rs @@ -1111,7 +1111,6 @@ impl f64 { /// ``` /// assert!((1f64).to_bits() != 1f64 as u64); // to_bits() is not casting! /// assert_eq!((12.5f64).to_bits(), 0x4029000000000000); - /// /// ``` #[must_use = "this returns the result of the operation, \ without modifying the original"] diff --git a/library/std/src/f128.rs b/library/std/src/f128.rs index 4710d7c50b4..491235a872e 100644 --- a/library/std/src/f128.rs +++ b/library/std/src/f128.rs @@ -7,5 +7,29 @@ #[cfg(test)] mod tests; +#[cfg(not(test))] +use crate::intrinsics; + #[unstable(feature = "f128", issue = "116909")] pub use core::f128::consts; + +#[cfg(not(test))] +impl f128 { + /// Raises a number to an integer power. + /// + /// Using this function is generally faster than using `powf`. + /// It might have a different sequence of rounding operations than `powf`, + /// so the results are not guaranteed to agree. + /// + /// # Unspecified precision + /// + /// The precision of this function is non-deterministic. This means it varies by platform, Rust version, and + /// can even differ within the same execution from one invocation to the next. + #[inline] + #[rustc_allow_incoherent_impl] + #[unstable(feature = "f128", issue = "116909")] + #[must_use = "method returns a new number and does not mutate the original value"] + pub fn powi(self, n: i32) -> f128 { + unsafe { intrinsics::powif128(self, n) } + } +} diff --git a/library/std/src/f16.rs b/library/std/src/f16.rs index c36f9f5d4c6..1cb655ffabd 100644 --- a/library/std/src/f16.rs +++ b/library/std/src/f16.rs @@ -7,5 +7,29 @@ #[cfg(test)] mod tests; +#[cfg(not(test))] +use crate::intrinsics; + #[unstable(feature = "f16", issue = "116909")] pub use core::f16::consts; + +#[cfg(not(test))] +impl f16 { + /// Raises a number to an integer power. + /// + /// Using this function is generally faster than using `powf`. + /// It might have a different sequence of rounding operations than `powf`, + /// so the results are not guaranteed to agree. + /// + /// # Unspecified precision + /// + /// The precision of this function is non-deterministic. This means it varies by platform, Rust version, and + /// can even differ within the same execution from one invocation to the next. + #[inline] + #[rustc_allow_incoherent_impl] + #[unstable(feature = "f16", issue = "116909")] + #[must_use = "method returns a new number and does not mutate the original value"] + pub fn powi(self, n: i32) -> f16 { + unsafe { intrinsics::powif16(self, n) } + } +} |
