2010-03-01 Zoltan Varga <vargaz@gmail.com>
[mono.git] / mono / mini / regalloc.h
index 80b71f141b572999acf03fef0ceaf284aa679982..898b1e0a75f0a88f2746c9d818b2096ff295f2ff 100644 (file)
@@ -1,58 +1,45 @@
 
 typedef size_t regmask_t;
 
-enum {
-       MONO_REG_FREE,
-       MONO_REG_FREEABLE,
-       MONO_REG_MOVEABLE,
-       MONO_REG_BUSY,
-       MONO_REG_RESERVED
-};
-
 enum {
        MONO_REG_INT,
-       MONO_REG_DOUBLE
+       MONO_REG_DOUBLE,
+       MONO_REG_SIMD
 };
 
+#ifdef MONO_ARCH_NEED_SIMD_BANK
+#define MONO_NUM_REGBANKS 3
+#else
+#define MONO_NUM_REGBANKS 2
+#endif
+
 typedef struct {
        /* symbolic registers */
-       int next_vireg;
-       int next_vfreg;
-
-       /* hard registers */
-       int num_iregs;
-       int num_fregs;
+       int next_vreg;
 
        regmask_t ifree_mask;
-       regmask_t ffree_mask;
+       regmask_t free_mask [MONO_NUM_REGBANKS];
 
        /* symbolic -> hard register assignment */
        /* 
         * If the register is spilled, then this contains -spill - 1, where 'spill'
         * is the index of the spill variable.
         */
-       int *iassign;
-       int *fassign;
+       gint32 *vassign;
 
        /* hard -> symbolic */
        int isymbolic [MONO_MAX_IREGS];
        int fsymbolic [MONO_MAX_FREGS];
+#ifdef MONO_ARCH_NEED_SIMD_BANK
+       int xsymbolic [MONO_MAX_XREGS];
+#endif
+       /* Points to the arrays above */
+       int *symbolic [MONO_NUM_REGBANKS];
 
-       int ispills;
+       int vassign_size;
 } MonoRegState;
 
-#define mono_regstate_next_int(rs)   ((rs)->next_vireg++)
-#define mono_regstate_next_float(rs) ((rs)->next_vfreg++)
-
-
-MonoRegState* mono_regstate_new (void);
-
-void          mono_regstate_free      (MonoRegState *rs);
-void          mono_regstate_reset     (MonoRegState *rs);
-void          mono_regstate_assign    (MonoRegState *rs);
-int           mono_regstate_alloc_int   (MonoRegState *rs, regmask_t allow);
-void          mono_regstate_free_int  (MonoRegState *rs, int reg);
-int           mono_regstate_alloc_float (MonoRegState *rs, regmask_t allow);
-void          mono_regstate_free_float  (MonoRegState *rs, int reg);
-inline int    mono_regstate_next_long (MonoRegState *rs);
+MonoRegState* mono_regstate_new (void) MONO_INTERNAL;
 
+void          mono_regstate_free      (MonoRegState *rs) MONO_INTERNAL;