2003-09-26 Zoltan Varga <vargaz@freemail.hu>
[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_vireg;
20         int next_vfreg;
21
22         /* hard registers */
23         int num_iregs;
24         int num_fregs;
25
26         regmask_t ifree_mask;
27         regmask_t ffree_mask;
28
29         /* symbolic -> hard register assignment */
30         char *iassign;
31         char *fassign;
32
33         /* hard -> symbolic */
34         int isymbolic [MONO_MAX_IREGS];
35         int fsymbolic [MONO_MAX_FREGS];
36
37         int ispills;
38 } MonoRegState;
39
40 #define mono_regstate_next_int(rs)   ((rs)->next_vireg++)
41 #define mono_regstate_next_float(rs) ((rs)->next_vfreg++)
42
43
44 MonoRegState* mono_regstate_new (void);
45
46 void          mono_regstate_free      (MonoRegState *rs);
47 void          mono_regstate_reset     (MonoRegState *rs);
48 void          mono_regstate_assign    (MonoRegState *rs);
49 int           mono_regstate_alloc_int   (MonoRegState *rs, regmask_t allow);
50 void          mono_regstate_free_int  (MonoRegState *rs, int reg);
51 int           mono_regstate_alloc_float (MonoRegState *rs, regmask_t allow);
52 void          mono_regstate_free_float  (MonoRegState *rs, int reg);
53 inline int    mono_regstate_next_long (MonoRegState *rs);
54