Avoid copying the stack alignment area during tail calls on x86, if the caller method...
authorZoltan Varga <vargaz@gmail.com>
Sun, 30 Sep 2012 01:15:49 +0000 (03:15 +0200)
committerZoltan Varga <vargaz@gmail.com>
Sun, 30 Sep 2012 01:15:49 +0000 (03:15 +0200)
mono/mini/mini-x86.c
mono/mini/mini.h

index 3901a59449d68d03a6b50a592f3a57a02f2f151c..06f5ee0c21ae932f696d2035676e21b2c67ac209 100644 (file)
@@ -1627,6 +1627,7 @@ mono_arch_emit_call (MonoCompile *cfg, MonoCallInst *call)
        }
 
        call->stack_usage = cinfo->stack_usage;
+       call->stack_align_amount = cinfo->stack_align_amount;
        cfg->arch.param_area_size = MAX (cfg->arch.param_area_size, sp_offset);
 }
 
@@ -3179,7 +3180,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                        }
 
                        /* Copy arguments on the stack to our argument area */
-                       for (i = 0; i < call->stack_usage; i += 4) {
+                       for (i = 0; i < call->stack_usage - call->stack_align_amount; i += 4) {
                                x86_mov_reg_membase (code, X86_EAX, X86_ESP, i, 4);
                                x86_mov_membase_reg (code, X86_EBP, 8 + i, X86_EAX, 4);
                        }
index 498ba5aa201901ad476815130e835906789683e8..3dd34d53d5ae08757415f7f083458121a6a8c2e7 100644 (file)
@@ -789,6 +789,7 @@ struct MonoCallInst {
        MonoInst *vret_var;
        gconstpointer fptr;
        guint stack_usage;
+       guint stack_align_amount;
        guint virtual : 1;
        guint tail_call : 1;
        /* If this is TRUE, 'fptr' points to a MonoJumpInfo instead of an address. */