Skip to content

Commit 1bd4e4b

Browse files
authored
[mono] Fix conversions from float to integer (#57048)
* [interp] Fix conversions from float to integer .un prefix is ignored for these conversions * [mini] Fix conversions from float to integer .un prefix is ignored for these conversions * Re-enable test
1 parent 2be518a commit 1bd4e4b

File tree

5 files changed

+41
-79
lines changed

5 files changed

+41
-79
lines changed

src/mono/mono/mini/interp/interp.c

Lines changed: 0 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -5445,14 +5445,6 @@ MINT_IN_CASE(MINT_BRTRUE_I8_SP) ZEROP_SP(gint64, !=); MINT_IN_BREAK;
54455445
ip += 4;
54465446
MINT_IN_BREAK;
54475447
}
5448-
MINT_IN_CASE(MINT_CONV_OVF_I4_UN_R8) {
5449-
double val = LOCAL_VAR (ip [2], double);
5450-
if (val < 0 || val > G_MAXINT32)
5451-
THROW_EX (mono_get_exception_overflow (), ip);
5452-
LOCAL_VAR (ip [1], gint32) = (gint32)val;
5453-
ip += 3;
5454-
MINT_IN_BREAK;
5455-
}
54565448
MINT_IN_CASE(MINT_CONV_OVF_U8_I4) {
54575449
gint32 val = LOCAL_VAR (ip [2], gint32);
54585450
if (val < 0)
@@ -5493,22 +5485,6 @@ MINT_IN_CASE(MINT_BRTRUE_I8_SP) ZEROP_SP(gint64, !=); MINT_IN_BREAK;
54935485
ip += 3;
54945486
MINT_IN_BREAK;
54955487
}
5496-
MINT_IN_CASE(MINT_CONV_OVF_I8_UN_R8) {
5497-
double val = LOCAL_VAR (ip [2], double);
5498-
if (val < 0 || mono_isnan (val) || mono_trunc (val) != (gint64)val)
5499-
THROW_EX (mono_get_exception_overflow (), ip);
5500-
LOCAL_VAR (ip [1], gint64) = (gint64)val;
5501-
ip += 3;
5502-
MINT_IN_BREAK;
5503-
}
5504-
MINT_IN_CASE(MINT_CONV_OVF_I8_UN_R4) {
5505-
float val = LOCAL_VAR (ip [2], float);
5506-
if (val < 0 || mono_isnan (val) || mono_trunc (val) != (gint64)val)
5507-
THROW_EX (mono_get_exception_overflow (), ip);
5508-
LOCAL_VAR (ip [1], gint64) = (gint64)val;
5509-
ip += 3;
5510-
MINT_IN_BREAK;
5511-
}
55125488
MINT_IN_CASE(MINT_CONV_OVF_I8_R4) {
55135489
float val = LOCAL_VAR (ip [2], float);
55145490
if (mono_isnan (val) || mono_trunc (val) != (gint64)val)
@@ -5917,21 +5893,6 @@ MINT_IN_CASE(MINT_BRTRUE_I8_SP) ZEROP_SP(gint64, !=); MINT_IN_BREAK;
59175893
ip += 3;
59185894
MINT_IN_BREAK;
59195895
}
5920-
MINT_IN_CASE(MINT_CONV_OVF_I2_UN_R4) {
5921-
float val = LOCAL_VAR (ip [2], float);
5922-
if (val < 0 || val > G_MAXINT16 || isnan (val))
5923-
THROW_EX (mono_get_exception_overflow (), ip);
5924-
LOCAL_VAR (ip [1], gint32) = (gint16) val;
5925-
ip += 3;
5926-
MINT_IN_BREAK;
5927-
}
5928-
MINT_IN_CASE(MINT_CONV_OVF_I2_UN_R8) {
5929-
double val = LOCAL_VAR (ip [2], double);
5930-
if (val < 0 || val > G_MAXINT16 || isnan (val))
5931-
THROW_EX (mono_get_exception_overflow (), ip);
5932-
LOCAL_VAR (ip [1], gint32) = (gint16) val;
5933-
MINT_IN_BREAK;
5934-
}
59355896
MINT_IN_CASE(MINT_CONV_OVF_U2_I4) {
59365897
gint32 val = LOCAL_VAR (ip [2], gint32);
59375898
if (val < 0 || val > G_MAXUINT16)
@@ -6012,22 +5973,6 @@ MINT_IN_CASE(MINT_BRTRUE_I8_SP) ZEROP_SP(gint64, !=); MINT_IN_BREAK;
60125973
ip += 3;
60135974
MINT_IN_BREAK;
60145975
}
6015-
MINT_IN_CASE(MINT_CONV_OVF_I1_UN_R4) {
6016-
float val = LOCAL_VAR (ip [2], float);
6017-
if (val < 0 || val > G_MAXINT8 || isnan (val))
6018-
THROW_EX (mono_get_exception_overflow (), ip);
6019-
LOCAL_VAR (ip [1], gint32) = (gint8) val;
6020-
ip += 3;
6021-
MINT_IN_BREAK;
6022-
}
6023-
MINT_IN_CASE(MINT_CONV_OVF_I1_UN_R8) {
6024-
double val = LOCAL_VAR (ip [2], double);
6025-
if (val < 0 || val > G_MAXINT8 || isnan (val))
6026-
THROW_EX (mono_get_exception_overflow (), ip);
6027-
LOCAL_VAR (ip [1], gint32) = (gint8) val;
6028-
ip += 3;
6029-
MINT_IN_BREAK;
6030-
}
60315976
MINT_IN_CASE(MINT_CONV_OVF_U1_I4) {
60325977
gint32 val = LOCAL_VAR (ip [2], gint32);
60335978
if (val < 0 || val > G_MAXUINT8)

src/mono/mono/mini/interp/mintops.def

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -583,8 +583,6 @@ OPDEF(MINT_CONV_OVF_I1_R8, "conv.ovf.i1.r8", 3, 1, 1, MintOpNoArgs)
583583

584584
OPDEF(MINT_CONV_OVF_I1_U4, "conv.ovf.i1.u4", 3, 1, 1, MintOpNoArgs)
585585
OPDEF(MINT_CONV_OVF_I1_U8, "conv.ovf.i1.u8", 3, 1, 1, MintOpNoArgs)
586-
OPDEF(MINT_CONV_OVF_I1_UN_R4, "conv.ovf.i1.un.r4", 3, 1, 1, MintOpNoArgs)
587-
OPDEF(MINT_CONV_OVF_I1_UN_R8, "conv.ovf.i1.un.r8", 3, 1, 1, MintOpNoArgs)
588586

589587
OPDEF(MINT_CONV_OVF_U1_I4, "conv.ovf.u1.i4", 3, 1, 1, MintOpNoArgs)
590588
OPDEF(MINT_CONV_OVF_U1_I8, "conv.ovf.u1.i8", 3, 1, 1, MintOpNoArgs)
@@ -598,8 +596,6 @@ OPDEF(MINT_CONV_OVF_I2_R8, "conv.ovf.i2.r8", 3, 1, 1, MintOpNoArgs)
598596

599597
OPDEF(MINT_CONV_OVF_I2_U4, "conv.ovf.i2.u4", 3, 1, 1, MintOpNoArgs)
600598
OPDEF(MINT_CONV_OVF_I2_U8, "conv.ovf.i2.u8", 3, 1, 1, MintOpNoArgs)
601-
OPDEF(MINT_CONV_OVF_I2_UN_R4, "conv.ovf.i2.un.r4", 3, 1, 1, MintOpNoArgs)
602-
OPDEF(MINT_CONV_OVF_I2_UN_R8, "conv.ovf.i2.un.r8", 3, 1, 1, MintOpNoArgs)
603599

604600
OPDEF(MINT_CONV_OVF_U2_I4, "conv.ovf.u2.i4", 3, 1, 1, MintOpNoArgs)
605601
OPDEF(MINT_CONV_OVF_U2_I8, "conv.ovf.u2.i8", 3, 1, 1, MintOpNoArgs)
@@ -612,8 +608,6 @@ OPDEF(MINT_CONV_OVF_I4_U8, "conv.ovf.i4.u8", 3, 1, 1, MintOpNoArgs)
612608
OPDEF(MINT_CONV_OVF_I4_R4, "conv.ovf.i4.r4", 3, 1, 1, MintOpNoArgs)
613609
OPDEF(MINT_CONV_OVF_I4_R8, "conv.ovf.i4.r8", 3, 1, 1, MintOpNoArgs)
614610

615-
OPDEF(MINT_CONV_OVF_I4_UN_R8, "conv.ovf.i4.un.r8", 3, 1, 1, MintOpNoArgs)
616-
617611
OPDEF(MINT_CONV_OVF_U4_I4, "conv.ovf.u4.i4", 3, 1, 1, MintOpNoArgs)
618612
OPDEF(MINT_CONV_OVF_U4_I8, "conv.ovf.u4.i8", 3, 1, 1, MintOpNoArgs)
619613
OPDEF(MINT_CONV_OVF_U4_R4, "conv.ovf.u4.r4", 3, 1, 1, MintOpNoArgs)
@@ -623,9 +617,6 @@ OPDEF(MINT_CONV_OVF_I8_U8, "conv.ovf.i8.u8", 3, 1, 1, MintOpNoArgs)
623617
OPDEF(MINT_CONV_OVF_I8_R4, "conv.ovf.i8.r4", 3, 1, 1, MintOpNoArgs)
624618
OPDEF(MINT_CONV_OVF_I8_R8, "conv.ovf.i8.r8", 3, 1, 1, MintOpNoArgs)
625619

626-
OPDEF(MINT_CONV_OVF_I8_UN_R8, "conv.ovf.i8.un.r8", 3, 1, 1, MintOpNoArgs)
627-
OPDEF(MINT_CONV_OVF_I8_UN_R4, "conv.ovf.i8.un.r4", 3, 1, 1, MintOpNoArgs)
628-
629620
OPDEF(MINT_CONV_OVF_U8_I4, "conv.ovf.u8.i4", 3, 1, 1, MintOpNoArgs)
630621
OPDEF(MINT_CONV_OVF_U8_I8, "conv.ovf.u8.i8", 3, 1, 1, MintOpNoArgs)
631622
OPDEF(MINT_CONV_OVF_U8_R4, "conv.ovf.u8.r4", 3, 1, 1, MintOpNoArgs)

src/mono/mono/mini/interp/transform.c

Lines changed: 31 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6141,24 +6141,44 @@ generate_code (TransformData *td, MonoMethod *method, MonoMethodHeader *header,
61416141
}
61426142
#if SIZEOF_VOID_P == 8
61436143
case CEE_CONV_OVF_I_UN:
6144-
case CEE_CONV_OVF_U_UN:
61456144
#endif
61466145
case CEE_CONV_OVF_I8_UN:
6147-
case CEE_CONV_OVF_U8_UN:
61486146
CHECK_STACK (td, 1);
61496147
switch (td->sp [-1].type) {
6148+
case STACK_TYPE_R4:
6149+
interp_add_conv (td, td->sp - 1, NULL, STACK_TYPE_I8, MINT_CONV_OVF_I8_R4);
6150+
break;
61506151
case STACK_TYPE_R8:
6151-
interp_add_conv (td, td->sp - 1, NULL, STACK_TYPE_I8, MINT_CONV_OVF_I8_UN_R8);
6152+
interp_add_conv (td, td->sp - 1, NULL, STACK_TYPE_I8, MINT_CONV_OVF_I8_R8);
6153+
break;
6154+
case STACK_TYPE_I4:
6155+
interp_add_conv (td, td->sp - 1, NULL, STACK_TYPE_I8, MINT_CONV_I8_U4);
61526156
break;
61536157
case STACK_TYPE_I8:
6154-
if (*td->ip == CEE_CONV_OVF_I8_UN || *td->ip == CEE_CONV_OVF_I_UN)
6155-
interp_add_conv (td, td->sp - 1, NULL, STACK_TYPE_I8, MINT_CONV_OVF_I8_U8);
6158+
interp_add_conv (td, td->sp - 1, NULL, STACK_TYPE_I8, MINT_CONV_OVF_I8_U8);
6159+
break;
6160+
default:
6161+
g_assert_not_reached ();
6162+
break;
6163+
}
6164+
++td->ip;
6165+
break;
6166+
#if SIZEOF_VOID_P == 8
6167+
case CEE_CONV_OVF_U_UN:
6168+
#endif
6169+
case CEE_CONV_OVF_U8_UN:
6170+
CHECK_STACK (td, 1);
6171+
switch (td->sp [-1].type) {
6172+
case STACK_TYPE_R4:
6173+
interp_add_conv (td, td->sp - 1, NULL, STACK_TYPE_I8, MINT_CONV_OVF_U8_R4);
6174+
break;
6175+
case STACK_TYPE_R8:
6176+
interp_add_conv (td, td->sp - 1, NULL, STACK_TYPE_I8, MINT_CONV_OVF_U8_R8);
61566177
break;
61576178
case STACK_TYPE_I4:
61586179
interp_add_conv (td, td->sp - 1, NULL, STACK_TYPE_I8, MINT_CONV_I8_U4);
61596180
break;
6160-
case STACK_TYPE_R4:
6161-
interp_add_conv (td, td->sp - 1, NULL, STACK_TYPE_I8, MINT_CONV_OVF_I8_UN_R4);
6181+
case STACK_TYPE_I8:
61626182
break;
61636183
default:
61646184
g_assert_not_reached ();
@@ -6515,10 +6535,10 @@ generate_code (TransformData *td, MonoMethod *method, MonoMethodHeader *header,
65156535
CHECK_STACK (td, 1);
65166536
switch (td->sp [-1].type) {
65176537
case STACK_TYPE_R4:
6518-
interp_add_conv (td, td->sp - 1, NULL, STACK_TYPE_I4, is_un ? MINT_CONV_OVF_I1_UN_R4 : MINT_CONV_OVF_I1_R4);
6538+
interp_add_conv (td, td->sp - 1, NULL, STACK_TYPE_I4, MINT_CONV_OVF_I1_R4);
65196539
break;
65206540
case STACK_TYPE_R8:
6521-
interp_add_conv (td, td->sp - 1, NULL, STACK_TYPE_I4, is_un ? MINT_CONV_OVF_I1_UN_R8 : MINT_CONV_OVF_I1_R8);
6541+
interp_add_conv (td, td->sp - 1, NULL, STACK_TYPE_I4, MINT_CONV_OVF_I1_R8);
65226542
break;
65236543
case STACK_TYPE_I4:
65246544
interp_add_conv (td, td->sp - 1, NULL, STACK_TYPE_I4, is_un ? MINT_CONV_OVF_I1_U4 : MINT_CONV_OVF_I1_I4);
@@ -6559,10 +6579,10 @@ generate_code (TransformData *td, MonoMethod *method, MonoMethodHeader *header,
65596579
CHECK_STACK (td, 1);
65606580
switch (td->sp [-1].type) {
65616581
case STACK_TYPE_R4:
6562-
interp_add_conv (td, td->sp - 1, NULL, STACK_TYPE_I4, is_un ? MINT_CONV_OVF_I2_UN_R4 : MINT_CONV_OVF_I2_R4);
6582+
interp_add_conv (td, td->sp - 1, NULL, STACK_TYPE_I4, MINT_CONV_OVF_I2_R4);
65636583
break;
65646584
case STACK_TYPE_R8:
6565-
interp_add_conv (td, td->sp - 1, NULL, STACK_TYPE_I4, is_un ? MINT_CONV_OVF_I2_UN_R8 : MINT_CONV_OVF_I2_R8);
6585+
interp_add_conv (td, td->sp - 1, NULL, STACK_TYPE_I4, MINT_CONV_OVF_I2_R8);
65666586
break;
65676587
case STACK_TYPE_I4:
65686588
interp_add_conv (td, td->sp - 1, NULL, STACK_TYPE_I4, is_un ? MINT_CONV_OVF_I2_U4 : MINT_CONV_OVF_I2_I4);

src/mono/mono/mini/method-to-ir.c

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8493,7 +8493,16 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
84938493
if (sp [-1]->type == STACK_R8 || sp [-1]->type == STACK_R4) {
84948494
/* floats are always signed, _UN has no effect */
84958495
ADD_UNOP (CEE_CONV_OVF_I8);
8496-
ADD_UNOP (il_op);
8496+
if (il_op == MONO_CEE_CONV_OVF_I1_UN)
8497+
ADD_UNOP (MONO_CEE_CONV_OVF_I1);
8498+
else if (il_op == MONO_CEE_CONV_OVF_I2_UN)
8499+
ADD_UNOP (MONO_CEE_CONV_OVF_I2);
8500+
else if (il_op == MONO_CEE_CONV_OVF_I4_UN)
8501+
ADD_UNOP (MONO_CEE_CONV_OVF_I4);
8502+
else if (il_op == MONO_CEE_CONV_OVF_I8_UN)
8503+
;
8504+
else
8505+
ADD_UNOP (il_op);
84978506
} else {
84988507
ADD_UNOP (il_op);
84998508
}

src/tests/issues.targets

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1646,9 +1646,6 @@
16461646
<ExcludeList Include = "$(XunitTestBinBase)/JIT/Directed/debugging/poison/**">
16471647
<Issue>Tests coreclr JIT's debug poisoning of address taken variables</Issue>
16481648
</ExcludeList>
1649-
<ExcludeList Include = "$(XunitTestBinBase)/JIT/IL_Conformance/TestConvertFromIntegral/**">
1650-
<Issue>https://github.com/dotnet/runtime/issues/56784</Issue>
1651-
</ExcludeList>
16521649
</ItemGroup>
16531650

16541651
<!-- Known failures for mono runtime on *all* architectures/operating systems in interpreter runtime mode -->

0 commit comments

Comments
 (0)