[x86] Align stackalloc-ed memory in no pushes mode.
authorBrezae Vlad <brezaevlad@gmail.com>
Sat, 14 Jun 2014 21:05:42 +0000 (00:05 +0300)
committerBrezae Vlad <brezaevlad@gmail.com>
Sat, 14 Jun 2014 21:07:52 +0000 (00:07 +0300)
mono/mini/mini-x86.c

index d048ce6159d18c956ee2b9094a9401610494a66d..3de9b0be1a226801938979a57a19bb9a0c8bae13 100644 (file)
@@ -2300,9 +2300,10 @@ mono_emit_stack_alloc (MonoCompile *cfg, guchar *code, MonoInst* tree)
                        x86_push_reg (code, X86_EDI);
                        x86_mov_reg_imm (code, X86_ECX, (0x1000 >> 2));
                        x86_alu_reg_reg (code, X86_XOR, X86_EAX, X86_EAX);                              
-                       x86_lea_membase (code, X86_EDI, X86_ESP, 12);
                        if (cfg->param_area && cfg->arch.no_pushes)
-                               x86_alu_reg_imm (code, X86_ADD, X86_EDI, cfg->param_area);
+                               x86_lea_membase (code, X86_EDI, X86_ESP, 12 + ALIGN_TO (cfg->param_area, MONO_ARCH_FRAME_ALIGNMENT));
+                       else
+                               x86_lea_membase (code, X86_EDI, X86_ESP, 12);
                        x86_cld (code);
                        x86_prefix (code, X86_REP_PREFIX);
                        x86_stosl (code);
@@ -2349,9 +2350,10 @@ mono_emit_stack_alloc (MonoCompile *cfg, guchar *code, MonoInst* tree)
                        x86_mov_reg_reg (code, X86_ECX, sreg, 4);
                x86_alu_reg_reg (code, X86_XOR, X86_EAX, X86_EAX);
                                
-               x86_lea_membase (code, X86_EDI, X86_ESP, offset);
                if (cfg->param_area && cfg->arch.no_pushes)
-                       x86_alu_reg_imm (code, X86_ADD, X86_EDI, cfg->param_area);
+                       x86_lea_membase (code, X86_EDI, X86_ESP, offset + ALIGN_TO (cfg->param_area, MONO_ARCH_FRAME_ALIGNMENT));
+               else
+                       x86_lea_membase (code, X86_EDI, X86_ESP, offset);
                x86_cld (code);
                x86_prefix (code, X86_REP_PREFIX);
                x86_stosl (code);
@@ -3458,7 +3460,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                        code = mono_emit_stack_alloc (cfg, code, ins);
                        x86_mov_reg_reg (code, ins->dreg, X86_ESP, 4);
                         if (cfg->param_area && cfg->arch.no_pushes)
-                                x86_alu_reg_imm (code, X86_ADD, ins->dreg, cfg->param_area);
+                                x86_alu_reg_imm (code, X86_ADD, ins->dreg, ALIGN_TO (cfg->param_area, MONO_ARCH_FRAME_ALIGNMENT));
                        break;
                case OP_LOCALLOC_IMM: {
                        guint32 size = ins->inst_imm;
@@ -3476,7 +3478,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                                x86_mov_reg_reg (code, ins->dreg, X86_ESP, 4);
                        }
                         if (cfg->param_area && cfg->arch.no_pushes)
-                                x86_alu_reg_imm (code, X86_ADD, ins->dreg, cfg->param_area);
+                                x86_alu_reg_imm (code, X86_ADD, ins->dreg, ALIGN_TO (cfg->param_area, MONO_ARCH_FRAME_ALIGNMENT));
                        break;
                }
                case OP_THROW: {