#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];
(sizeof(reg_classes) / sizeof(reg_classes[0]))
#define CLS_GP 0
-#define CLS_FP 0
+#define CLS_FP 1
static void firm_init(void)
{
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 == ®_classes[CLS_FP];
+ else if(mode_is_datab(irm))
+ return cls == ®_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
};