Skip to content
Closed
Changes from 1 commit
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
356027b
ast_passes/validation: update module docs
jieyouxu Apr 17, 2024
0e35216
ast_passes/validation: update attribute macro example
jieyouxu Apr 17, 2024
9aec5c5
Add test for fn pointer duplication.
cjgillot Apr 9, 2024
d223ba6
Document test.
cjgillot Apr 10, 2024
4c779d7
Mark `foo` as explicitly inline.
cjgillot May 4, 2024
414ebea
add serde derive Serialize to stable_mir
Jun 17, 2024
0c0dfb8
Switch back `non_local_definitions` lint to allow-by-default
Urgau Jun 27, 2024
648cb16
Enable const casting for `f16` and `f128`
tgross35 Jun 13, 2024
4a11ab0
Fix Markdown tables in platform-support.md
xen0n Jun 27, 2024
ae64514
Migrate `run-make/override-aliased-flags` to `rmake.rs`
GuillaumeGomez Jun 27, 2024
81c2c57
Make queries more explicit
compiler-errors Jun 27, 2024
c9870cf
supertrait_def_ids
compiler-errors Jun 27, 2024
1160eec
supertrait_def_ids was already implemented in middle
compiler-errors Jun 27, 2024
8d27980
docs: check if the disambiguator matches its suffix
bvanjoi Jun 27, 2024
91d3ac7
add test for #126986
bvanjoi Jun 27, 2024
ab1b48e
rustc_data_structures: Explicitly check for 64-bit atomics support
glaubitz Jun 28, 2024
30561c0
Rollup merge of #123714 - cjgillot:static-fnptr, r=wesleywiser
GuillaumeGomez Jun 28, 2024
56ab3c0
Rollup merge of #124091 - jieyouxu:ast-validation-top-level-docs, r=w…
GuillaumeGomez Jun 28, 2024
b1a90c4
Rollup merge of #126963 - runtimeverification:smir_serde_derive, r=ol…
GuillaumeGomez Jun 28, 2024
9d698e0
Rollup merge of #127015 - Urgau:non_local_def-tmp-allow, r=lqd
GuillaumeGomez Jun 28, 2024
1d318be
Rollup merge of #127016 - bvanjoi:fix-126986, r=GuillaumeGomez
GuillaumeGomez Jun 28, 2024
abc2c92
Rollup merge of #127029 - xen0n:fix-platform-support-table, r=lqd
GuillaumeGomez Jun 28, 2024
5f4d142
Rollup merge of #127032 - tgross35:f16-f128-const-eval-cast, r=oli-obk
GuillaumeGomez Jun 28, 2024
15b0f7e
Rollup merge of #127041 - GuillaumeGomez:run-make-override-aliased-fl…
GuillaumeGomez Jun 28, 2024
1f2cb06
Rollup merge of #127045 - compiler-errors:explicit, r=oli-obk
GuillaumeGomez Jun 28, 2024
613e3df
Rollup merge of #127075 - glaubitz:copy-and-paste-fix, r=SparrowLii
GuillaumeGomez Jun 28, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Enable const casting for f16 and f128
  • Loading branch information
tgross35 committed Jun 27, 2024
commit 648cb1692050ecbcb5dfbb21623debbf5244ff15
27 changes: 17 additions & 10 deletions compiler/rustc_const_eval/src/interpret/cast.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use std::assert_matches::assert_matches;

use rustc_apfloat::ieee::{Double, Single};
use rustc_apfloat::ieee::{Double, Half, Quad, Single};
use rustc_apfloat::{Float, FloatConvert};
use rustc_middle::mir::interpret::{InterpResult, PointerArithmetic, Scalar};
use rustc_middle::mir::CastKind;
Expand Down Expand Up @@ -187,10 +187,10 @@ impl<'tcx, M: Machine<'tcx>> InterpCx<'tcx, M> {
bug!("FloatToFloat/FloatToInt cast: source type {} is not a float type", src.layout.ty)
};
let val = match fty {
FloatTy::F16 => unimplemented!("f16_f128"),
FloatTy::F16 => self.cast_from_float(src.to_scalar().to_f16()?, cast_to.ty),
FloatTy::F32 => self.cast_from_float(src.to_scalar().to_f32()?, cast_to.ty),
FloatTy::F64 => self.cast_from_float(src.to_scalar().to_f64()?, cast_to.ty),
FloatTy::F128 => unimplemented!("f16_f128"),
FloatTy::F128 => self.cast_from_float(src.to_scalar().to_f128()?, cast_to.ty),
};
Ok(ImmTy::from_scalar(val, cast_to))
}
Expand Down Expand Up @@ -296,18 +296,18 @@ impl<'tcx, M: Machine<'tcx>> InterpCx<'tcx, M> {
Float(fty) if signed => {
let v = v as i128;
match fty {
FloatTy::F16 => unimplemented!("f16_f128"),
FloatTy::F16 => Scalar::from_f16(Half::from_i128(v).value),
FloatTy::F32 => Scalar::from_f32(Single::from_i128(v).value),
FloatTy::F64 => Scalar::from_f64(Double::from_i128(v).value),
FloatTy::F128 => unimplemented!("f16_f128"),
FloatTy::F128 => Scalar::from_f128(Quad::from_i128(v).value),
}
}
// unsigned int -> float
Float(fty) => match fty {
FloatTy::F16 => unimplemented!("f16_f128"),
FloatTy::F16 => Scalar::from_f16(Half::from_u128(v).value),
FloatTy::F32 => Scalar::from_f32(Single::from_u128(v).value),
FloatTy::F64 => Scalar::from_f64(Double::from_u128(v).value),
FloatTy::F128 => unimplemented!("f16_f128"),
FloatTy::F128 => Scalar::from_f128(Quad::from_u128(v).value),
},

// u8 -> char
Expand All @@ -321,7 +321,12 @@ impl<'tcx, M: Machine<'tcx>> InterpCx<'tcx, M> {
/// Low-level cast helper function. Converts an apfloat `f` into int or float types.
fn cast_from_float<F>(&self, f: F, dest_ty: Ty<'tcx>) -> Scalar<M::Provenance>
where
F: Float + Into<Scalar<M::Provenance>> + FloatConvert<Single> + FloatConvert<Double>,
F: Float
+ Into<Scalar<M::Provenance>>
+ FloatConvert<Half>
+ FloatConvert<Single>
+ FloatConvert<Double>
+ FloatConvert<Quad>,
{
use rustc_type_ir::TyKind::*;

Expand Down Expand Up @@ -358,10 +363,12 @@ impl<'tcx, M: Machine<'tcx>> InterpCx<'tcx, M> {
}
// float -> float
Float(fty) => match fty {
FloatTy::F16 => unimplemented!("f16_f128"),
FloatTy::F16 => Scalar::from_f16(adjust_nan(self, f, f.convert(&mut false).value)),
FloatTy::F32 => Scalar::from_f32(adjust_nan(self, f, f.convert(&mut false).value)),
FloatTy::F64 => Scalar::from_f64(adjust_nan(self, f, f.convert(&mut false).value)),
FloatTy::F128 => unimplemented!("f16_f128"),
FloatTy::F128 => {
Scalar::from_f128(adjust_nan(self, f, f.convert(&mut false).value))
}
},
// That's it.
_ => span_bug!(self.cur_span(), "invalid float to {} cast", dest_ty),
Expand Down