Merge pull request #5714 from alexischr/update_bockbuild
[mono.git] / mono / mini / regalloc.h
1 /**
2  * \file
3  */
4
5 typedef size_t regmask_t;
6
7 enum {
8         MONO_REG_INT,
9         MONO_REG_DOUBLE,
10         /* This is used only for allocating spill slots with GC tracking */
11         MONO_REG_INT_REF,
12         /* Ditto for managed pointers */
13         MONO_REG_INT_MP,
14         MONO_REG_SIMD
15 };
16
17  
18 #ifdef MONO_ARCH_NEED_SIMD_BANK
19 #define MONO_NUM_REGBANKS 5
20 #else
21 #define MONO_NUM_REGBANKS 4
22 #endif
23
24 typedef struct {
25         /* symbolic registers */
26         int next_vreg;
27
28         regmask_t ifree_mask;
29         regmask_t free_mask [MONO_NUM_REGBANKS];
30
31         /* symbolic -> hard register assignment */
32         /* 
33          * If the register is spilled, then this contains -spill - 1, where 'spill'
34          * is the index of the spill variable.
35          */
36         gint32 *vassign;
37
38         /* hard -> symbolic */
39         int isymbolic [MONO_MAX_IREGS];
40         int fsymbolic [MONO_MAX_FREGS];
41 #ifdef MONO_ARCH_NEED_SIMD_BANK
42         int xsymbolic [MONO_MAX_XREGS];
43 #endif
44         /* Points to the arrays above */
45         int *symbolic [MONO_NUM_REGBANKS];
46
47         int vassign_size;
48 } MonoRegState;
49
50 MonoRegState* mono_regstate_new (void);
51
52 void          mono_regstate_free      (MonoRegState *rs);