Mon Jan 19 17:44:50 CET 2004 Paolo Molaro <lupus@ximian.com>
[mono.git] / mono / mini / linear-scan.c
index 3cf0775d29699fb070cde27fa60e5724caf8e8d3..6148de8f75a3a82628b0b9893c466a7256278edc 100644 (file)
@@ -43,15 +43,33 @@ mono_varlist_insert_sorted (MonoCompile *cfg, GList *list, MonoMethodVar *mv, in
        return list;
 }
 
+static gint 
+compare_by_first_use_func (gconstpointer a, gconstpointer b)
+{
+       MonoMethodVar *v1 = (MonoMethodVar*)a;
+       MonoMethodVar *v2 = (MonoMethodVar*)b;
+
+       return v1->range.first_use.abs_pos - v2->range.first_use.abs_pos;
+}
+
+GList *
+mono_varlist_sort (MonoCompile *cfg, GList *list, int sort_type)
+{
+       if (sort_type == 0)
+               return g_list_sort (list, compare_by_first_use_func);
+       else
+               g_assert_not_reached ();
+}
+
 //#define DEBUG_LSCAN
 
 void
-mono_linear_scan (MonoCompile *cfg, GList *vars, GList *regs, guint32 *used_mask)
+mono_linear_scan (MonoCompile *cfg, GList *vars, GList *regs, regmask_t *used_mask)
 {
        GList *l, *a, *active = NULL;
        MonoMethodVar *vmv, *amv;
-       int max_regs, gains [32];
-       guint32 used_regs = 0;
+       int max_regs, gains [sizeof (regmask_t) * 8];
+       regmask_t used_regs = 0;
        gboolean cost_driven;
 
        cost_driven = (cfg->comp_done & MONO_COMP_LOOPS);
@@ -136,14 +154,14 @@ mono_linear_scan (MonoCompile *cfg, GList *vars, GList *regs, guint32 *used_mask
 
                        vmv->reg = (int)regs->data;
 
-                       used_regs |= 1 << vmv->reg;
+                       used_regs |= 1LL << vmv->reg;
 
                        regs = g_list_remove_link (regs, regs);
 
 #ifdef DEBUG_LSCAN
-                       printf ("ADD    %2d %08x %08x C%d\n",  vnum
+                       printf ("ADD    %2d %08x %08x C%d R%d\n",  vmv->idx
                                vmv->range.first_use.abs_pos, vmv->range.last_use.abs_pos, 
-                               vmv->spill_costs);
+                               vmv->spill_costs, vmv->reg);
 #endif
                        active = mono_varlist_insert_sorted (cfg, active, vmv, TRUE);           
                }
@@ -168,14 +186,13 @@ mono_linear_scan (MonoCompile *cfg, GList *vars, GList *regs, guint32 *used_mask
                vmv = l->data;
                
                if (vmv->reg >= 0)  {
-                       if (gains [vmv->reg] > 5) {
+                       if (gains [vmv->reg] > 3) {
                                cfg->varinfo [vmv->idx]->opcode = OP_REGVAR;
                                cfg->varinfo [vmv->idx]->dreg = vmv->reg;
-#ifdef DEBUG_LSCAN
-                               printf ("REGVAR %d C%d R%d\n", vmv->idx, vmv->spill_costs, vmv->reg);
-#endif
+                               if (cfg->verbose_level > 2)
+                                       printf ("REGVAR %d C%d R%d\n", vmv->idx, vmv->spill_costs, vmv->reg);
                        } else {
-                               used_regs &= ~(1 << vmv->reg); 
+                               used_regs &= ~(1LL << vmv->reg); 
                                vmv->reg = -1;
                        }
                }
@@ -187,3 +204,4 @@ mono_linear_scan (MonoCompile *cfg, GList *vars, GList *regs, guint32 *used_mask
        g_list_free (active);
        g_list_free (vars);
 }
+