config.h include added
[libfirm] / ir / be / bearch_firm.c
1
2 /**
3  * ISA implementation for Firm IR nodes.
4  */
5 #ifdef HAVE_CONFIG_H
6 #include "config.h"
7 #endif
8
9 #include "bitset.h"
10 #include "bearch.h"
11
12 #include "irreflect.h"
13
14 #define N_REGS 64
15
16 static arch_register_t datab_regs[N_REGS];
17
18 static arch_register_class_t reg_classes[] = {
19   { "datab", N_REGS, datab_regs },
20 };
21
22 #define N_CLASSES \
23   (sizeof(reg_classes) / sizeof(reg_classes[0]))
24
25 #define CLS_DATAB 0
26
27 static void firm_init(void)
28 {
29   static struct obstack obst;
30   static int inited = 0;
31   int k;
32
33   if(inited)
34     return;
35
36   inited = 1;
37   obstack_init(&obst);
38
39   for(k = 0; k < N_CLASSES; ++k) {
40     const arch_register_class_t *cls = &reg_classes[k];
41     int i;
42
43     for(i = 0; i < cls->n_regs; ++i) {
44       int n;
45       char buf[8];
46       char *name;
47       arch_register_t *reg = (arch_register_t *) &cls->regs[i];
48
49       n = snprintf(buf, sizeof(buf), "r%d", i);
50       name = obstack_copy0(&obst, buf, n);
51
52       reg->name = name;
53       reg->reg_class = cls;
54       reg->index = i;
55       reg->type = 0;
56     }
57   }
58 }
59
60 static int firm_get_n_reg_class(void)
61 {
62   return N_CLASSES;
63 }
64
65 static const arch_register_class_t *firm_get_reg_class(int i)
66 {
67   assert(i >= 0 && i < N_CLASSES);
68   return &reg_classes[i];
69 }
70
71 static const arch_register_req_t firm_std_reg_req = {
72   arch_register_req_type_normal,
73   &reg_classes[CLS_DATAB],
74   { NULL }
75 };
76
77 static const rflct_arg_t *get_arg(const ir_node *irn, int pos)
78 {
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)];
83 }
84
85 static const arch_register_req_t *
86 firm_get_irn_reg_req(const ir_node *irn, int pos)
87 {
88   return mode_is_datab(get_irn_mode(irn)) ? &firm_std_reg_req : NULL;
89 }
90
91 static int firm_get_n_operands(const ir_node *irn, int in_out)
92 {
93   int sig = rflct_get_signature(irn);
94   return rflct_get_args_count(get_irn_opcode(irn), sig, in_out >= 0);
95 }
96
97 struct irn_reg_assoc {
98   const ir_node *irn;
99   int pos;
100   const arch_register_t *reg;
101 };
102
103 static int cmp_irn_reg_assoc(const void *a, const void *b, size_t len)
104 {
105   const struct irn_reg_assoc *x = a;
106   const struct irn_reg_assoc *y = b;
107
108   return !(x->irn == y->irn && x->pos == y->pos);
109 }
110
111 static struct irn_reg_assoc *get_irn_reg_assoc(const ir_node *irn, int pos)
112 {
113   static set *reg_set = NULL;
114   struct irn_reg_assoc templ;
115   unsigned int hash;
116
117   if(!reg_set)
118     reg_set = new_set(cmp_irn_reg_assoc, 1024);
119
120   templ.irn = irn;
121   templ.pos = pos;
122   templ.reg = NULL;
123   hash = HASH_PTR(irn) + 7 * pos;
124
125   return set_insert(reg_set, &templ, sizeof(templ), hash);
126 }
127
128 static void firm_set_irn_reg(ir_node *irn, int pos, const arch_register_t *reg)
129 {
130   struct irn_reg_assoc *assoc = get_irn_reg_assoc(irn, pos);
131   assoc->reg = reg;
132 }
133
134 static const arch_register_t *firm_get_irn_reg(const ir_node *irn, int pos)
135 {
136   struct irn_reg_assoc *assoc = get_irn_reg_assoc(irn, pos);
137   return assoc->reg;
138 }
139
140 static arch_irn_class_t firm_classify(const ir_node *irn)
141 {
142   return arch_irn_class_normal;
143 }
144
145 static const arch_irn_ops_t irn_ops = {
146   firm_get_irn_reg_req,
147   firm_get_n_operands,
148   firm_set_irn_reg,
149   firm_get_irn_reg,
150   firm_classify
151 };
152
153 const arch_isa_if_t firm_isa = {
154   firm_init,
155   firm_get_n_reg_class,
156   firm_get_reg_class
157 };
158
159 static const arch_irn_ops_t *firm_get_irn_ops(const ir_node *irn)
160 {
161   return &irn_ops;
162 }
163
164 const arch_irn_handler_t firm_irn_handler = {
165   firm_get_irn_ops,
166 };