2008-10-13 Zoltan Varga <vargaz@gmail.com>
authorZoltan Varga <vargaz@gmail.com>
Mon, 13 Oct 2008 07:24:36 +0000 (07:24 -0000)
committerZoltan Varga <vargaz@gmail.com>
Mon, 13 Oct 2008 07:24:36 +0000 (07:24 -0000)
* mini-amd64.c (mono_arch_output_basic_block): Fix the changes to
OP_X86_PUSH_OBJ. Fixes #434620.

* objects.cs: Add a test.

svn path=/trunk/mono/; revision=115632

mono/mini/ChangeLog
mono/mini/mini-amd64.c
mono/mini/objects.cs

index 368fb7938b05692f16a93227300d2aa23cc14bee..85b9c95f6c4034eb89701558d4a54b0e181a571a 100644 (file)
@@ -1,3 +1,10 @@
+2008-10-13  Zoltan Varga  <vargaz@gmail.com>
+
+       * mini-amd64.c (mono_arch_output_basic_block): Fix the changes to
+       OP_X86_PUSH_OBJ. Fixes #434620.
+
+       * objects.cs: Add a test.
+       
 2008-10-12  Rodrigo Kumpera  <rkumpera@novell.com>
 
        * basic-simd.cs: Remove PackWithUnsignedSaturation tests as it turns out
index 14138ef94c6d97690b094bfb18c4b12debf15415..f218763567212b6cb62c7f5fd664bcc8c30282f2 100644 (file)
@@ -3985,8 +3985,8 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                                amd64_lea_membase (code, AMD64_RSI, ins->inst_basereg, ins->inst_offset);
                        else
                                amd64_mov_reg_reg (code, AMD64_RSI, ins->inst_basereg, 8);
-                       amd64_lea_membase (code, AMD64_RDI, AMD64_RSP, (3 * 8) + (size - ins->inst_imm));
-                       amd64_mov_reg_imm (code, AMD64_RCX, (ins->inst_imm >> 3));
+                       amd64_lea_membase (code, AMD64_RDI, AMD64_RSP, (3 * 8));
+                       amd64_mov_reg_imm (code, AMD64_RCX, (size >> 3));
                        amd64_cld (code);
                        amd64_prefix (code, X86_REP_PREFIX);
                        amd64_movsd (code);
index 64800d72a24b99c7df447fe5463f4d5a045e87ee..d23a1b4e3bb5f040fb6f7706e884a0c2b7b7ee28 100644 (file)
@@ -409,6 +409,32 @@ class Tests {
                return pass_struct3 (1, 2, 3, 4, 5, 6, 7, 8, s, 9);
        }
 
+       // Struct with unaligned size on 64 bit machines
+       struct Struct4 {
+        public int i, j, k, l, m;
+               public int i1, i2, i3, i4, i5, i6;
+       }
+
+       static int pass_struct4 (Struct4 s) {
+               if (s.i + s.j + s.k + s.l + s.m != 15)
+                       return 1;
+               else
+                       return 0;
+       }
+
+       public static int test_0_struct4_args () {
+               Struct4 s = new Struct4 ();
+               s.i = 1;
+               s.j = 2;
+               s.k = 3;
+               s.l = 4;
+               s.m = 5;
+
+               return pass_struct4 (s);
+       }
+
+
+
        struct AStruct {
                public int i;