From e2187e97755686086ab19d98c0944ef443287c3e Mon Sep 17 00:00:00 2001 From: Vlad Brezae Date: Fri, 9 Jul 2021 20:23:12 +0300 Subject: [PATCH 1/2] [interp] Add missing conversion from r4 to uint --- src/mono/mono/mini/interp/transform.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/mono/mono/mini/interp/transform.c b/src/mono/mono/mini/interp/transform.c index 4a17c9410b724d..d98853aee001a3 100644 --- a/src/mono/mono/mini/interp/transform.c +++ b/src/mono/mono/mini/interp/transform.c @@ -5308,6 +5308,13 @@ generate_code (TransformData *td, MonoMethod *method, MonoMethodHeader *header, interp_add_conv (td, td->sp - 1, NULL, STACK_TYPE_I, MINT_CONV_U4_R8); #else interp_add_conv (td, td->sp - 1, NULL, STACK_TYPE_I, MINT_CONV_U8_R8); +#endif + break; + case STACK_TYPE_R4: +#if SIZEOF_VOID_P == 4 + interp_add_conv (td, td->sp - 1, NULL, STACK_TYPE_I, MINT_CONV_U4_R4); +#else + interp_add_conv (td, td->sp - 1, NULL, STACK_TYPE_I, MINT_CONV_U8_R4); #endif break; case STACK_TYPE_I4: From b43a37733f14a6e8b9b9d9a3f72444c3bc9087ce Mon Sep 17 00:00:00 2001 From: Vlad Brezae Date: Fri, 9 Jul 2021 20:42:43 +0300 Subject: [PATCH 2/2] [interp] Remove duplicated and inconsistent code for conv.ovf.i.un and conv.ovf.u.un Just use the existing path for the i4/i8/u4/u8 opcodes. --- src/mono/mono/mini/interp/transform.c | 38 +++++---------------------- 1 file changed, 7 insertions(+), 31 deletions(-) diff --git a/src/mono/mono/mini/interp/transform.c b/src/mono/mono/mini/interp/transform.c index d98853aee001a3..0eed6c7146e012 100644 --- a/src/mono/mono/mini/interp/transform.c +++ b/src/mono/mono/mini/interp/transform.c @@ -6140,36 +6140,10 @@ generate_code (TransformData *td, MonoMethod *method, MonoMethodHeader *header, td->ip += 5; break; } +#if SIZEOF_VOID_P == 8 case CEE_CONV_OVF_I_UN: case CEE_CONV_OVF_U_UN: - CHECK_STACK (td, 1); - switch (td->sp [-1].type) { - case STACK_TYPE_R8: -#if SIZEOF_VOID_P == 8 - interp_add_conv (td, td->sp - 1, NULL, STACK_TYPE_I, MINT_CONV_OVF_I8_UN_R8); -#else - interp_add_conv (td, td->sp - 1, NULL, STACK_TYPE_I, MINT_CONV_OVF_I4_UN_R8); -#endif - break; - case STACK_TYPE_I8: -#if SIZEOF_VOID_P == 4 - interp_add_conv (td, td->sp - 1, NULL, STACK_TYPE_I, MINT_CONV_OVF_I4_U8); -#endif - break; - case STACK_TYPE_I4: -#if SIZEOF_VOID_P == 8 - interp_add_conv (td, td->sp - 1, NULL, STACK_TYPE_I, MINT_CONV_I8_U4); -#elif SIZEOF_VOID_P == 4 - if (*td->ip == CEE_CONV_OVF_I_UN) - interp_add_conv (td, td->sp - 1, NULL, STACK_TYPE_I, MINT_CONV_OVF_I4_U4); #endif - break; - default: - g_assert_not_reached (); - break; - } - ++td->ip; - break; case CEE_CONV_OVF_I8_UN: case CEE_CONV_OVF_U8_UN: CHECK_STACK (td, 1); @@ -6178,7 +6152,7 @@ generate_code (TransformData *td, MonoMethod *method, MonoMethodHeader *header, interp_add_conv (td, td->sp - 1, NULL, STACK_TYPE_I8, MINT_CONV_OVF_I8_UN_R8); break; case STACK_TYPE_I8: - if (*td->ip == CEE_CONV_OVF_I8_UN) + if (*td->ip == CEE_CONV_OVF_I8_UN || *td->ip == CEE_CONV_OVF_I_UN) interp_add_conv (td, td->sp - 1, NULL, STACK_TYPE_I8, MINT_CONV_OVF_I8_U8); break; case STACK_TYPE_I4: @@ -6626,6 +6600,7 @@ generate_code (TransformData *td, MonoMethod *method, MonoMethodHeader *header, break; #if SIZEOF_VOID_P == 4 case CEE_CONV_OVF_I: + case CEE_CONV_OVF_I_UN: #endif case CEE_CONV_OVF_I4: case CEE_CONV_OVF_I4_UN: @@ -6638,11 +6613,11 @@ generate_code (TransformData *td, MonoMethod *method, MonoMethodHeader *header, interp_add_conv (td, td->sp - 1, NULL, STACK_TYPE_I4, MINT_CONV_OVF_I4_R8); break; case STACK_TYPE_I4: - if (*td->ip == CEE_CONV_OVF_I4_UN) + if (*td->ip == CEE_CONV_OVF_I4_UN || *td->ip == CEE_CONV_OVF_I_UN) interp_add_conv (td, td->sp - 1, NULL, STACK_TYPE_I4, MINT_CONV_OVF_I4_U4); break; case STACK_TYPE_I8: - if (*td->ip == CEE_CONV_OVF_I4_UN) + if (*td->ip == CEE_CONV_OVF_I4_UN || *td->ip == CEE_CONV_OVF_I_UN) interp_add_conv (td, td->sp - 1, NULL, STACK_TYPE_I4, MINT_CONV_OVF_I4_U8); else interp_add_conv (td, td->sp - 1, NULL, STACK_TYPE_I4, MINT_CONV_OVF_I4_I8); @@ -6654,6 +6629,7 @@ generate_code (TransformData *td, MonoMethod *method, MonoMethodHeader *header, break; #if SIZEOF_VOID_P == 4 case CEE_CONV_OVF_U: + case CEE_CONV_OVF_U_UN: #endif case CEE_CONV_OVF_U4: case CEE_CONV_OVF_U4_UN: @@ -6666,7 +6642,7 @@ generate_code (TransformData *td, MonoMethod *method, MonoMethodHeader *header, interp_add_conv (td, td->sp - 1, NULL, STACK_TYPE_I4, MINT_CONV_OVF_U4_R8); break; case STACK_TYPE_I4: - if (*td->ip != CEE_CONV_OVF_U4_UN) + if (*td->ip == CEE_CONV_OVF_U4 || *td->ip == CEE_CONV_OVF_U) interp_add_conv (td, td->sp - 1, NULL, STACK_TYPE_I4, MINT_CONV_OVF_U4_I4); break; case STACK_TYPE_I8: