diff options
| author | bors <bors@rust-lang.org> | 2024-03-16 02:02:00 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2024-03-16 02:02:00 +0000 |
| commit | c03ea3dfd907e7dc6305ebf20c94f3a1f1d9fed7 (patch) | |
| tree | 79407c0172239c031f2658cfd767776e5c7172ea /compiler/rustc_middle | |
| parent | 05a2be3def211255dc7640b006ac10f0f02baf5c (diff) | |
| parent | 2098fec0809521ea8dd489f6cd5f09337a31764f (diff) | |
| download | rust-c03ea3dfd907e7dc6305ebf20c94f3a1f1d9fed7.tar.gz rust-c03ea3dfd907e7dc6305ebf20c94f3a1f1d9fed7.zip | |
Auto merge of #121926 - tgross35:f16-f128-step3-feature-gate, r=compiler-errors,petrochenkov
`f16` and `f128` step 3: compiler support & feature gate Continuation of https://github.com/rust-lang/rust/pull/121841, another portion of https://github.com/rust-lang/rust/pull/114607 This PR exposes the new types to the world and adds a feature gate. Marking this as a draft because I need some feedback on where I did the feature gate check. It also does not yet catch type via suffixed literals (so the feature gate test will fail, probably some others too because I haven't belssed). If there is a better place to check all types after resolution, I can do that. If not, I figure maybe I can add a second gate location in AST when it checks numeric suffixes. Unfortunately I still don't think there is much testing to be done for correctness (codegen tests or parsed value checks) until we have basic library support. I think that will be the next step. Tracking issue: https://github.com/rust-lang/rust/issues/116909 r? `@compiler-errors` cc `@Nilstrieb` `@rustbot` label +F-f16_and_f128
Diffstat (limited to 'compiler/rustc_middle')
| -rw-r--r-- | compiler/rustc_middle/src/mir/interpret/value.rs | 22 | ||||
| -rw-r--r-- | compiler/rustc_middle/src/ty/consts/int.rs | 44 |
2 files changed, 64 insertions, 2 deletions
diff --git a/compiler/rustc_middle/src/mir/interpret/value.rs b/compiler/rustc_middle/src/mir/interpret/value.rs index e937c17c8ac..24d4a79c7d7 100644 --- a/compiler/rustc_middle/src/mir/interpret/value.rs +++ b/compiler/rustc_middle/src/mir/interpret/value.rs @@ -3,7 +3,7 @@ use std::fmt; use either::{Either, Left, Right}; use rustc_apfloat::{ - ieee::{Double, Single}, + ieee::{Double, Half, Quad, Single}, Float, }; use rustc_macros::HashStable; @@ -202,6 +202,11 @@ impl<Prov> Scalar<Prov> { } #[inline] + pub fn from_f16(f: Half) -> Self { + Scalar::Int(f.into()) + } + + #[inline] pub fn from_f32(f: Single) -> Self { Scalar::Int(f.into()) } @@ -211,6 +216,11 @@ impl<Prov> Scalar<Prov> { Scalar::Int(f.into()) } + #[inline] + pub fn from_f128(f: Quad) -> Self { + Scalar::Int(f.into()) + } + /// This is almost certainly not the method you want! You should dispatch on the type /// and use `to_{u8,u16,...}`/`scalar_to_ptr` to perform ptr-to-int / int-to-ptr casts as needed. /// @@ -423,6 +433,11 @@ impl<'tcx, Prov: Provenance> Scalar<Prov> { } #[inline] + pub fn to_f16(self) -> InterpResult<'tcx, Half> { + self.to_float() + } + + #[inline] pub fn to_f32(self) -> InterpResult<'tcx, Single> { self.to_float() } @@ -431,4 +446,9 @@ impl<'tcx, Prov: Provenance> Scalar<Prov> { pub fn to_f64(self) -> InterpResult<'tcx, Double> { self.to_float() } + + #[inline] + pub fn to_f128(self) -> InterpResult<'tcx, Quad> { + self.to_float() + } } diff --git a/compiler/rustc_middle/src/ty/consts/int.rs b/compiler/rustc_middle/src/ty/consts/int.rs index a70e01645f4..71d7dfd8b01 100644 --- a/compiler/rustc_middle/src/ty/consts/int.rs +++ b/compiler/rustc_middle/src/ty/consts/int.rs @@ -1,4 +1,4 @@ -use rustc_apfloat::ieee::{Double, Single}; +use rustc_apfloat::ieee::{Double, Half, Quad, Single}; use rustc_apfloat::Float; use rustc_errors::{DiagArgValue, IntoDiagArg}; use rustc_serialize::{Decodable, Decoder, Encodable, Encoder}; @@ -370,6 +370,11 @@ impl ScalarInt { } #[inline] + pub fn try_to_f16(self) -> Result<Half, Size> { + self.try_to_float() + } + + #[inline] pub fn try_to_f32(self) -> Result<Single, Size> { self.try_to_float() } @@ -378,6 +383,11 @@ impl ScalarInt { pub fn try_to_f64(self) -> Result<Double, Size> { self.try_to_float() } + + #[inline] + pub fn try_to_f128(self) -> Result<Quad, Size> { + self.try_to_float() + } } macro_rules! from { @@ -450,6 +460,22 @@ impl TryFrom<ScalarInt> for char { } } +impl From<Half> for ScalarInt { + #[inline] + fn from(f: Half) -> Self { + // We trust apfloat to give us properly truncated data. + Self { data: f.to_bits(), size: NonZero::new((Half::BITS / 8) as u8).unwrap() } + } +} + +impl TryFrom<ScalarInt> for Half { + type Error = Size; + #[inline] + fn try_from(int: ScalarInt) -> Result<Self, Size> { + int.to_bits(Size::from_bytes(2)).map(Self::from_bits) + } +} + impl From<Single> for ScalarInt { #[inline] fn from(f: Single) -> Self { @@ -482,6 +508,22 @@ impl TryFrom<ScalarInt> for Double { } } +impl From<Quad> for ScalarInt { + #[inline] + fn from(f: Quad) -> Self { + // We trust apfloat to give us properly truncated data. + Self { data: f.to_bits(), size: NonZero::new((Quad::BITS / 8) as u8).unwrap() } + } +} + +impl TryFrom<ScalarInt> for Quad { + type Error = Size; + #[inline] + fn try_from(int: ScalarInt) -> Result<Self, Size> { + int.to_bits(Size::from_bytes(16)).map(Self::from_bits) + } +} + impl fmt::Debug for ScalarInt { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { // Dispatch to LowerHex below. |
