2008-02-24 Zoltan Varga <vargaz@gmail.com>
[mono.git] / mono / mini / regalloc.h
1
2 typedef size_t regmask_t;
3
4 enum {
5         MONO_REG_FREE,
6         MONO_REG_FREEABLE,
7         MONO_REG_MOVEABLE,
8         MONO_REG_BUSY,
9         MONO_REG_RESERVED
10 };
11
12 enum {
13         MONO_REG_INT,
14         MONO_REG_DOUBLE
15 };
16
17 typedef struct {
18         /* symbolic registers */
19         int next_vreg;
20
21         regmask_t ifree_mask;
22         regmask_t ffree_mask;
23
24         /* symbolic -> hard register assignment */
25         /* 
26          * If the register is spilled, then this contains -spill - 1, where 'spill'
27          * is the index of the spill variable.
28          */
29         gint16 *vassign;
30
31         /* hard -> symbolic */
32         int isymbolic [MONO_MAX_IREGS];
33         int fsymbolic [MONO_MAX_FREGS];
34
35         int vassign_size;
36 } MonoRegState;
37
38 #define mono_regstate_next_int(rs)   ((rs)->next_vreg++)
39 #define mono_regstate_next_float(rs) ((rs)->next_vreg++)
40
41
42 MonoRegState* mono_regstate_new (void) MONO_INTERNAL;
43
44 void          mono_regstate_free      (MonoRegState *rs) MONO_INTERNAL;
45 void          mono_regstate_reset     (MonoRegState *rs) MONO_INTERNAL;
46 inline int    mono_regstate_next_long (MonoRegState *rs) MONO_INTERNAL;
47