config.h include added
[libfirm] / ir / be / bearch_firm.c
index c91975b..cf5e531 100644 (file)
@@ -6,7 +6,7 @@
 #include "bitset.h"
 #include "bearch.h"
 
-#define N_REGS 1024
+#define N_REGS 64
 
 static arch_register_t gp_regs[N_REGS];
 static arch_register_t fp_regs[N_REGS];
@@ -20,7 +20,7 @@ static arch_register_class_t reg_classes[] = {
   (sizeof(reg_classes) / sizeof(reg_classes[0]))
 
 #define CLS_GP 0
-#define CLS_FP 0
+#define CLS_FP 1
 
 static void firm_init(void)
 {
@@ -78,33 +78,48 @@ static const arch_register_class_t *firm_get_irn_reg_class(const ir_node *irn)
   return NULL;
 }
 
-static int firm_is_reg_allocatable(const ir_node *irn, const arch_register_t *reg)
-{
-  return arch_register_get_class(reg) == firm_get_irn_reg_class(irn);
-}
-
 static int firm_get_allocatable_regs(const ir_node *irn,
     const arch_register_class_t *cls, bitset_t *bs)
 {
-  int i;
+  int res = 0;
 
   if(firm_get_irn_reg_class(irn) != cls) {
-    bitset_clear_all(bs);
-    return 0;
+    if(bs)
+      bitset_clear_all(bs);
+  }
+
+  else {
+    int i;
+
+    res = cls->n_regs;
+    if(bs) {
+      for(i = 0; i < cls->n_regs; ++i)
+        bitset_set(bs, i);
+    }
   }
 
-  for(i = 0; i < cls->n_regs; ++i)
-    bitset_set_all(bs);
+  return res;
+}
+
+static int firm_is_reg_allocatable(const ir_node *irn, const arch_register_t *reg)
+{
+       const arch_register_class_t *cls = reg->reg_class;
+       ir_mode *irm = get_irn_mode(irn);
+
+       if(mode_is_float(irm))
+               return cls == &reg_classes[CLS_FP];
+       else if(mode_is_datab(irm))
+               return cls == &reg_classes[CLS_GP];
 
-  return cls->n_regs;
+       return 0;
 }
 
 const arch_isa_if_t arch_isa_if_firm = {
   firm_init,
   firm_get_n_reg_class,
   firm_get_reg_class,
-  firm_is_reg_allocatable,
   firm_get_allocatable_regs,
+  firm_is_reg_allocatable,
   firm_get_irn_reg_class,
   NULL
 };