return rs;
}
+void
+mono_regstate_free (MonoRegState *rs) {
+ g_free (rs->iassign);
+ g_free (rs->fassign);
+ g_free (rs);
+}
+
void
mono_regstate_reset (MonoRegState *rs) {
rs->next_vireg = MONO_MAX_IREGS;
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));
+ 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, guint32 allow)
+mono_regstate_alloc_int (MonoRegState *rs, regmask_t allow)
{
int i;
- guint32 mask = allow & rs->ifree_mask;
+ regmask_t mask = allow & rs->ifree_mask;
for (i = 0; i < MONO_MAX_IREGS; ++i) {
- if (mask & (1 << i)) {
- rs->ifree_mask &= ~ (1 << i);
+ if (mask & ((regmask_t)1 << i)) {
+ rs->ifree_mask &= ~ ((regmask_t)1 << i);
+ rs->max_ireg = MAX (rs->max_ireg, i);
return i;
}
}
mono_regstate_free_int (MonoRegState *rs, int reg)
{
if (reg >= 0) {
- rs->ifree_mask |= 1 << reg;
+ rs->ifree_mask |= (regmask_t)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 & ((regmask_t)1 << i)) {
+ rs->ffree_mask &= ~ ((regmask_t)1 << i);
+ return i;
+ }
+ }
+ return -1;
+}
+
+void
+mono_regstate_free_float (MonoRegState *rs, int reg)
+{
+ if (reg >= 0) {
+ rs->ffree_mask |= (regmask_t)1 << reg;
+ rs->fsymbolic [reg] = 0;
+ }
+}
+
inline int
mono_regstate_next_long (MonoRegState *rs)
{