@@ -40,18 +40,20 @@ pub(crate) enum MinMax {
4040 /// In particular, `-0.0` is considered smaller than `+0.0` and
4141 /// if either input is NaN, the result is NaN.
4242 Minimum ,
43- /// The IEEE-2008 `minNum` operation - see `f32::min` etc.
43+ /// The IEEE-2008 `minNum` operation with the SNaN handling of the
44+ /// IEEE-2019 `minimumNumber` operation - see `f32::min` etc.
4445 /// In particular, if the inputs are `-0.0` and `+0.0`, the result is non-deterministic,
45- /// and if one argument is NaN, the other one is returned.
46- MinNum ,
46+ /// and if one argument is NaN (quiet or signaling) , the other one is returned.
47+ MinimumNumber ,
4748 /// The IEEE-2019 `maximum` operation - see `f32::maximum` etc.
4849 /// In particular, `-0.0` is considered smaller than `+0.0` and
4950 /// if either input is NaN, the result is NaN.
5051 Maximum ,
51- /// The IEEE-2008 `maxNum` operation - see `f32::max` etc.
52+ /// The IEEE-2008 `maxNum` operation with the SNaN handling of the
53+ /// IEEE-2019 `maximumNumber` operation - see `f32::max` etc.
5254 /// In particular, if the inputs are `-0.0` and `+0.0`, the result is non-deterministic,
53- /// and if one argument is NaN, the other one is returned.
54- MaxNum ,
55+ /// and if one argument is NaN (quiet or signaling) , the other one is returned.
56+ MaximumNumber ,
5557}
5658
5759/// Directly returns an `Allocation` containing an absolute path representation of the given type.
@@ -524,10 +526,18 @@ impl<'tcx, M: Machine<'tcx>> InterpCx<'tcx, M> {
524526 self . write_scalar ( Scalar :: from_target_usize ( align. bytes ( ) , self ) , dest) ?;
525527 }
526528
527- sym:: minnumf16 => self . float_minmax_intrinsic :: < Half > ( args, MinMax :: MinNum , dest) ?,
528- sym:: minnumf32 => self . float_minmax_intrinsic :: < Single > ( args, MinMax :: MinNum , dest) ?,
529- sym:: minnumf64 => self . float_minmax_intrinsic :: < Double > ( args, MinMax :: MinNum , dest) ?,
530- sym:: minnumf128 => self . float_minmax_intrinsic :: < Quad > ( args, MinMax :: MinNum , dest) ?,
529+ sym:: minnumf16 => {
530+ self . float_minmax_intrinsic :: < Half > ( args, MinMax :: MinimumNumber , dest) ?
531+ }
532+ sym:: minnumf32 => {
533+ self . float_minmax_intrinsic :: < Single > ( args, MinMax :: MinimumNumber , dest) ?
534+ }
535+ sym:: minnumf64 => {
536+ self . float_minmax_intrinsic :: < Double > ( args, MinMax :: MinimumNumber , dest) ?
537+ }
538+ sym:: minnumf128 => {
539+ self . float_minmax_intrinsic :: < Quad > ( args, MinMax :: MinimumNumber , dest) ?
540+ }
531541
532542 sym:: minimumf16 => self . float_minmax_intrinsic :: < Half > ( args, MinMax :: Minimum , dest) ?,
533543 sym:: minimumf32 => {
@@ -538,10 +548,18 @@ impl<'tcx, M: Machine<'tcx>> InterpCx<'tcx, M> {
538548 }
539549 sym:: minimumf128 => self . float_minmax_intrinsic :: < Quad > ( args, MinMax :: Minimum , dest) ?,
540550
541- sym:: maxnumf16 => self . float_minmax_intrinsic :: < Half > ( args, MinMax :: MaxNum , dest) ?,
542- sym:: maxnumf32 => self . float_minmax_intrinsic :: < Single > ( args, MinMax :: MaxNum , dest) ?,
543- sym:: maxnumf64 => self . float_minmax_intrinsic :: < Double > ( args, MinMax :: MaxNum , dest) ?,
544- sym:: maxnumf128 => self . float_minmax_intrinsic :: < Quad > ( args, MinMax :: MaxNum , dest) ?,
551+ sym:: maxnumf16 => {
552+ self . float_minmax_intrinsic :: < Half > ( args, MinMax :: MaximumNumber , dest) ?
553+ }
554+ sym:: maxnumf32 => {
555+ self . float_minmax_intrinsic :: < Single > ( args, MinMax :: MaximumNumber , dest) ?
556+ }
557+ sym:: maxnumf64 => {
558+ self . float_minmax_intrinsic :: < Double > ( args, MinMax :: MaximumNumber , dest) ?
559+ }
560+ sym:: maxnumf128 => {
561+ self . float_minmax_intrinsic :: < Quad > ( args, MinMax :: MaximumNumber , dest) ?
562+ }
545563
546564 sym:: maximumf16 => self . float_minmax_intrinsic :: < Half > ( args, MinMax :: Maximum , dest) ?,
547565 sym:: maximumf32 => {
@@ -966,16 +984,16 @@ impl<'tcx, M: Machine<'tcx>> InterpCx<'tcx, M> {
966984 {
967985 let a: F = a. to_float ( ) ?;
968986 let b: F = b. to_float ( ) ?;
969- let res = if matches ! ( op, MinMax :: MinNum | MinMax :: MaxNum ) && a == b {
987+ let res = if matches ! ( op, MinMax :: MinimumNumber | MinMax :: MaximumNumber ) && a == b {
970988 // They are definitely not NaN (those are never equal), but they could be `+0` and `-0`.
971989 // Let the machine decide which one to return.
972990 M :: equal_float_min_max ( self , a, b)
973991 } else {
974992 let result = match op {
975993 MinMax :: Minimum => a. minimum ( b) ,
976- MinMax :: MinNum => a. min ( b) ,
994+ MinMax :: MinimumNumber => a. min ( b) ,
977995 MinMax :: Maximum => a. maximum ( b) ,
978- MinMax :: MaxNum => a. max ( b) ,
996+ MinMax :: MaximumNumber => a. max ( b) ,
979997 } ;
980998 self . adjust_nan ( result, & [ a, b] )
981999 } ;
0 commit comments