X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbearch_firm.c;h=cf5e5317ebf5cd9e1c18b2f8909d4e276effc4cc;hb=4ca59cb404899ecc345f6eb30d82a623a346b6fe;hp=c91975bbbc00179c166dc381a0db6040c45ef7d4;hpb=e5ab50e3025460b25b6287e7bb3659d6256e38fb;p=libfirm diff --git a/ir/be/bearch_firm.c b/ir/be/bearch_firm.c index c91975bbb..cf5e5317e 100644 --- a/ir/be/bearch_firm.c +++ b/ir/be/bearch_firm.c @@ -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 == ®_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 };