2008-10-03 Mark Probst <mark.probst@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         MONO_REG_SIMD
16 };
17
18  
19 #ifdef MONO_ARCH_NEED_SIMD_BANK
20 #define MONO_NUM_REGBANKS 3
21 #else
22 #define MONO_NUM_REGBANKS 2
23 #endif
24
25 typedef struct {
26         /* symbolic registers */
27         int next_vreg;
28
29         regmask_t ifree_mask;
30         regmask_t free_mask [MONO_NUM_REGBANKS];
31
32         /* symbolic -> hard register assignment */
33         /* 
34          * If the register is spilled, then this contains -spill - 1, where 'spill'
35          * is the index of the spill variable.
36          */
37         gint16 *vassign;
38
39         /* hard -> symbolic */
40         int isymbolic [MONO_MAX_IREGS];
41         int fsymbolic [MONO_MAX_FREGS];
42 #ifdef MONO_ARCH_NEED_SIMD_BANK
43         int xsymbolic [MONO_MAX_XREGS];
44 #endif
45         /* Points to the arrays above */
46         int *symbolic [MONO_NUM_REGBANKS];
47
48         int vassign_size;
49 } MonoRegState;
50
51 #define mono_regstate_next_int(rs)   ((rs)->next_vreg++)
52 #define mono_regstate_next_float(rs) ((rs)->next_vreg++)
53
54
55 MonoRegState* mono_regstate_new (void) MONO_INTERNAL;
56
57 void          mono_regstate_free      (MonoRegState *rs) MONO_INTERNAL;
58 void          mono_regstate_reset     (MonoRegState *rs) MONO_INTERNAL;
59 inline int    mono_regstate_next_long (MonoRegState *rs) MONO_INTERNAL;
60