1
Fork 0

Enable const evaluation for f16 and f128

This excludes casting, which needs more tests.
This commit is contained in:
Trevor Gross 2024-06-13 08:11:16 -05:00
parent 921645c737
commit c906d2e428
2 changed files with 22 additions and 2 deletions

View file

@ -362,14 +362,18 @@ impl<'tcx, M: Machine<'tcx>> InterpCx<'tcx, M> {
let left = left.to_scalar(); let left = left.to_scalar();
let right = right.to_scalar(); let right = right.to_scalar();
Ok(match fty { Ok(match fty {
FloatTy::F16 => unimplemented!("f16_f128"), FloatTy::F16 => {
self.binary_float_op(bin_op, layout, left.to_f16()?, right.to_f16()?)
}
FloatTy::F32 => { FloatTy::F32 => {
self.binary_float_op(bin_op, layout, left.to_f32()?, right.to_f32()?) self.binary_float_op(bin_op, layout, left.to_f32()?, right.to_f32()?)
} }
FloatTy::F64 => { FloatTy::F64 => {
self.binary_float_op(bin_op, layout, left.to_f64()?, right.to_f64()?) self.binary_float_op(bin_op, layout, left.to_f64()?, right.to_f64()?)
} }
FloatTy::F128 => unimplemented!("f16_f128"), FloatTy::F128 => {
self.binary_float_op(bin_op, layout, left.to_f128()?, right.to_f128()?)
}
}) })
} }
_ if left.layout.ty.is_integral() => { _ if left.layout.ty.is_integral() => {
@ -431,8 +435,10 @@ impl<'tcx, M: Machine<'tcx>> InterpCx<'tcx, M> {
let val = val.to_scalar(); let val = val.to_scalar();
// No NaN adjustment here, `-` is a bitwise operation! // No NaN adjustment here, `-` is a bitwise operation!
let res = match (un_op, fty) { let res = match (un_op, fty) {
(Neg, FloatTy::F16) => Scalar::from_f16(-val.to_f16()?),
(Neg, FloatTy::F32) => Scalar::from_f32(-val.to_f32()?), (Neg, FloatTy::F32) => Scalar::from_f32(-val.to_f32()?),
(Neg, FloatTy::F64) => Scalar::from_f64(-val.to_f64()?), (Neg, FloatTy::F64) => Scalar::from_f64(-val.to_f64()?),
(Neg, FloatTy::F128) => Scalar::from_f128(-val.to_f128()?),
_ => span_bug!(self.cur_span(), "Invalid float op {:?}", un_op), _ => span_bug!(self.cur_span(), "Invalid float op {:?}", un_op),
}; };
Ok(ImmTy::from_scalar(res, layout)) Ok(ImmTy::from_scalar(res, layout))

View file

@ -69,6 +69,13 @@ impl<Prov: Provenance> fmt::LowerHex for Scalar<Prov> {
} }
} }
impl<Prov> From<Half> for Scalar<Prov> {
#[inline(always)]
fn from(f: Half) -> Self {
Scalar::from_f16(f)
}
}
impl<Prov> From<Single> for Scalar<Prov> { impl<Prov> From<Single> for Scalar<Prov> {
#[inline(always)] #[inline(always)]
fn from(f: Single) -> Self { fn from(f: Single) -> Self {
@ -83,6 +90,13 @@ impl<Prov> From<Double> for Scalar<Prov> {
} }
} }
impl<Prov> From<Quad> for Scalar<Prov> {
#[inline(always)]
fn from(f: Quad) -> Self {
Scalar::from_f128(f)
}
}
impl<Prov> From<ScalarInt> for Scalar<Prov> { impl<Prov> From<ScalarInt> for Scalar<Prov> {
#[inline(always)] #[inline(always)]
fn from(ptr: ScalarInt) -> Self { fn from(ptr: ScalarInt) -> Self {