Skip to content

Commit 4426b24

Browse files
committed
refactor: replace multiple float_<mode>_intrinsic rounding methods with a single, parametrized one
1 parent 79dd2ef commit 4426b24

File tree

1 file changed

+98
-87
lines changed

1 file changed

+98
-87
lines changed

compiler/rustc_const_eval/src/interpret/intrinsics.rs

Lines changed: 98 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -518,36 +518,102 @@ impl<'tcx, M: Machine<'tcx>> InterpCx<'tcx, M> {
518518
sym::fabsf64 => self.float_abs_intrinsic::<Double>(args, dest)?,
519519
sym::fabsf128 => self.float_abs_intrinsic::<Quad>(args, dest)?,
520520

521-
sym::floorf16 => self.float_floor_intrinsic::<Half>(args, dest)?,
522-
sym::floorf32 => self.float_floor_intrinsic::<Single>(args, dest)?,
523-
sym::floorf64 => self.float_floor_intrinsic::<Double>(args, dest)?,
524-
sym::floorf128 => self.float_floor_intrinsic::<Quad>(args, dest)?,
525-
526-
sym::ceilf16 => self.float_ceil_intrinsic::<Half>(args, dest)?,
527-
sym::ceilf32 => self.float_ceil_intrinsic::<Single>(args, dest)?,
528-
sym::ceilf64 => self.float_ceil_intrinsic::<Double>(args, dest)?,
529-
sym::ceilf128 => self.float_ceil_intrinsic::<Quad>(args, dest)?,
530-
531-
sym::truncf16 => self.float_trunc_intrinsic::<Half>(args, dest)?,
532-
sym::truncf32 => self.float_trunc_intrinsic::<Single>(args, dest)?,
533-
sym::truncf64 => self.float_trunc_intrinsic::<Double>(args, dest)?,
534-
sym::truncf128 => self.float_trunc_intrinsic::<Quad>(args, dest)?,
535-
536-
sym::roundf16 => self.float_round_intrinsic::<Half>(args, dest)?,
537-
sym::roundf32 => self.float_round_intrinsic::<Single>(args, dest)?,
538-
sym::roundf64 => self.float_round_intrinsic::<Double>(args, dest)?,
539-
sym::roundf128 => self.float_round_intrinsic::<Quad>(args, dest)?,
540-
541-
sym::round_ties_even_f16 => self.float_round_ties_even_intrinsic::<Half>(args, dest)?,
542-
sym::round_ties_even_f32 => {
543-
self.float_round_ties_even_intrinsic::<Single>(args, dest)?
544-
}
545-
sym::round_ties_even_f64 => {
546-
self.float_round_ties_even_intrinsic::<Double>(args, dest)?
547-
}
548-
sym::round_ties_even_f128 => {
549-
self.float_round_ties_even_intrinsic::<Quad>(args, dest)?
550-
}
521+
sym::floorf16 => self.float_round_intrinsic::<Half>(
522+
args,
523+
dest,
524+
rustc_apfloat::Round::TowardNegative,
525+
)?,
526+
sym::floorf32 => self.float_round_intrinsic::<Single>(
527+
args,
528+
dest,
529+
rustc_apfloat::Round::TowardNegative,
530+
)?,
531+
sym::floorf64 => self.float_round_intrinsic::<Double>(
532+
args,
533+
dest,
534+
rustc_apfloat::Round::TowardNegative,
535+
)?,
536+
sym::floorf128 => self.float_round_intrinsic::<Quad>(
537+
args,
538+
dest,
539+
rustc_apfloat::Round::TowardNegative,
540+
)?,
541+
542+
sym::ceilf16 => self.float_round_intrinsic::<Half>(
543+
args,
544+
dest,
545+
rustc_apfloat::Round::TowardPositive,
546+
)?,
547+
sym::ceilf32 => self.float_round_intrinsic::<Single>(
548+
args,
549+
dest,
550+
rustc_apfloat::Round::TowardPositive,
551+
)?,
552+
sym::ceilf64 => self.float_round_intrinsic::<Double>(
553+
args,
554+
dest,
555+
rustc_apfloat::Round::TowardPositive,
556+
)?,
557+
sym::ceilf128 => self.float_round_intrinsic::<Quad>(
558+
args,
559+
dest,
560+
rustc_apfloat::Round::TowardPositive,
561+
)?,
562+
563+
sym::truncf16 => {
564+
self.float_round_intrinsic::<Half>(args, dest, rustc_apfloat::Round::TowardZero)?
565+
}
566+
sym::truncf32 => {
567+
self.float_round_intrinsic::<Single>(args, dest, rustc_apfloat::Round::TowardZero)?
568+
}
569+
sym::truncf64 => {
570+
self.float_round_intrinsic::<Double>(args, dest, rustc_apfloat::Round::TowardZero)?
571+
}
572+
sym::truncf128 => {
573+
self.float_round_intrinsic::<Quad>(args, dest, rustc_apfloat::Round::TowardZero)?
574+
}
575+
576+
sym::roundf16 => self.float_round_intrinsic::<Half>(
577+
args,
578+
dest,
579+
rustc_apfloat::Round::NearestTiesToAway,
580+
)?,
581+
sym::roundf32 => self.float_round_intrinsic::<Single>(
582+
args,
583+
dest,
584+
rustc_apfloat::Round::NearestTiesToAway,
585+
)?,
586+
sym::roundf64 => self.float_round_intrinsic::<Double>(
587+
args,
588+
dest,
589+
rustc_apfloat::Round::NearestTiesToAway,
590+
)?,
591+
sym::roundf128 => self.float_round_intrinsic::<Quad>(
592+
args,
593+
dest,
594+
rustc_apfloat::Round::NearestTiesToAway,
595+
)?,
596+
597+
sym::round_ties_even_f16 => self.float_round_intrinsic::<Half>(
598+
args,
599+
dest,
600+
rustc_apfloat::Round::NearestTiesToEven,
601+
)?,
602+
sym::round_ties_even_f32 => self.float_round_intrinsic::<Single>(
603+
args,
604+
dest,
605+
rustc_apfloat::Round::NearestTiesToEven,
606+
)?,
607+
sym::round_ties_even_f64 => self.float_round_intrinsic::<Double>(
608+
args,
609+
dest,
610+
rustc_apfloat::Round::NearestTiesToEven,
611+
)?,
612+
sym::round_ties_even_f128 => self.float_round_intrinsic::<Quad>(
613+
args,
614+
dest,
615+
rustc_apfloat::Round::NearestTiesToEven,
616+
)?,
551617

552618
// Unsupported intrinsic: skip the return_to_block below.
553619
_ => return interp_ok(false),
@@ -932,72 +998,17 @@ impl<'tcx, M: Machine<'tcx>> InterpCx<'tcx, M> {
932998
interp_ok(())
933999
}
9341000

935-
fn float_floor_intrinsic<F>(
936-
&mut self,
937-
args: &[OpTy<'tcx, M::Provenance>],
938-
dest: &MPlaceTy<'tcx, M::Provenance>,
939-
) -> InterpResult<'tcx, ()>
940-
where
941-
F: rustc_apfloat::Float + rustc_apfloat::FloatConvert<F> + Into<Scalar<M::Provenance>>,
942-
{
943-
let x: F = self.read_scalar(&args[0])?.to_float()?;
944-
let res = x.round_to_integral(rustc_apfloat::Round::TowardNegative).value;
945-
self.write_scalar(res, dest)?;
946-
interp_ok(())
947-
}
948-
949-
fn float_ceil_intrinsic<F>(
950-
&mut self,
951-
args: &[OpTy<'tcx, M::Provenance>],
952-
dest: &MPlaceTy<'tcx, M::Provenance>,
953-
) -> InterpResult<'tcx, ()>
954-
where
955-
F: rustc_apfloat::Float + rustc_apfloat::FloatConvert<F> + Into<Scalar<M::Provenance>>,
956-
{
957-
let x: F = self.read_scalar(&args[0])?.to_float()?;
958-
let res = x.round_to_integral(rustc_apfloat::Round::TowardPositive).value;
959-
self.write_scalar(res, dest)?;
960-
interp_ok(())
961-
}
962-
963-
fn float_trunc_intrinsic<F>(
964-
&mut self,
965-
args: &[OpTy<'tcx, M::Provenance>],
966-
dest: &MPlaceTy<'tcx, M::Provenance>,
967-
) -> InterpResult<'tcx, ()>
968-
where
969-
F: rustc_apfloat::Float + rustc_apfloat::FloatConvert<F> + Into<Scalar<M::Provenance>>,
970-
{
971-
let x: F = self.read_scalar(&args[0])?.to_float()?;
972-
let res = x.round_to_integral(rustc_apfloat::Round::TowardZero).value;
973-
self.write_scalar(res, dest)?;
974-
interp_ok(())
975-
}
976-
9771001
fn float_round_intrinsic<F>(
9781002
&mut self,
9791003
args: &[OpTy<'tcx, M::Provenance>],
9801004
dest: &MPlaceTy<'tcx, M::Provenance>,
1005+
mode: rustc_apfloat::Round,
9811006
) -> InterpResult<'tcx, ()>
9821007
where
9831008
F: rustc_apfloat::Float + rustc_apfloat::FloatConvert<F> + Into<Scalar<M::Provenance>>,
9841009
{
9851010
let x: F = self.read_scalar(&args[0])?.to_float()?;
986-
let res = x.round_to_integral(rustc_apfloat::Round::NearestTiesToAway).value;
987-
self.write_scalar(res, dest)?;
988-
interp_ok(())
989-
}
990-
991-
fn float_round_ties_even_intrinsic<F>(
992-
&mut self,
993-
args: &[OpTy<'tcx, M::Provenance>],
994-
dest: &MPlaceTy<'tcx, M::Provenance>,
995-
) -> InterpResult<'tcx, ()>
996-
where
997-
F: rustc_apfloat::Float + rustc_apfloat::FloatConvert<F> + Into<Scalar<M::Provenance>>,
998-
{
999-
let x: F = self.read_scalar(&args[0])?.to_float()?;
1000-
let res = x.round_to_integral(rustc_apfloat::Round::NearestTiesToEven).value;
1011+
let res = x.round_to_integral(mode).value;
10011012
self.write_scalar(res, dest)?;
10021013
interp_ok(())
10031014
}

0 commit comments

Comments
 (0)