[x86] Fix OP_IMUL_OVF_UN clobbering edx in some cases. Fixes #36052.
authorZoltan Varga <vargaz@gmail.com>
Thu, 19 Nov 2015 19:19:08 +0000 (14:19 -0500)
committerZoltan Varga <vargaz@gmail.com>
Thu, 19 Nov 2015 19:19:14 +0000 (14:19 -0500)
mono/mini/mini-x86.c
mono/mini/objects.cs

index 09b747b525c7acf1018d3271701bccb3275e5031..a837d0d74dc6a998a7b190b3c1705c7fda5cc231 100644 (file)
@@ -3163,7 +3163,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                                        saved_eax = TRUE;
                                        x86_push_reg (code, X86_EAX);
                                }
-                       } else if (ins->dreg != X86_EAX) {
+                       } else {
                                saved_edx = TRUE;
                                x86_push_reg (code, X86_EDX);
                        }
index d2ef247a130a1c046d3aaff1d71d970a94dfafa7..f944713a7bc818e5c711eb7529a2af42e035cb1e 100644 (file)
@@ -1667,6 +1667,25 @@ ncells ) {
                var res = arm64_hfa_on_stack_inner (1, 2, 3, 4, 5, 6, 7, 8, s);
                return res == 10.0 ? 0 : 1;
        }
+
+       class MulOvfClass {
+               [MethodImplAttribute (MethodImplOptions.NoInlining)]
+               public unsafe void EncodeIntoBuffer(char* value, int valueLength, char* buffer, int bufferLength) {
+               }
+       }
+
+       static unsafe int test_0_mul_ovf_regress_36052 () {
+               var p = new MulOvfClass ();
+
+               string typeName = typeof(int).Name;
+               int bufferSize = 45;
+
+               fixed (char* value = typeName) {
+                       char* buffer = stackalloc char[bufferSize];
+                       p.EncodeIntoBuffer(value, typeName.Length, buffer, bufferSize);
+               }
+               return 0;
+       }
 }
 
 #if MOBILE