@@ -5476,33 +5476,29 @@ MINT_IN_CASE(MINT_BRTRUE_I8_SP) ZEROP_SP(gint64, !=); MINT_IN_BREAK;
54765476 }
54775477 MINT_IN_CASE (MINT_CONV_OVF_U8_R4 ) {
54785478 float val = LOCAL_VAR (ip [2 ], float );
5479- if (mono_isnan (val ) || mono_trunc ( val ) != ( guint64 ) val )
5479+ if (! mono_try_trunc_u64 (val , ( guint64 * )( locals + ip [ 1 ])) )
54805480 THROW_EX (mono_get_exception_overflow (), ip );
5481- LOCAL_VAR (ip [1 ], guint64 ) = (guint64 )val ;
54825481 ip + = 3 ;
54835482 MINT_IN_BREAK ;
54845483 }
54855484 MINT_IN_CASE (MINT_CONV_OVF_U8_R8 ) {
54865485 double val = LOCAL_VAR (ip [2 ], double );
5487- if (mono_isnan (val ) || mono_trunc ( val ) != ( guint64 ) val )
5486+ if (! mono_try_trunc_u64 (val , ( guint64 * )( locals + ip [ 1 ])) )
54885487 THROW_EX (mono_get_exception_overflow (), ip );
5489- LOCAL_VAR (ip [1 ], guint64 ) = (guint64 )val ;
54905488 ip + = 3 ;
54915489 MINT_IN_BREAK ;
54925490 }
54935491 MINT_IN_CASE (MINT_CONV_OVF_I8_R4 ) {
54945492 float val = LOCAL_VAR (ip [2 ], float );
5495- if (mono_isnan (val ) || mono_trunc ( val ) != ( gint64 ) val )
5493+ if (! mono_try_trunc_i64 (val , ( gint64 * )( locals + ip [ 1 ])) )
54965494 THROW_EX (mono_get_exception_overflow (), ip );
5497- LOCAL_VAR (ip [1 ], gint64 ) = (gint64 )val ;
54985495 ip + = 3 ;
54995496 MINT_IN_BREAK ;
55005497 }
55015498 MINT_IN_CASE (MINT_CONV_OVF_I8_R8 ) {
55025499 double val = LOCAL_VAR (ip [2 ], double );
5503- if (mono_isnan (val ) || mono_trunc ( val ) != ( gint64 ) val )
5500+ if (! mono_try_trunc_i64 (val , ( gint64 * )( locals + ip [ 1 ])) )
55045501 THROW_EX (mono_get_exception_overflow (), ip );
5505- LOCAL_VAR (ip [1 ], gint64 ) = (gint64 )val ;
55065502 ip + = 3 ;
55075503 MINT_IN_BREAK ;
55085504 }
@@ -5804,17 +5800,20 @@ MINT_IN_CASE(MINT_BRTRUE_I8_SP) ZEROP_SP(gint64, !=); MINT_IN_BREAK;
58045800 }
58055801 MINT_IN_CASE (MINT_CONV_OVF_I4_R4 ) {
58065802 float val = LOCAL_VAR (ip [2 ], float );
5807- if (mono_isnan (val ) || mono_trunc (val ) != (gint32 )val )
5803+ double val_r8 = (double )val ;
5804+ if (val_r8 > ((double )G_MININT32 - 1 ) && val_r8 < ((double )G_MAXINT32 + 1 ))
5805+ LOCAL_VAR (ip [1 ], gint32 ) = (gint32 ) val ;
5806+ else
58085807 THROW_EX (mono_get_exception_overflow (), ip );
5809- LOCAL_VAR (ip [1 ], gint32 ) = (gint32 ) val ;
58105808 ip + = 3 ;
58115809 MINT_IN_BREAK ;
58125810 }
58135811 MINT_IN_CASE (MINT_CONV_OVF_I4_R8 ) {
58145812 double val = LOCAL_VAR (ip [2 ], double );
5815- if (val < G_MININT32 || val > G_MAXINT32 || isnan (val ))
5813+ if (val > ((double )G_MININT32 - 1 ) && val < ((double )G_MAXINT32 + 1 ))
5814+ LOCAL_VAR (ip [1 ], gint32 ) = (gint32 ) val ;
5815+ else
58165816 THROW_EX (mono_get_exception_overflow (), ip );
5817- LOCAL_VAR (ip [1 ], gint32 ) = (gint32 )val ;
58185817 ip + = 3 ;
58195818 MINT_IN_BREAK ;
58205819 }
@@ -5836,17 +5835,20 @@ MINT_IN_CASE(MINT_BRTRUE_I8_SP) ZEROP_SP(gint64, !=); MINT_IN_BREAK;
58365835 }
58375836 MINT_IN_CASE (MINT_CONV_OVF_U4_R4 ) {
58385837 float val = LOCAL_VAR (ip [2 ], float );
5839- if (mono_isnan (val ) || mono_trunc (val ) != (guint32 )val )
5838+ double val_r8 = val ;
5839+ if (val_r8 > -1.0 && val_r8 < ((double )G_MAXUINT32 + 1 ))
5840+ LOCAL_VAR (ip [1 ], gint32 ) = (guint32 )val ;
5841+ else
58405842 THROW_EX (mono_get_exception_overflow (), ip );
5841- LOCAL_VAR (ip [1 ], gint32 ) = (guint32 )val ;
58425843 ip + = 3 ;
58435844 MINT_IN_BREAK ;
58445845 }
58455846 MINT_IN_CASE (MINT_CONV_OVF_U4_R8 ) {
58465847 double val = LOCAL_VAR (ip [2 ], double );
5847- if (val < 0 || val > G_MAXUINT32 || isnan (val ))
5848+ if (val > -1.0 && val < ((double )G_MAXUINT32 + 1 ))
5849+ LOCAL_VAR (ip [1 ], gint32 ) = (guint32 )val ;
5850+ else
58485851 THROW_EX (mono_get_exception_overflow (), ip );
5849- LOCAL_VAR (ip [1 ], gint32 ) = (guint32 ) val ;
58505852 ip + = 3 ;
58515853 MINT_IN_BREAK ;
58525854 }
@@ -5884,17 +5886,19 @@ MINT_IN_CASE(MINT_BRTRUE_I8_SP) ZEROP_SP(gint64, !=); MINT_IN_BREAK;
58845886 }
58855887 MINT_IN_CASE (MINT_CONV_OVF_I2_R4 ) {
58865888 float val = LOCAL_VAR (ip [2 ], float );
5887- if (val < G_MININT16 || val > G_MAXINT16 || isnan (val ))
5889+ if (val > (G_MININT16 - 1 ) && val < (G_MAXINT16 + 1 ))
5890+ LOCAL_VAR (ip [1 ], gint32 ) = (gint16 ) val ;
5891+ else
58885892 THROW_EX (mono_get_exception_overflow (), ip );
5889- LOCAL_VAR (ip [1 ], gint32 ) = (gint16 ) val ;
58905893 ip + = 3 ;
58915894 MINT_IN_BREAK ;
58925895 }
58935896 MINT_IN_CASE (MINT_CONV_OVF_I2_R8 ) {
58945897 double val = LOCAL_VAR (ip [2 ], double );
5895- if (val < G_MININT16 || val > G_MAXINT16 || isnan (val ))
5898+ if (val > (G_MININT16 - 1 ) && val < (G_MAXINT16 + 1 ))
5899+ LOCAL_VAR (ip [1 ], gint32 ) = (gint16 ) val ;
5900+ else
58965901 THROW_EX (mono_get_exception_overflow (), ip );
5897- LOCAL_VAR (ip [1 ], gint32 ) = (gint16 ) val ;
58985902 ip + = 3 ;
58995903 MINT_IN_BREAK ;
59005904 }
@@ -5916,17 +5920,19 @@ MINT_IN_CASE(MINT_BRTRUE_I8_SP) ZEROP_SP(gint64, !=); MINT_IN_BREAK;
59165920 }
59175921 MINT_IN_CASE (MINT_CONV_OVF_U2_R4 ) {
59185922 float val = LOCAL_VAR (ip [2 ], float );
5919- if (val < 0 || val > G_MAXUINT16 || isnan (val ))
5923+ if (val > -1.0f && val < (G_MAXUINT16 + 1 ))
5924+ LOCAL_VAR (ip [1 ], gint32 ) = (guint16 ) val ;
5925+ else
59205926 THROW_EX (mono_get_exception_overflow (), ip );
5921- LOCAL_VAR (ip [1 ], gint32 ) = (guint16 ) val ;
59225927 ip + = 3 ;
59235928 MINT_IN_BREAK ;
59245929 }
59255930 MINT_IN_CASE (MINT_CONV_OVF_U2_R8 ) {
59265931 double val = LOCAL_VAR (ip [2 ], double );
5927- if (val < 0 || val > G_MAXUINT16 || isnan (val ))
5932+ if (val > -1.0 && val < (G_MAXUINT16 + 1 ))
5933+ LOCAL_VAR (ip [1 ], gint32 ) = (guint16 ) val ;
5934+ else
59285935 THROW_EX (mono_get_exception_overflow (), ip );
5929- LOCAL_VAR (ip [1 ], gint32 ) = (guint16 ) val ;
59305936 ip + = 3 ;
59315937 MINT_IN_BREAK ;
59325938 }
@@ -5964,17 +5970,19 @@ MINT_IN_CASE(MINT_BRTRUE_I8_SP) ZEROP_SP(gint64, !=); MINT_IN_BREAK;
59645970 }
59655971 MINT_IN_CASE (MINT_CONV_OVF_I1_R4 ) {
59665972 float val = LOCAL_VAR (ip [2 ], float );
5967- if (val < G_MININT8 || val > G_MAXINT8 || isnan (val ))
5973+ if (val > (G_MININT8 - 1 ) && val < (G_MAXINT8 + 1 ))
5974+ LOCAL_VAR (ip [1 ], gint32 ) = (gint8 ) val ;
5975+ else
59685976 THROW_EX (mono_get_exception_overflow (), ip );
5969- LOCAL_VAR (ip [1 ], gint32 ) = (gint8 ) val ;
59705977 ip + = 3 ;
59715978 MINT_IN_BREAK ;
59725979 }
59735980 MINT_IN_CASE (MINT_CONV_OVF_I1_R8 ) {
59745981 double val = LOCAL_VAR (ip [2 ], double );
5975- if (val < G_MININT8 || val > G_MAXINT8 || isnan (val ))
5982+ if (val > (G_MININT8 - 1 ) && val < (G_MAXINT8 + 1 ))
5983+ LOCAL_VAR (ip [1 ], gint32 ) = (gint8 ) val ;
5984+ else
59765985 THROW_EX (mono_get_exception_overflow (), ip );
5977- LOCAL_VAR (ip [1 ], gint32 ) = (gint8 ) val ;
59785986 ip + = 3 ;
59795987 MINT_IN_BREAK ;
59805988 }
@@ -5996,17 +6004,19 @@ MINT_IN_CASE(MINT_BRTRUE_I8_SP) ZEROP_SP(gint64, !=); MINT_IN_BREAK;
59966004 }
59976005 MINT_IN_CASE (MINT_CONV_OVF_U1_R4 ) {
59986006 float val = LOCAL_VAR (ip [2 ], float );
5999- if (val < 0 || val > G_MAXUINT8 || isnan (val ))
6007+ if (val > -1.0f && val < (G_MAXUINT8 + 1 ))
6008+ LOCAL_VAR (ip [1 ], gint32 ) = (guint8 )val ;
6009+ else
60006010 THROW_EX (mono_get_exception_overflow (), ip );
6001- LOCAL_VAR (ip [1 ], gint32 ) = (guint8 ) val ;
60026011 ip + = 3 ;
60036012 MINT_IN_BREAK ;
60046013 }
60056014 MINT_IN_CASE (MINT_CONV_OVF_U1_R8 ) {
60066015 double val = LOCAL_VAR (ip [2 ], double );
6007- if (val < 0 || val > G_MAXUINT8 || isnan (val ))
6016+ if (val > -1.0 && val < (G_MAXUINT8 + 1 ))
6017+ LOCAL_VAR (ip [1 ], gint32 ) = (guint8 )val ;
6018+ else
60086019 THROW_EX (mono_get_exception_overflow (), ip );
6009- LOCAL_VAR (ip [1 ], gint32 ) = (guint8 ) val ;
60106020 ip + = 3 ;
60116021 MINT_IN_BREAK ;
60126022 }
0 commit comments