2 * regalloc.c: register state class
5 * Paolo Molaro (lupus@ximian.com)
7 * (C) 2003 Ximian, Inc.
12 mono_regstate_new (void)
14 MonoRegState* rs = g_new0 (MonoRegState, 1);
16 mono_regstate_reset (rs);
22 mono_regstate_free (MonoRegState *rs) {
29 mono_regstate_reset (MonoRegState *rs) {
30 rs->next_vireg = MONO_MAX_IREGS;
31 rs->next_vfreg = MONO_MAX_FREGS;
35 mono_regstate_assign (MonoRegState *rs) {
39 rs->iassign = g_malloc (MAX (MONO_MAX_IREGS, rs->next_vireg) * sizeof (int));
40 for (i = 0; i < MONO_MAX_IREGS; ++i) {
42 rs->isymbolic [i] = 0;
44 for (; i < rs->next_vireg; ++i)
48 rs->fassign = g_malloc (MAX (MONO_MAX_FREGS, rs->next_vfreg) * sizeof (int));
49 for (i = 0; i < MONO_MAX_FREGS; ++i) {
51 rs->fsymbolic [i] = 0;
53 for (; i < rs->next_vfreg; ++i)
58 mono_regstate_alloc_int (MonoRegState *rs, regmask_t allow)
61 regmask_t mask = allow & rs->ifree_mask;
62 for (i = 0; i < MONO_MAX_IREGS; ++i) {
63 if (mask & ((regmask_t)1 << i)) {
64 rs->ifree_mask &= ~ ((regmask_t)1 << i);
65 rs->max_ireg = MAX (rs->max_ireg, i);
73 mono_regstate_free_int (MonoRegState *rs, int reg)
76 rs->ifree_mask |= (regmask_t)1 << reg;
77 rs->isymbolic [reg] = 0;
82 mono_regstate_alloc_float (MonoRegState *rs, regmask_t allow)
85 regmask_t mask = allow & rs->ffree_mask;
86 for (i = 0; i < MONO_MAX_FREGS; ++i) {
87 if (mask & ((regmask_t)1 << i)) {
88 rs->ffree_mask &= ~ ((regmask_t)1 << i);
96 mono_regstate_free_float (MonoRegState *rs, int reg)
99 rs->ffree_mask |= (regmask_t)1 << reg;
100 rs->fsymbolic [reg] = 0;
105 mono_regstate_next_long (MonoRegState *rs)
107 int rval = rs->next_vireg;