Mon May 24 11:13:46 CEST 2004 Paolo Molaro <lupus@ximian.com>
authorPaolo Molaro <lupus@oddwiz.org>
Mon, 24 May 2004 08:35:20 +0000 (08:35 -0000)
committerPaolo Molaro <lupus@oddwiz.org>
Mon, 24 May 2004 08:35:20 +0000 (08:35 -0000)
* mini-x86.c: fix calc of max loop size when aligning loops start.

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

mono/mini/ChangeLog
mono/mini/mini-x86.c

index 6a018c54f640d0a5b6a619a2f31102dba742c220..39316670b36a124969f9bc9ecc2d6b63626e233e 100644 (file)
@@ -1,3 +1,8 @@
+
+Mon May 24 11:13:46 CEST 2004 Paolo Molaro <lupus@ximian.com>
+
+       * mini-x86.c: fix calc of max loop size when aligning loops start.
+
 2004-05-23  Zoltan Varga  <vargaz@freemail.hu>
 
        * ssa.c (mono_ssa_cprop): Allocate carray dynamically instead of on
index b945464040e753f59010a2510102c597c84b0931..883f1abc83223015d2970436d0b525c50b6e4363 100644 (file)
@@ -2086,6 +2086,10 @@ x86_pop_reg (code, X86_ECX); \
 x86_pop_reg (code, X86_EDX); \
 x86_pop_reg (code, X86_EAX);
 
+/* benchmark and set based on cpu */
+#define LOOP_ALIGNMENT 8
+#define bb_is_loop_start(bb) ((bb)->nesting && ((bb)->in_count == 1))
+
 void
 mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
 {
@@ -2101,9 +2105,9 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                peephole_pass (cfg, bb);
 
        if (cfg->opt & MONO_OPT_LOOP) {
-               int pad, align = 8;
+               int pad, align = LOOP_ALIGNMENT;
                /* set alignment depending on cpu */
-               if (bb->nesting && (bb->in_count == 1) && (pad = (cfg->code_len & (align - 1)))) {
+               if (bb_is_loop_start (bb) && (pad = (cfg->code_len & (align - 1)))) {
                        pad = align - pad;
                        /*g_print ("adding %d pad at %x to loop in %s\n", pad, cfg->code_len, cfg->method->name);*/
                        x86_padding (code, pad);
@@ -3444,7 +3448,10 @@ mono_arch_emit_prolog (MonoCompile *cfg)
                        bb->max_offset = max_offset;
 
                        if (cfg->prof_options & MONO_PROFILE_COVERAGE)
-                               max_offset += 6; 
+                               max_offset += 6;
+                       /* max alignment for loops */
+                       if ((cfg->opt & MONO_OPT_LOOP) && bb_is_loop_start (bb))
+                               max_offset += LOOP_ALIGNMENT;
 
                        while (ins) {
                                max_offset += ((guint8 *)ins_spec [ins->opcode])[MONO_INST_LEN];