fixed some minor bugs
[libfirm] / ir / be / ia32 / ia32_new_nodes.h
1 #ifndef _IA32_NEW_NODES_H_
2 #define _IA32_NEW_NODES_H_
3
4 /**
5  * Function prototypes for the assembler ir node constructors.
6  * @author Christian Wuerdig
7  * $Id$
8  */
9
10 #include "ia32_nodes_attr.h"
11
12 /**
13  * Returns the name of a firm symconst.
14  */
15 const char *get_sc_name(ir_node *symc);
16
17
18
19 /***************************************************************************************************
20  *        _   _                   _       __        _                    _   _               _
21  *       | | | |                 | |     / /       | |                  | | | |             | |
22  *   __ _| |_| |_ _ __   ___  ___| |_   / /_ _  ___| |_   _ __ ___   ___| |_| |__   ___   __| |___
23  *  / _` | __| __| '__| / __|/ _ \ __| / / _` |/ _ \ __| | '_ ` _ \ / _ \ __| '_ \ / _ \ / _` / __|
24  * | (_| | |_| |_| |    \__ \  __/ |_ / / (_| |  __/ |_  | | | | | |  __/ |_| | | | (_) | (_| \__ \
25  *  \__,_|\__|\__|_|    |___/\___|\__/_/ \__, |\___|\__| |_| |_| |_|\___|\__|_| |_|\___/ \__,_|___/
26  *                                        __/ |
27  *                                       |___/
28  ***************************************************************************************************/
29
30 /**
31  * Returns the attributes of an ia32 node.
32  */
33 ia32_attr_t *get_ia32_attr(const ir_node *node);
34
35 /**
36  * Gets the type of an ia32 node.
37  */
38 ia32_op_type_t get_ia32_op_type(const ir_node *node);
39
40 /**
41  * Sets the type of an ia32 node.
42  */
43 void set_ia32_op_type(ir_node *node, ia32_op_type_t tp);
44
45 /**
46  * Gets the supported addrmode of an ia32 node
47  */
48 ia32_am_type_t get_ia32_am_support(const ir_node *node);
49
50 /**
51  * Sets the supported addrmode of an ia32 node
52  */
53 void set_ia32_am_support(ir_node *node, ia32_am_type_t am_tp);
54
55 /**
56  * Gets the addrmode flavour of an ia32 node
57  */
58 ia32_am_flavour_t get_ia32_am_flavour(const ir_node *node);
59
60 /**
61  * Sets the addrmode flavour of an ia32 node
62  */
63 void set_ia32_am_flavour(ir_node *node, ia32_am_flavour_t am_flavour);
64
65 /**
66  * Gets the joined addrmode offset.
67  */
68 char *get_ia32_am_offs(const ir_node *node);
69
70 /**
71  * Adds an offset for addrmode.
72  */
73 void add_ia32_am_offs(ir_node *node, char *offset);
74
75 /**
76  * Subs an offset for addrmode.
77  */
78 void sub_ia32_am_offs(ir_node *node, char *offset);
79
80 /**
81  * Gets the addr mode const.
82  */
83 int get_ia32_am_scale(const ir_node *node);
84
85 /**
86  * Sets the const for addr mode.
87  */
88 void set_ia32_am_scale(ir_node *node, int scale);
89
90 /**
91  * Return the tarval of an immediate operation or NULL in case of SymConst
92  */
93 tarval *get_ia32_Immop_tarval(const ir_node *node);
94
95 /**
96  * Sets the attributes of an immediate operation to the specified tarval
97  */
98 void set_ia32_Immop_tarval(ir_node *node, tarval *tv);
99
100 /**
101  * Return the sc attribute.
102  */
103 char *get_ia32_sc(const ir_node *node);
104
105 /**
106  * Sets the sc attribute.
107  */
108 void set_ia32_sc(ir_node *node, char *sc);
109
110 /**
111  * Gets the string representation of the internal const (tv or symconst)
112  */
113 char *get_ia32_cnst(const ir_node *node);
114
115 /**
116  * Sets the uses_frame flag.
117  */
118 void set_ia32_use_frame(ir_node *node);
119
120 /**
121  * Clears the uses_frame flag.
122  */
123 void clear_ia32_use_frame(ir_node *node);
124
125 /**
126  * Gets the uses_frame flag.
127  */
128 int is_ia32_use_frame(const ir_node *node);
129
130 /**
131  * Sets node to commutative.
132  */
133 void set_ia32_commutative(ir_node *node);
134
135 /**
136  * Sets node to non-commutative.
137  */
138 void clear_ia32_commutative(ir_node *node);
139
140 /**
141  * Checks if node is commutative.
142  */
143 int is_ia32_commutative(const ir_node *node);
144
145 /**
146  * Gets the mode of the stored/loaded value (only set for Store/Load)
147  */
148 ir_mode *get_ia32_ls_mode(const ir_node *node);
149
150 /**
151  * Sets the mode of the stored/loaded value (only set for Store/Load)
152  */
153 void set_ia32_ls_mode(ir_node *node, ir_mode *mode);
154
155 /**
156  * Gets the frame entity assigned to this node;
157  */
158 entity *get_ia32_frame_ent(const ir_node *node);
159
160 /**
161  * Sets the frame entity for this node;
162  */
163 void set_ia32_frame_ent(ir_node *node, entity *ent);
164
165 /**
166  * Returns the argument register requirements of an ia32 node.
167  */
168 const ia32_register_req_t **get_ia32_in_req_all(const ir_node *node);
169
170 /**
171  * Sets the argument register requirements of an ia32 node.
172  */
173 void set_ia32_in_req_all(ir_node *node, const ia32_register_req_t **reqs);
174
175 /**
176  * Returns the result register requirements of an ia32 node.
177  */
178 const ia32_register_req_t **get_ia32_out_req_all(const ir_node *node);
179
180 /**
181  * Sets the result register requirements of an ia32 node.
182  */
183 void set_ia32_out_req_all(ir_node *node, const ia32_register_req_t **reqs);
184
185 /**
186  * Returns the argument register requirements of an ia32 node.
187  */
188 const ia32_register_req_t *get_ia32_in_req(const ir_node *node, int pos);
189
190 /**
191  * Returns the result register requirements of an ia32 node.
192  */
193 const ia32_register_req_t *get_ia32_out_req(const ir_node *node, int pos);
194
195 /**
196  * Sets the OUT register requirements at position pos.
197  */
198 void set_ia32_req_out(ir_node *node, const ia32_register_req_t *req, int pos);
199
200 /**
201  * Sets the IN register requirements at position pos.
202  */
203 void set_ia32_req_in(ir_node *node, const ia32_register_req_t *req, int pos);
204
205 /**
206  * Returns the register flag of an ia32 node.
207  */
208 arch_irn_flags_t get_ia32_flags(const ir_node *node);
209
210 /**
211  * Sets the register flag of an ia32 node.
212  */
213 void set_ia32_flags(ir_node *node, arch_irn_flags_t flags);
214
215 /**
216  * Returns the result register slots of an ia32 node.
217  */
218 const arch_register_t **get_ia32_slots(const ir_node *node);
219
220 /**
221  * Returns the name of the OUT register at position pos.
222  */
223 const char *get_ia32_out_reg_name(const ir_node *node, int pos);
224
225 /**
226  * Returns the index of the OUT register at position pos within its register class.
227  */
228 int get_ia32_out_regnr(const ir_node *node, int pos);
229
230 /**
231  * Returns the OUT register at position pos.
232  */
233 const arch_register_t *get_ia32_out_reg(const ir_node *node, int pos);
234
235 /**
236  * Sets the number of results.
237  */
238 void set_ia32_n_res(ir_node *node, int n_res);
239
240 /**
241  * Returns the number of results.
242  */
243 int get_ia32_n_res(const ir_node *node);
244
245 /**
246  * Returns the flavour of an ia32 node,
247  */
248 ia32_op_flavour_t get_ia32_flavour(const ir_node *node);
249
250 /**
251  * Sets the flavour of an ia32 node to flavour_Div/Mod/DivMod/Mul/Mulh.
252  */
253 void set_ia32_flavour(ir_node *node, ia32_op_flavour_t op_flav);
254
255 /**
256  * Returns the projnum code.
257  */
258 long get_ia32_pncode(const ir_node *node);
259
260 /**
261  * Sets the projnum code
262  */
263 void set_ia32_pncode(ir_node *node, long code);
264
265
266 /******************************************************************************************************
267  *                      _       _         _   _           __                  _   _
268  *                     (_)     | |       | | | |         / _|                | | (_)
269  *  ___ _ __   ___  ___ _  __ _| |   __ _| |_| |_ _ __  | |_ _   _ _ __   ___| |_ _  ___  _ __    ___
270  * / __| '_ \ / _ \/ __| |/ _` | |  / _` | __| __| '__| |  _| | | | '_ \ / __| __| |/ _ \| '_ \  / __|
271  * \__ \ |_) |  __/ (__| | (_| | | | (_| | |_| |_| |    | | | |_| | | | | (__| |_| | (_) | | | | \__ \
272  * |___/ .__/ \___|\___|_|\__,_|_|  \__,_|\__|\__|_|    |_|  \__,_|_| |_|\___|\__|_|\___/|_| |_| |___/
273  *     | |
274  *     |_|
275  ******************************************************************************************************/
276
277 /**
278  * Gets the type of an ia32_Const.
279  */
280 unsigned get_ia32_Const_type(const ir_node *node);
281
282 /**
283  * Sets the type of an ia32_Const.
284  */
285 void set_ia32_Const_type(ir_node *node, int type);
286
287 /**
288  * Copy the attributes from an ia32_Const to an Immop (Add_i, Sub_i, ...) node
289  */
290 void set_ia32_Immop_attr(ir_node *node, ir_node *cnst);
291
292 /**
293  * Copy the attributes from a Const to an ia32_Const
294  */
295 void set_ia32_Const_attr(ir_node *ia32_cnst, ir_node *cnst);
296
297 /**
298  * Sets the AddrMode attribute
299  * @param direction The "direction" of AM ('S' source or 'D' destination)
300  */
301 void set_ia32_AddrMode(ir_node *node, char direction);
302
303 /**
304  * Returns whether or not the node is an AddrModeS node.
305  */
306 int is_ia32_AddrModeS(const ir_node *node);
307
308 /**
309  * Returns whether or not the node is an AddrModeD node.
310  */
311 int is_ia32_AddrModeD(const ir_node *node);
312
313 /**
314  * Checks if node is a Load or fLoad.
315  */
316 int is_ia32_Ld(const ir_node *node);
317
318 /**
319  * Checks if node is a Store or fStore.
320  */
321 int is_ia32_St(const ir_node *node);
322
323 /**
324  * Checks if node is a Const or fConst.
325  */
326 int is_ia32_Cnst(const ir_node *node);
327
328 /**
329  * Allocates num register slots for node.
330  */
331 void alloc_ia32_reg_slots(ir_node *node, int num);
332
333 /**
334  * Initializes the nodes attributes.
335  */
336 void init_ia32_attributes(ir_node *node, arch_irn_flags_t flags, const ia32_register_req_t **in_reqs, \
337         const ia32_register_req_t **out_reqs, int n_res);
338
339 /* Include the generated headers */
340 #include "gen_ia32_new_nodes.h"
341
342 #endif /* _IA32_NEW_NODES_H_ */