3 * ISA implementation for Firm IR nodes.
13 static arch_register_t datab_regs[N_REGS];
15 static arch_register_class_t reg_classes[] = {
16 { "datab", N_REGS, datab_regs },
20 (sizeof(reg_classes) / sizeof(reg_classes[0]))
24 static void firm_init(void)
26 static struct obstack obst;
27 static int inited = 0;
36 for(k = 0; k < N_CLASSES; ++k) {
37 const arch_register_class_t *cls = ®_classes[k];
40 for(i = 0; i < cls->n_regs; ++i) {
44 arch_register_t *reg = (arch_register_t *) &cls->regs[i];
46 n = snprintf(buf, sizeof(buf), "r%d", i);
47 name = obstack_copy0(&obst, buf, n);
57 static int firm_get_n_reg_class(void)
62 static const arch_register_class_t *firm_get_reg_class(int i)
64 assert(i >= 0 && i < N_CLASSES);
65 return ®_classes[i];
68 static const arch_register_req_t firm_std_reg_req = {
69 arch_register_req_type_normal,
70 ®_classes[CLS_DATAB],
74 static const rflct_arg_t *get_arg(const ir_node *irn, int pos)
76 int sig = rflct_get_signature(irn);
77 const rflct_arg_t *args =
78 rflct_get_args(get_irn_opcode(irn), sig, arch_pos_is_in(pos));
79 return &args[arch_pos_get_index(pos)];
82 static const arch_register_req_t *
83 firm_get_irn_reg_req(const ir_node *irn, int pos)
85 return mode_is_datab(get_irn_mode(irn)) ? &firm_std_reg_req : NULL;
88 static int firm_get_n_operands(const ir_node *irn, int in_out)
90 int sig = rflct_get_signature(irn);
91 return rflct_get_args_count(get_irn_opcode(irn), sig, in_out >= 0);
94 struct irn_reg_assoc {
97 const arch_register_t *reg;
100 static int cmp_irn_reg_assoc(const void *a, const void *b, size_t len)
102 const struct irn_reg_assoc *x = a;
103 const struct irn_reg_assoc *y = b;
105 return !(x->irn == y->irn && x->pos == y->pos);
108 static struct irn_reg_assoc *get_irn_reg_assoc(const ir_node *irn, int pos)
110 static set *reg_set = NULL;
111 struct irn_reg_assoc templ;
115 reg_set = new_set(cmp_irn_reg_assoc, 1024);
120 hash = HASH_PTR(irn) + 7 * pos;
122 return set_insert(reg_set, &templ, sizeof(templ), hash);
125 static void firm_set_irn_reg(ir_node *irn, int pos, const arch_register_t *reg)
127 struct irn_reg_assoc *assoc = get_irn_reg_assoc(irn, pos);
131 static const arch_register_t *firm_get_irn_reg(const ir_node *irn, int pos)
133 struct irn_reg_assoc *assoc = get_irn_reg_assoc(irn, pos);
137 static arch_irn_class_t firm_classify(const ir_node *irn)
139 return arch_irn_class_normal;
142 static const arch_irn_ops_t irn_ops = {
143 firm_get_irn_reg_req,
150 const arch_isa_if_t firm_isa = {
152 firm_get_n_reg_class,
156 static const arch_irn_ops_t *firm_get_irn_ops(const ir_node *irn)
161 const arch_irn_handler_t firm_irn_handler = {