55cacbf81356d13b3d938195aefa7281829b13a6
[mono.git] / mono / mini / regalloc.h
1
2 enum {
3         MONO_REG_FREE,
4         MONO_REG_FREEABLE,
5         MONO_REG_MOVEABLE,
6         MONO_REG_BUSY,
7         MONO_REG_RESERVED
8 };
9
10 enum {
11         MONO_REG_INT,
12         MONO_REG_DOUBLE
13 };
14
15 /* make this arch-dependent */
16 #define MONO_MAX_IREGS 8
17 #define MONO_MAX_FREGS 7
18
19 typedef struct {
20         /* symbolic registers */
21         int next_vireg;
22         int next_vfreg;
23
24         /* hard registers */
25         int num_iregs;
26         int num_fregs;
27
28         guint32 ifree_mask;
29         guint32 ffree_mask;
30
31         /* symbolic -> hard register assignment */
32         char *iassign;
33         char *fassign;
34
35         /* hard -> symbolic */
36         int isymbolic [MONO_MAX_IREGS];
37         int fsymbolic [MONO_MAX_FREGS];
38
39         int ispills;
40 } MonoRegState;
41
42 #define mono_regstate_next_int(rs)   ((rs)->next_vireg++)
43 #define mono_regstate_next_float(rs) ((rs)->next_vfreg++)
44
45
46 MonoRegState* mono_regstate_new (void);
47
48 void          mono_regstate_free      (MonoRegState *rs);
49 void          mono_regstate_reset     (MonoRegState *rs);
50 void          mono_regstate_assign    (MonoRegState *rs);
51 int           mono_regstate_alloc_int (MonoRegState *rs, guint32 allow);
52 void          mono_regstate_free_int  (MonoRegState *rs, int reg);
53 inline int    mono_regstate_next_long (MonoRegState *rs);
54