Tue Aug 5 12:21:08 CEST 2003 Paolo Molaro <lupus@ximian.com>
[mono.git] / mono / mini / regalloc.c
1 /*
2  * regalloc.c: register state class
3  *
4  * Authors:
5  *    Paolo Molaro (lupus@ximian.com)
6  *
7  * (C) 2003 Ximian, Inc.
8  */
9 #include "mini.h"
10
11 MonoRegState*
12 mono_regstate_new (void)
13 {
14         MonoRegState* rs = g_new0 (MonoRegState, 1);
15
16         mono_regstate_reset (rs);
17
18         return rs;
19 }
20
21 void
22 mono_regstate_free (MonoRegState *rs) {
23         g_free (rs->iassign);
24         g_free (rs);
25 }
26
27 void
28 mono_regstate_reset (MonoRegState *rs) {
29         rs->next_vireg = MONO_MAX_IREGS;
30         rs->next_vfreg = MONO_MAX_FREGS;
31 }
32
33 void
34 mono_regstate_assign (MonoRegState *rs) {
35         int i;
36         g_free (rs->iassign);
37         rs->iassign = g_malloc (MAX (MONO_MAX_IREGS, rs->next_vireg));
38         for (i = 0; i < MONO_MAX_IREGS; ++i) {
39                 rs->iassign [i] = i;
40                 rs->isymbolic [i] = 0;
41         }
42         for (; i < rs->next_vireg; ++i)
43                 rs->iassign [i] = -1;
44 }
45
46 int
47 mono_regstate_alloc_int (MonoRegState *rs, guint32 allow)
48 {
49         int i;
50         guint32 mask = allow & rs->ifree_mask;
51         for (i = 0; i < MONO_MAX_IREGS; ++i) {
52                 if (mask & (1 << i)) {
53                         rs->ifree_mask &= ~ (1 << i);
54                         return i;
55                 }
56         }
57         return -1;
58 }
59
60 void
61 mono_regstate_free_int (MonoRegState *rs, int reg)
62 {
63         if (reg >= 0) {
64                 rs->ifree_mask |= 1 << reg;
65                 rs->isymbolic [reg] = 0;
66         }
67 }
68
69 inline int
70 mono_regstate_next_long (MonoRegState *rs)
71 {
72         int rval = rs->next_vireg;
73
74         rs->next_vireg += 2;
75
76         return rval;
77 }
78