@@ -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