3 * ISA implementation for Firm IR nodes.
14 #include "irreflect.h"
18 static arch_register_t datab_regs[N_REGS];
20 static arch_register_class_t reg_classes[] = {
21 { "datab", N_REGS, datab_regs },
25 (sizeof(reg_classes) / sizeof(reg_classes[0]))
29 static void firm_init(void)
31 static struct obstack obst;
32 static int inited = 0;
41 for(k = 0; k < N_CLASSES; ++k) {
42 const arch_register_class_t *cls = ®_classes[k];
45 for(i = 0; i < cls->n_regs; ++i) {
49 arch_register_t *reg = (arch_register_t *) &cls->regs[i];
51 n = snprintf(buf, sizeof(buf), "r%d", i);
52 name = obstack_copy0(&obst, buf, n);
62 static int firm_get_n_reg_class(void)
67 static const arch_register_class_t *firm_get_reg_class(int i)
69 assert(i >= 0 && i < N_CLASSES);
70 return ®_classes[i];
73 static const arch_register_req_t firm_std_reg_req = {
74 arch_register_req_type_normal,
75 ®_classes[CLS_DATAB],
79 static const rflct_arg_t *get_arg(const ir_node *irn, int pos)
81 int sig = rflct_get_signature(irn);
82 const rflct_arg_t *args =
83 rflct_get_args(get_irn_opcode(irn), sig, arch_pos_is_in(pos));
84 return &args[arch_pos_get_index(pos)];
87 static const arch_register_req_t *
88 firm_get_irn_reg_req(const arch_irn_ops_t *self,
89 arch_register_req_t *req, const ir_node *irn, int pos)
91 if(mode_is_datab(get_irn_mode(irn)))
92 memcpy(req, &firm_std_reg_req, sizeof(*req));
99 static int firm_get_n_operands(const arch_irn_ops_t *self, const ir_node *irn, int in_out)
101 int sig = rflct_get_signature(irn);
102 return rflct_get_args_count(get_irn_opcode(irn), sig, in_out >= 0);
105 struct irn_reg_assoc {
108 const arch_register_t *reg;
111 static int cmp_irn_reg_assoc(const void *a, const void *b, size_t len)
113 const struct irn_reg_assoc *x = a;
114 const struct irn_reg_assoc *y = b;
116 return !(x->irn == y->irn && x->pos == y->pos);
119 static struct irn_reg_assoc *get_irn_reg_assoc(const ir_node *irn, int pos)
121 static set *reg_set = NULL;
122 struct irn_reg_assoc templ;
126 reg_set = new_set(cmp_irn_reg_assoc, 1024);
131 hash = HASH_PTR(irn) + 7 * pos;
133 return set_insert(reg_set, &templ, sizeof(templ), hash);
136 static void firm_set_irn_reg(const arch_irn_ops_t *self, ir_node *irn,
137 int pos, const arch_register_t *reg)
139 struct irn_reg_assoc *assoc = get_irn_reg_assoc(irn, pos);
143 static const arch_register_t *firm_get_irn_reg(const arch_irn_ops_t *self,
144 const ir_node *irn, int pos)
146 struct irn_reg_assoc *assoc = get_irn_reg_assoc(irn, pos);
150 static arch_irn_class_t firm_classify(const arch_irn_ops_t *self, const ir_node *irn)
152 arch_irn_class_t res;
154 switch(get_irn_opcode(irn)) {
157 res = arch_irn_class_branch;
160 res = arch_irn_class_normal;
166 static const arch_irn_ops_t irn_ops = {
167 firm_get_irn_reg_req,
174 const arch_isa_if_t firm_isa = {
176 firm_get_n_reg_class,
180 static const arch_irn_ops_t *firm_get_irn_ops(const arch_irn_handler_t *self,
186 const arch_irn_handler_t firm_irn_handler = {