From 2b534f08e252f7b201bb071172405d59ebdc83b5 Mon Sep 17 00:00:00 2001 From: Vlad Brezae Date: Tue, 14 Apr 2020 16:33:39 +0300 Subject: [PATCH 1/4] [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. --- src/mono/mono/mini/decompose.c | 12 ------------ src/mono/mono/mini/method-to-ir.c | 24 +++++++++++++----------- 2 files changed, 13 insertions(+), 23 deletions(-) diff --git a/src/mono/mono/mini/decompose.c b/src/mono/mono/mini/decompose.c index bb1916d3b8c061..b36a7ecc255a33 100644 --- a/src/mono/mono/mini/decompose.c +++ b/src/mono/mono/mini/decompose.c @@ -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: diff --git a/src/mono/mono/mini/method-to-ir.c b/src/mono/mono/mini/method-to-ir.c index 8f953e7891b523..471e3702177fd2 100644 --- a/src/mono/mono/mini/method-to-ir.c +++ b/src/mono/mono/mini/method-to-ir.c @@ -8430,8 +8430,13 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b 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 +8446,20 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b 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: From 798a5d8deb2db016dbe47ef1c4d729abb332f6dc Mon Sep 17 00:00:00 2001 From: Vlad Brezae Date: Tue, 14 Apr 2020 16:45:41 +0300 Subject: [PATCH 2/4] [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. --- src/mono/mono/metadata/jit-icall-reg.h | 2 -- src/mono/mono/mini/jit-icalls.c | 12 ------------ src/mono/mono/mini/jit-icalls.h | 4 ---- src/mono/mono/mini/mini-runtime.c | 2 -- 4 files changed, 20 deletions(-) diff --git a/src/mono/mono/metadata/jit-icall-reg.h b/src/mono/mono/metadata/jit-icall-reg.h index 125c0b5a8ae923..fb5ac6a1da7ebd 100644 --- a/src/mono/mono/metadata/jit-icall-reg.h +++ b/src/mono/mono/metadata/jit-icall-reg.h @@ -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) \ diff --git a/src/mono/mono/mini/jit-icalls.c b/src/mono/mono/mini/jit-icalls.c index 2f3c0f293d9ee7..6a833649fb02be 100644 --- a/src/mono/mono/mini/jit-icalls.c +++ b/src/mono/mono/mini/jit-icalls.c @@ -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) diff --git a/src/mono/mono/mini/jit-icalls.h b/src/mono/mono/mini/jit-icalls.h index 8e781ec8d389b0..41ebae89ceee56 100644 --- a/src/mono/mono/mini/jit-icalls.h +++ b/src/mono/mono/mini/jit-icalls.h @@ -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); diff --git a/src/mono/mono/mini/mini-runtime.c b/src/mono/mono/mini/mini-runtime.c index 1d217a6c9d0184..13d0a05bf377b9 100644 --- a/src/mono/mono/mini/mini-runtime.c +++ b/src/mono/mono/mini/mini-runtime.c @@ -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); From 927dc4b15f2d703e2f149875a17406b05ead298c Mon Sep 17 00:00:00 2001 From: Vlad Brezae Date: Wed, 15 Apr 2020 12:37:48 +0300 Subject: [PATCH 3/4] Enable some mono tests --- src/coreclr/tests/issues.targets | 24 ------------------------ 1 file changed, 24 deletions(-) diff --git a/src/coreclr/tests/issues.targets b/src/coreclr/tests/issues.targets index eeba754c3ee3aa..29c6c2098e324e 100644 --- a/src/coreclr/tests/issues.targets +++ b/src/coreclr/tests/issues.targets @@ -1232,24 +1232,12 @@ needs triage - - https://github.com/dotnet/runtime/issues/34084 - needs triage needs triage - - https://github.com/dotnet/runtime/issues/34084 - - - https://github.com/dotnet/runtime/issues/34084 - - - https://github.com/dotnet/runtime/issues/34084 - needs triage @@ -1430,12 +1418,6 @@ https://github.com/dotnet/runtime/issues/34380 - - https://github.com/dotnet/runtime/issues/34084 - - - https://github.com/dotnet/runtime/issues/34084 - https://github.com/dotnet/runtime/issues/34378 @@ -1496,12 +1478,6 @@ needs triage - - https://github.com/dotnet/runtime/issues/34084 - - - https://github.com/dotnet/runtime/issues/34084 - https://github.com/dotnet/runtime/issues/34084 From a27e9283eac5e988377873a64235d1cbba820da6 Mon Sep 17 00:00:00 2001 From: Vlad Brezae Date: Wed, 15 Apr 2020 17:47:30 +0300 Subject: [PATCH 4/4] [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/mono/mono/mini/method-to-ir.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/mono/mono/mini/method-to-ir.c b/src/mono/mono/mini/method-to-ir.c index 471e3702177fd2..afd2452a32406c 100644 --- a/src/mono/mono/mini/method-to-ir.c +++ b/src/mono/mono/mini/method-to-ir.c @@ -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;