[jit] Add support for fconv.ovf.*.un opcodes (#34949)
authorVlad Brezae <brezaevlad@gmail.com>
Thu, 16 Apr 2020 22:38:34 +0000 (01:38 +0300)
committerGitHub <noreply@github.com>
Thu, 16 Apr 2020 22:38:34 +0000 (01:38 +0300)
* [jit] Handle fconv_ovf_un opcodes

We handle them the same way as non _un versions, by doing a float to int64 conversion followed by a simple integer conversion to the final size.

* [jit] Remove no longer needed emulation

We no longer need to emulate fconv_ovf_u8_un and rconv_ovf_u8_un since we reuse the mechanism for non _un versions (which uses just the emulation for fconv_ovf_u8 and rconv_ovf_u8)

Partly reverts https://github.com/mono/mono/commit/de5dca22649ae581085863b0935f94eff4483e55.

* Enable some mono tests

* [jit] Properly handle conv.r.un applied to r4

Fixes src/coreclr/tests/src/JIT/Regression/VS-ia64-JIT/V2.0-Beta2/b309576/bug2.il which was silently failing before

src/coreclr/tests/issues.targets
src/mono/mono/metadata/jit-icall-reg.h
src/mono/mono/mini/decompose.c
src/mono/mono/mini/jit-icalls.c
src/mono/mono/mini/jit-icalls.h
src/mono/mono/mini/method-to-ir.c
src/mono/mono/mini/mini-runtime.c

index 2a2f6dc..aa8d86a 100644 (file)
         <ExcludeList Include="$(XunitTestBinBase)/JIT/HardwareIntrinsics/X86/Regression/GitHub_17957/GitHub_17957_ro/**">
             <Issue>needs triage</Issue>
         </ExcludeList>
-        <ExcludeList Include="$(XunitTestBinBase)/JIT/IL_Conformance/Old/Conformance_Base/conv_ovf_r8_i/**">
-            <Issue>https://github.com/dotnet/runtime/issues/34084</Issue>
-        </ExcludeList>
         <ExcludeList Include="$(XunitTestBinBase)/JIT/IL_Conformance/Old/Conformance_Base/conv_ovf_r8_i4/**">
             <Issue>needs triage</Issue>
         </ExcludeList>
         <ExcludeList Include="$(XunitTestBinBase)/JIT/IL_Conformance/Old/Conformance_Base/conv_ovf_r8_i8/**">
             <Issue>needs triage</Issue>
         </ExcludeList>
-        <ExcludeList Include="$(XunitTestBinBase)/JIT/IL_Conformance/Old/Conformance_Base/ldc_conv_ovf_r8_i/**">
-            <Issue>https://github.com/dotnet/runtime/issues/34084</Issue>
-        </ExcludeList>
-        <ExcludeList Include="$(XunitTestBinBase)/JIT/IL_Conformance/Old/Conformance_Base/ldc_conv_ovf_r8_i4/**">
-            <Issue>https://github.com/dotnet/runtime/issues/34084</Issue>
-        </ExcludeList>
-        <ExcludeList Include="$(XunitTestBinBase)/JIT/IL_Conformance/Old/Conformance_Base/ldc_conv_ovf_r8_i8/**">
-            <Issue>https://github.com/dotnet/runtime/issues/34084</Issue>
-        </ExcludeList>
         <ExcludeList Include="$(XunitTestBinBase)/JIT/Intrinsics/TypeIntrinsics_il/**">
             <Issue>needs triage</Issue>
         </ExcludeList>
         <ExcludeList Include="$(XunitTestBinBase)/JIT/Methodical/NaN/r4nanconv_il_r/**">
             <Issue>https://github.com/dotnet/runtime/issues/34380</Issue>
         </ExcludeList>
-        <ExcludeList Include="$(XunitTestBinBase)/JIT/Methodical/NaN/r8nanconv_il_d/**">
-            <Issue>https://github.com/dotnet/runtime/issues/34084</Issue>
-        </ExcludeList>
-        <ExcludeList Include="$(XunitTestBinBase)/JIT/Methodical/NaN/r8nanconv_il_r/**">
-            <Issue>https://github.com/dotnet/runtime/issues/34084</Issue>
-        </ExcludeList>
         <ExcludeList Include="$(XunitTestBinBase)/JIT/Methodical/refany/_il_dbgarray2/**">
             <Issue>https://github.com/dotnet/runtime/issues/34378</Issue>
         </ExcludeList>
         <ExcludeList Include="$(XunitTestBinBase)/JIT/Regression/Dev11/Dev11_468598/Test_HndIndex_10_Reordered/**">
             <Issue>needs triage</Issue>
         </ExcludeList>
-        <ExcludeList Include="$(XunitTestBinBase)/JIT/Regression/JitBlue/DevDiv_487699/**">
-            <Issue>https://github.com/dotnet/runtime/issues/34084</Issue>
-        </ExcludeList>
-        <ExcludeList Include="$(XunitTestBinBase)/JIT/Regression/JitBlue/DevDiv_544983/**">
-            <Issue>https://github.com/dotnet/runtime/issues/34084</Issue>
-        </ExcludeList>
         <ExcludeList Include="$(XunitTestBinBase)/JIT/Regression/JitBlue/DevDiv_545500/**">
             <Issue>https://github.com/dotnet/runtime/issues/34084</Issue>
         </ExcludeList>
index 125c0b5..fb5ac6a 100644 (file)
@@ -77,7 +77,6 @@ MONO_JIT_ICALL (__emul_fconv_to_i4)   \
 MONO_JIT_ICALL (__emul_fconv_to_i8)    \
 MONO_JIT_ICALL (__emul_fconv_to_ovf_i8)        \
 MONO_JIT_ICALL (__emul_fconv_to_ovf_u8)        \
-MONO_JIT_ICALL (__emul_fconv_to_ovf_u8_un)     \
 MONO_JIT_ICALL (__emul_fconv_to_r4)    \
 MONO_JIT_ICALL (__emul_fconv_to_u)     \
 MONO_JIT_ICALL (__emul_fconv_to_u1)    \
@@ -115,7 +114,6 @@ MONO_JIT_ICALL (__emul_op_irem_un) \
 MONO_JIT_ICALL (__emul_rconv_to_i8) \
 MONO_JIT_ICALL (__emul_rconv_to_ovf_i8) \
 MONO_JIT_ICALL (__emul_rconv_to_ovf_u8) \
-MONO_JIT_ICALL (__emul_rconv_to_ovf_u8_un) \
 MONO_JIT_ICALL (__emul_rconv_to_u4)    \
 MONO_JIT_ICALL (__emul_rconv_to_u8) \
 MONO_JIT_ICALL (__emul_rrem) \
index bb1916d..b36a7ec 100644 (file)
@@ -430,18 +430,6 @@ mono_decompose_opcode (MonoCompile *cfg, MonoInst *ins)
                ins->opcode = OP_FMOVE;
                break;
 
-       case OP_FCONV_TO_OVF_I1_UN:
-       case OP_FCONV_TO_OVF_I2_UN:
-       case OP_FCONV_TO_OVF_I4_UN:
-       case OP_FCONV_TO_OVF_I8_UN:
-       case OP_FCONV_TO_OVF_U1_UN:
-       case OP_FCONV_TO_OVF_U2_UN:
-       case OP_FCONV_TO_OVF_U4_UN:
-       case OP_FCONV_TO_OVF_I_UN:
-       case OP_FCONV_TO_OVF_U_UN:
-               mono_cfg_set_exception_invalid_program (cfg, g_strdup_printf ("float conv.ovf.un opcodes not supported."));
-               break;
-
        case OP_IDIV:
        case OP_IREM:
        case OP_IDIV_UN:
index 2f3c0f2..6a83364 100644 (file)
@@ -983,12 +983,6 @@ mono_fconv_ovf_u8 (double v)
        return res;
 }
 
-guint64
-mono_fconv_ovf_u8_un (double v)
-{
-       return mono_fconv_ovf_u8 (v);
-}
-
 #ifdef MONO_ARCH_EMULATE_FCONV_TO_I8
 gint64
 mono_rconv_i8 (float v)
@@ -1026,12 +1020,6 @@ mono_rconv_ovf_u8 (float v)
        return res;
 }
 
-guint64
-mono_rconv_ovf_u8_un (float v)
-{
-       return mono_rconv_ovf_u8 (v);
-}
-
 #ifdef MONO_ARCH_EMULATE_LCONV_TO_R8
 double
 mono_lconv_to_r8 (gint64 a)
index 8e781ec..41ebae8 100644 (file)
@@ -86,16 +86,12 @@ ICALL_EXTERN_C gint64 mono_fconv_ovf_i8 (double v);
 
 ICALL_EXTERN_C guint64 mono_fconv_ovf_u8 (double v);
 
-ICALL_EXTERN_C guint64 mono_fconv_ovf_u8_un (double v);
-
 ICALL_EXTERN_C gint64 mono_rconv_i8 (float v);
 
 ICALL_EXTERN_C gint64 mono_rconv_ovf_i8 (float v);
 
 ICALL_EXTERN_C guint64 mono_rconv_ovf_u8 (float v);
 
-ICALL_EXTERN_C guint64 mono_rconv_ovf_u8_un (float v);
-
 ICALL_EXTERN_C double mono_lconv_to_r8 (gint64 a);
 
 ICALL_EXTERN_C double mono_conv_to_r8 (gint32 a);
index 01f05cc..e61d53c 100644 (file)
@@ -1101,6 +1101,9 @@ type_from_op (MonoCompile *cfg, MonoInst *ins, MonoInst *src1, MonoInst *src2)
                case STACK_I8:
                        ins->opcode = OP_LCONV_TO_R_UN; 
                        break;
+               case STACK_R4:
+                       ins->opcode = OP_RCONV_TO_R8;
+                       break;
                case STACK_R8:
                        ins->opcode = OP_FMOVE;
                        break;
@@ -8430,8 +8433,13 @@ calli_end:
                case MONO_CEE_CONV_OVF_I1:
                case MONO_CEE_CONV_OVF_I2:
                case MONO_CEE_CONV_OVF_I:
-               case MONO_CEE_CONV_OVF_U:
+               case MONO_CEE_CONV_OVF_I1_UN:
+               case MONO_CEE_CONV_OVF_I2_UN:
+               case MONO_CEE_CONV_OVF_I4_UN:
+               case MONO_CEE_CONV_OVF_I8_UN:
+               case MONO_CEE_CONV_OVF_I_UN:
                        if (sp [-1]->type == STACK_R8 || sp [-1]->type == STACK_R4) {
+                               /* floats are always signed, _UN has no effect */
                                ADD_UNOP (CEE_CONV_OVF_I8);
                                ADD_UNOP (il_op);
                        } else {
@@ -8441,23 +8449,20 @@ calli_end:
                case MONO_CEE_CONV_OVF_U1:
                case MONO_CEE_CONV_OVF_U2:
                case MONO_CEE_CONV_OVF_U4:
+               case MONO_CEE_CONV_OVF_U:
+               case MONO_CEE_CONV_OVF_U1_UN:
+               case MONO_CEE_CONV_OVF_U2_UN:
+               case MONO_CEE_CONV_OVF_U4_UN:
+               case MONO_CEE_CONV_OVF_U8_UN:
+               case MONO_CEE_CONV_OVF_U_UN:
                        if (sp [-1]->type == STACK_R8 || sp [-1]->type == STACK_R4) {
+                               /* floats are always signed, _UN has no effect */
                                ADD_UNOP (CEE_CONV_OVF_U8);
                                ADD_UNOP (il_op);
                        } else {
                                ADD_UNOP (il_op);
                        }
                        break;
-               case MONO_CEE_CONV_OVF_I1_UN:
-               case MONO_CEE_CONV_OVF_I2_UN:
-               case MONO_CEE_CONV_OVF_I4_UN:
-               case MONO_CEE_CONV_OVF_I8_UN:
-               case MONO_CEE_CONV_OVF_U1_UN:
-               case MONO_CEE_CONV_OVF_U2_UN:
-               case MONO_CEE_CONV_OVF_U4_UN:
-               case MONO_CEE_CONV_OVF_U8_UN:
-               case MONO_CEE_CONV_OVF_I_UN:
-               case MONO_CEE_CONV_OVF_U_UN:
                case MONO_CEE_CONV_U2:
                case MONO_CEE_CONV_U1:
                case MONO_CEE_CONV_I:
index 1d217a6..13d0a05 100644 (file)
@@ -4711,10 +4711,8 @@ register_icalls (void)
 #endif
        register_opcode_emulation (OP_FCONV_TO_OVF_I8, __emul_fconv_to_ovf_i8, mono_icall_sig_long_double, mono_fconv_ovf_i8, FALSE);
        register_opcode_emulation (OP_FCONV_TO_OVF_U8, __emul_fconv_to_ovf_u8, mono_icall_sig_ulong_double, mono_fconv_ovf_u8, FALSE);
-       register_opcode_emulation (OP_FCONV_TO_OVF_U8_UN, __emul_fconv_to_ovf_u8_un, mono_icall_sig_ulong_double, mono_fconv_ovf_u8_un, FALSE);
        register_opcode_emulation (OP_RCONV_TO_OVF_I8, __emul_rconv_to_ovf_i8, mono_icall_sig_long_float, mono_rconv_ovf_i8, FALSE);
        register_opcode_emulation (OP_RCONV_TO_OVF_U8, __emul_rconv_to_ovf_u8, mono_icall_sig_ulong_float, mono_rconv_ovf_u8, FALSE);
-       register_opcode_emulation (OP_RCONV_TO_OVF_U8_UN, __emul_rconv_to_ovf_u8_un, mono_icall_sig_ulong_float, mono_rconv_ovf_u8_un, FALSE);
 
 #ifdef MONO_ARCH_EMULATE_FCONV_TO_I8
        register_opcode_emulation (OP_FCONV_TO_I8, __emul_fconv_to_i8, mono_icall_sig_long_double, mono_fconv_i8, FALSE);