X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmini%2Fregalloc.c;h=4f39872e3024e5fbbd97b2e5f62cff4bef43e75e;hb=dfbb1c153f8c2a16732615b90b95ec050f41e097;hp=708af1db4370dd25c3f6d634201e229e9c15ccdd;hpb=f0097fdd0a8d3ae60c3b3b6672c771ee61173be1;p=mono.git diff --git a/mono/mini/regalloc.c b/mono/mini/regalloc.c index 708af1db437..4f39872e302 100644 --- a/mono/mini/regalloc.c +++ b/mono/mini/regalloc.c @@ -13,101 +13,16 @@ mono_regstate_new (void) { MonoRegState* rs = g_new0 (MonoRegState, 1); - mono_regstate_reset (rs); + rs->next_vreg = MAX (MONO_MAX_IREGS, MONO_MAX_FREGS); +#ifdef MONO_ARCH_NEED_SIMD_BANK + rs->next_vreg = MAX (rs->next_vreg, MONO_MAX_XREGS); +#endif return rs; } void mono_regstate_free (MonoRegState *rs) { - g_free (rs->iassign); - g_free (rs->fassign); + g_free (rs->vassign); g_free (rs); } - -void -mono_regstate_reset (MonoRegState *rs) { - rs->next_vireg = MONO_MAX_IREGS; - rs->next_vfreg = MONO_MAX_FREGS; -} - -void -mono_regstate_assign (MonoRegState *rs) { - int i; - rs->max_ireg = -1; - g_free (rs->iassign); - rs->iassign = g_malloc (MAX (MONO_MAX_IREGS, rs->next_vireg) * sizeof (int)); - for (i = 0; i < MONO_MAX_IREGS; ++i) { - rs->iassign [i] = i; - rs->isymbolic [i] = 0; - } - for (; i < rs->next_vireg; ++i) - rs->iassign [i] = -1; - - g_free (rs->fassign); - rs->fassign = g_malloc (MAX (MONO_MAX_FREGS, rs->next_vfreg) * sizeof (int)); - for (i = 0; i < MONO_MAX_FREGS; ++i) { - rs->fassign [i] = i; - rs->fsymbolic [i] = 0; - } - for (; i < rs->next_vfreg; ++i) - rs->fassign [i] = -1; -} - -int -mono_regstate_alloc_int (MonoRegState *rs, regmask_t allow) -{ - int i; - regmask_t mask = allow & rs->ifree_mask; - for (i = 0; i < MONO_MAX_IREGS; ++i) { - if (mask & (1 << i)) { - rs->ifree_mask &= ~ (1 << i); - rs->max_ireg = MAX (rs->max_ireg, i); - return i; - } - } - return -1; -} - -void -mono_regstate_free_int (MonoRegState *rs, int reg) -{ - if (reg >= 0) { - rs->ifree_mask |= 1 << reg; - rs->isymbolic [reg] = 0; - } -} - -int -mono_regstate_alloc_float (MonoRegState *rs, regmask_t allow) -{ - int i; - regmask_t mask = allow & rs->ffree_mask; - for (i = 0; i < MONO_MAX_FREGS; ++i) { - if (mask & (1 << i)) { - rs->ffree_mask &= ~ (1 << i); - return i; - } - } - return -1; -} - -void -mono_regstate_free_float (MonoRegState *rs, int reg) -{ - if (reg >= 0) { - rs->ffree_mask |= 1 << reg; - rs->fsymbolic [reg] = 0; - } -} - -inline int -mono_regstate_next_long (MonoRegState *rs) -{ - int rval = rs->next_vireg; - - rs->next_vireg += 2; - - return rval; -} -