Mon Jan 19 17:44:50 CET 2004 Paolo Molaro <lupus@ximian.com>
[mono.git] / mono / mini / regalloc.h
index 55cacbf81356d13b3d938195aefa7281829b13a6..80b71f141b572999acf03fef0ceaf284aa679982 100644 (file)
@@ -1,4 +1,6 @@
 
+typedef size_t regmask_t;
+
 enum {
        MONO_REG_FREE,
        MONO_REG_FREEABLE,
@@ -12,10 +14,6 @@ enum {
        MONO_REG_DOUBLE
 };
 
-/* make this arch-dependent */
-#define MONO_MAX_IREGS 8
-#define MONO_MAX_FREGS 7
-
 typedef struct {
        /* symbolic registers */
        int next_vireg;
@@ -25,12 +23,16 @@ typedef struct {
        int num_iregs;
        int num_fregs;
 
-       guint32 ifree_mask;
-       guint32 ffree_mask;
+       regmask_t ifree_mask;
+       regmask_t ffree_mask;
 
        /* symbolic -> hard register assignment */
-       char *iassign;
-       char *fassign;
+       /* 
+        * If the register is spilled, then this contains -spill - 1, where 'spill'
+        * is the index of the spill variable.
+        */
+       int *iassign;
+       int *fassign;
 
        /* hard -> symbolic */
        int isymbolic [MONO_MAX_IREGS];
@@ -48,7 +50,9 @@ 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, guint32 allow);
+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);