3 * ISA implementation for Firm IR nodes.
12 #include "irreflect.h"
16 static arch_register_t datab_regs[N_REGS];
18 static arch_register_class_t reg_classes[] = {
19 { "datab", N_REGS, datab_regs },
23 (sizeof(reg_classes) / sizeof(reg_classes[0]))
27 static void firm_init(void)
29 static struct obstack obst;
30 static int inited = 0;
39 for(k = 0; k < N_CLASSES; ++k) {
40 const arch_register_class_t *cls = ®_classes[k];
43 for(i = 0; i < cls->n_regs; ++i) {
47 arch_register_t *reg = (arch_register_t *) &cls->regs[i];
49 n = snprintf(buf, sizeof(buf), "r%d", i);
50 name = obstack_copy0(&obst, buf, n);
60 static int firm_get_n_reg_class(void)
65 static const arch_register_class_t *firm_get_reg_class(int i)
67 assert(i >= 0 && i < N_CLASSES);
68 return ®_classes[i];
71 static const arch_register_req_t firm_std_reg_req = {
72 arch_register_req_type_normal,
73 ®_classes[CLS_DATAB],
77 static const rflct_arg_t *get_arg(const ir_node *irn, int pos)
79 int sig = rflct_get_signature(irn);
80 const rflct_arg_t *args =
81 rflct_get_args(get_irn_opcode(irn), sig, arch_pos_is_in(pos));
82 return &args[arch_pos_get_index(pos)];
85 static const arch_register_req_t *
86 firm_get_irn_reg_req(const ir_node *irn, int pos)
88 return mode_is_datab(get_irn_mode(irn)) ? &firm_std_reg_req : NULL;
91 static int firm_get_n_operands(const ir_node *irn, int in_out)
93 int sig = rflct_get_signature(irn);
94 return rflct_get_args_count(get_irn_opcode(irn), sig, in_out >= 0);
97 struct irn_reg_assoc {
100 const arch_register_t *reg;
103 static int cmp_irn_reg_assoc(const void *a, const void *b, size_t len)
105 const struct irn_reg_assoc *x = a;
106 const struct irn_reg_assoc *y = b;
108 return !(x->irn == y->irn && x->pos == y->pos);
111 static struct irn_reg_assoc *get_irn_reg_assoc(const ir_node *irn, int pos)
113 static set *reg_set = NULL;
114 struct irn_reg_assoc templ;
118 reg_set = new_set(cmp_irn_reg_assoc, 1024);
123 hash = HASH_PTR(irn) + 7 * pos;
125 return set_insert(reg_set, &templ, sizeof(templ), hash);
128 static void firm_set_irn_reg(ir_node *irn, int pos, const arch_register_t *reg)
130 struct irn_reg_assoc *assoc = get_irn_reg_assoc(irn, pos);
134 static const arch_register_t *firm_get_irn_reg(const ir_node *irn, int pos)
136 struct irn_reg_assoc *assoc = get_irn_reg_assoc(irn, pos);
140 static arch_irn_class_t firm_classify(const ir_node *irn)
142 return arch_irn_class_normal;
145 static const arch_irn_ops_t irn_ops = {
146 firm_get_irn_reg_req,
153 const arch_isa_if_t firm_isa = {
155 firm_get_n_reg_class,
159 static const arch_irn_ops_t *firm_get_irn_ops(const ir_node *irn)
164 const arch_irn_handler_t firm_irn_handler = {