3 * ISA implementation for Firm IR nodes.
11 static arch_register_t gp_regs[N_REGS];
12 static arch_register_t fp_regs[N_REGS];
14 static arch_register_class_t reg_classes[] = {
15 { "gp", NULL, N_REGS, gp_regs },
16 { "fp", NULL, N_REGS, fp_regs }
20 (sizeof(reg_classes) / sizeof(reg_classes[0]))
25 static void firm_init(void)
27 static struct obstack obst;
28 static int inited = 0;
37 for(k = 0; k < N_CLASSES; ++k) {
38 const arch_register_class_t *cls = ®_classes[k];
41 for(i = 0; i < cls->n_regs; ++i) {
45 arch_register_t *reg = (arch_register_t *) &cls->regs[i];
47 n = snprintf(buf, sizeof(buf), "r%d", i);
48 name = obstack_copy0(&obst, buf, n);
58 static int firm_get_n_reg_class(void)
63 static const arch_register_class_t *firm_get_reg_class(int i)
65 assert(i >= 0 && i < N_CLASSES);
66 return ®_classes[i];
69 static const arch_register_class_t *firm_get_irn_reg_class(const ir_node *irn)
71 ir_mode *mode = get_irn_mode(irn);
73 if(mode_is_float(mode))
74 return ®_classes[CLS_FP];
75 else if(mode_is_datab(mode))
76 return ®_classes[CLS_GP];
81 static int firm_get_allocatable_regs(const ir_node *irn,
82 const arch_register_class_t *cls, bitset_t *bs)
86 if(firm_get_irn_reg_class(irn) != cls) {
96 for(i = 0; i < cls->n_regs; ++i)
104 static int firm_is_reg_allocatable(const ir_node *irn, const arch_register_t *reg)
106 const arch_register_class_t *cls = reg->reg_class;
107 ir_mode *irm = get_irn_mode(irn);
109 if(mode_is_float(irm))
110 return cls == ®_classes[CLS_FP];
111 else if(mode_is_datab(irm))
112 return cls == ®_classes[CLS_GP];
117 const arch_isa_if_t arch_isa_if_firm = {
119 firm_get_n_reg_class,
121 firm_get_allocatable_regs,
122 firm_is_reg_allocatable,
123 firm_get_irn_reg_class,