added new attributes for abstract machine
[libfirm] / ir / be / ia32 / ia32_new_nodes.h
1 /**
2  * Function prototypes for the assembler ir node constructors.
3  * @author Christian Wuerdig
4  * $Id$
5  */
6
7 #ifndef _IA32_NEW_NODES_H_
8 #define _IA32_NEW_NODES_H_
9
10 #include "firm_config.h"
11 #include "ia32_nodes_attr.h"
12
13 /***************************************************************************************************
14  *        _   _                   _       __        _                    _   _               _
15  *       | | | |                 | |     / /       | |                  | | | |             | |
16  *   __ _| |_| |_ _ __   ___  ___| |_   / /_ _  ___| |_   _ __ ___   ___| |_| |__   ___   __| |___
17  *  / _` | __| __| '__| / __|/ _ \ __| / / _` |/ _ \ __| | '_ ` _ \ / _ \ __| '_ \ / _ \ / _` / __|
18  * | (_| | |_| |_| |    \__ \  __/ |_ / / (_| |  __/ |_  | | | | | |  __/ |_| | | | (_) | (_| \__ \
19  *  \__,_|\__|\__|_|    |___/\___|\__/_/ \__, |\___|\__| |_| |_| |_|\___|\__|_| |_|\___/ \__,_|___/
20  *                                        __/ |
21  *                                       |___/
22  ***************************************************************************************************/
23
24 /**
25  * returns true if a node has x87 registers
26  */
27 int ia32_has_x87_register(const ir_node *n);
28
29 /**
30  * Returns the attributes of an ia32 node.
31  */
32 ia32_attr_t *get_ia32_attr(const ir_node *node);
33
34 /**
35  * Gets the type of an ia32 node.
36  */
37 ia32_op_type_t get_ia32_op_type(const ir_node *node);
38
39 /**
40  * Sets the type of an ia32 node.
41  */
42 void set_ia32_op_type(ir_node *node, ia32_op_type_t tp);
43
44 /**
45  * Gets the immediate op type of an ia32 node.
46  */
47 ia32_immop_type_t get_ia32_immop_type(const ir_node *node);
48
49 /**
50  * Sets the immediate op type of an ia32 node.
51  */
52 void set_ia32_immop_type(ir_node *node, ia32_immop_type_t tp);
53
54 /**
55  * Gets the supported addrmode of an ia32 node
56  */
57 ia32_am_type_t get_ia32_am_support(const ir_node *node);
58
59 /**
60  * Sets the supported addrmode of an ia32 node
61  */
62 void set_ia32_am_support(ir_node *node, ia32_am_type_t am_tp);
63
64 /**
65  * Gets the addrmode flavour of an ia32 node
66  */
67 ia32_am_flavour_t get_ia32_am_flavour(const ir_node *node);
68
69 /**
70  * Sets the addrmode flavour of an ia32 node
71  */
72 void set_ia32_am_flavour(ir_node *node, ia32_am_flavour_t am_flavour);
73
74 /**
75  * Gets the joined addrmode offset.
76  */
77 char *get_ia32_am_offs(const ir_node *node);
78
79 /**
80  * Gets the addressmode offset as long.
81  */
82 int get_ia32_am_offs_int(const ir_node *node);
83
84 /**
85  * Adds an offset for addrmode.
86  */
87 void add_ia32_am_offs(ir_node *node, const char *offset);
88
89 void add_ia32_am_offs_int(ir_node *node, int offset);
90
91 /**
92  * Subs an offset for addrmode.
93  */
94 void sub_ia32_am_offs(ir_node *node, const char *offset);
95
96 /**
97  * Returns the symconst ident associated to addrmode.
98  */
99 ident *get_ia32_am_sc(const ir_node *node);
100
101 /**
102  * Sets the symconst ident associated to addrmode.
103  */
104 void set_ia32_am_sc(ir_node *node, ident *sc);
105
106 /**
107  * Sets the sign bit for address mode symconst.
108  */
109 void set_ia32_am_sc_sign(ir_node *node);
110
111 /**
112  * Clears the sign bit for address mode symconst.
113  */
114 void clear_ia32_am_sc_sign(ir_node *node);
115
116 /**
117  * Returns the sign bit for address mode symconst.
118  */
119 int is_ia32_am_sc_sign(const ir_node *node);
120
121 /**
122  * Gets the addr mode const.
123  */
124 int get_ia32_am_scale(const ir_node *node);
125
126 /**
127  * Sets the const for addr mode.
128  */
129 void set_ia32_am_scale(ir_node *node, int scale);
130
131 /**
132  * Return the tarval of an immediate operation or NULL in case of SymConst
133  */
134 tarval *get_ia32_Immop_tarval(const ir_node *node);
135
136 /**
137  * Sets the attributes of an immediate operation to the specified tarval
138  */
139 void set_ia32_Immop_tarval(ir_node *node, tarval *tv);
140
141 /**
142  * Gets the string representation of the internal const (tv or symconst)
143  */
144 const char *get_ia32_cnst(const ir_node *node);
145
146 /**
147  * Sets the string representation of the internal const.
148  */
149 void set_ia32_cnst(ir_node *node, const char *cnst);
150
151 /**
152  * Gets the ident representation of the internal const (tv or symconst)
153  */
154 ident *get_ia32_id_cnst(const ir_node *node);
155
156 /**
157  * Sets the ident representation of the internal const.
158  */
159 void set_ia32_id_cnst(ir_node *node, ident *cnst);
160
161 /**
162  * Sets the uses_frame flag.
163  */
164 void set_ia32_use_frame(ir_node *node);
165
166 /**
167  * Clears the uses_frame flag.
168  */
169 void clear_ia32_use_frame(ir_node *node);
170
171 /**
172  * Gets the uses_frame flag.
173  */
174 int is_ia32_use_frame(const ir_node *node);
175
176 /**
177  * Sets node to commutative.
178  */
179 void set_ia32_commutative(ir_node *node);
180
181 /**
182  * Sets node to non-commutative.
183  */
184 void clear_ia32_commutative(ir_node *node);
185
186 /**
187  * Checks if node is commutative.
188  */
189 int is_ia32_commutative(const ir_node *node);
190
191 /**
192  * Sets node emit_cl.
193  */
194 void set_ia32_emit_cl(ir_node *node);
195
196 /**
197  * Clears node emit_cl.
198  */
199 void clear_ia32_emit_cl(ir_node *node);
200
201 /**
202  * Checks if node is commutative.
203  */
204 int is_ia32_emit_cl(const ir_node *node);
205
206 /**
207  * Sets node got_lea.
208  */
209 void set_ia32_got_lea(ir_node *node);
210
211 /**
212  * Clears node got_lea.
213  */
214 void clear_ia32_got_lea(ir_node *node);
215
216 /**
217  * Checks if node got lea.
218  */
219 int is_ia32_got_lea(const ir_node *node);
220
221 /**
222  * Sets node got_reload.
223  */
224 void set_ia32_got_reload(ir_node *node);
225
226 /**
227  * Clears node got_reload.
228  */
229 void clear_ia32_got_reload(ir_node *node);
230
231 /**
232  * Checks if node got reload.
233  */
234 int is_ia32_got_reload(const ir_node *node);
235
236 /**
237  * Gets the mode of the stored/loaded value (only set for Store/Load)
238  */
239 ir_mode *get_ia32_ls_mode(const ir_node *node);
240
241 /**
242  * Sets the mode of the stored/loaded value (only set for Store/Load)
243  */
244 void set_ia32_ls_mode(ir_node *node, ir_mode *mode);
245
246 /**
247  * Gets the mode of the result.
248  */
249 ir_mode *get_ia32_res_mode(const ir_node *node);
250
251 /**
252  * Sets the mode of the result.
253  */
254 void set_ia32_res_mode(ir_node *node, ir_mode *mode);
255
256 /**
257  * Gets the source mode of conversion.
258  */
259 ir_mode *get_ia32_src_mode(const ir_node *node);
260
261 /**
262  * Sets the source mode of conversion.
263  */
264 void set_ia32_src_mode(ir_node *node, ir_mode *mode);
265
266 /**
267  * Gets the target mode of conversion.
268  */
269 ir_mode *get_ia32_tgt_mode(const ir_node *node);
270
271 /**
272  * Sets the target mode of conversion.
273  */
274 void set_ia32_tgt_mode(ir_node *node, ir_mode *mode);
275
276 /**
277  * Gets the frame entity assigned to this node;
278  */
279 entity *get_ia32_frame_ent(const ir_node *node);
280
281 /**
282  * Sets the frame entity for this node;
283  */
284 void set_ia32_frame_ent(ir_node *node, entity *ent);
285
286 /**
287  * Returns the argument register requirements of an ia32 node.
288  */
289 const ia32_register_req_t **get_ia32_in_req_all(const ir_node *node);
290
291 /**
292  * Sets the argument register requirements of an ia32 node.
293  */
294 void set_ia32_in_req_all(ir_node *node, const ia32_register_req_t **reqs);
295
296 /**
297  * Returns the result register requirements of an ia32 node.
298  */
299 const ia32_register_req_t **get_ia32_out_req_all(const ir_node *node);
300
301 /**
302  * Sets the result register requirements of an ia32 node.
303  */
304 void set_ia32_out_req_all(ir_node *node, const ia32_register_req_t **reqs);
305
306 /**
307  * Returns the argument register requirements of an ia32 node.
308  */
309 const ia32_register_req_t *get_ia32_in_req(const ir_node *node, int pos);
310
311 /**
312  * Returns the result register requirements of an ia32 node.
313  */
314 const ia32_register_req_t *get_ia32_out_req(const ir_node *node, int pos);
315
316 /**
317  * Sets the OUT register requirements at position pos.
318  */
319 void set_ia32_req_out(ir_node *node, const ia32_register_req_t *req, int pos);
320
321 /**
322  * Sets the IN register requirements at position pos.
323  */
324 void set_ia32_req_in(ir_node *node, const ia32_register_req_t *req, int pos);
325
326 /**
327  * Returns the register flag of an ia32 node.
328  */
329 arch_irn_flags_t get_ia32_flags(const ir_node *node);
330
331 /**
332  * Sets the register flag of an ia32 node.
333  */
334 void set_ia32_flags(ir_node *node, arch_irn_flags_t flags);
335
336 /**
337  * Returns the result register slots of an ia32 node.
338  */
339 const arch_register_t **get_ia32_slots(const ir_node *node);
340
341 /**
342  * Returns the name of the OUT register at position pos.
343  */
344 const char *get_ia32_out_reg_name(const ir_node *node, int pos);
345
346 /**
347  * Returns the index of the OUT register at position pos within its register class.
348  */
349 int get_ia32_out_regnr(const ir_node *node, int pos);
350
351 /**
352  * Returns the OUT register at position pos.
353  */
354 const arch_register_t *get_ia32_out_reg(const ir_node *node, int pos);
355
356 /**
357  * Sets the number of results.
358  */
359 void set_ia32_n_res(ir_node *node, int n_res);
360
361 /**
362  * Returns the number of results.
363  */
364 int get_ia32_n_res(const ir_node *node);
365
366 /**
367  * Returns the flavour of an ia32 node,
368  */
369 ia32_op_flavour_t get_ia32_flavour(const ir_node *node);
370
371 /**
372  * Sets the flavour of an ia32 node to flavour_Div/Mod/DivMod/Mul/Mulh.
373  */
374 void set_ia32_flavour(ir_node *node, ia32_op_flavour_t op_flav);
375
376 /**
377  * Returns the projnum code.
378  */
379 long get_ia32_pncode(const ir_node *node);
380
381 /**
382  * Sets the projnum code
383  */
384 void set_ia32_pncode(ir_node *node, long code);
385
386 /**
387  * Gets the instruction latency.
388  */
389 unsigned get_ia32_latency(const ir_node *node);
390
391 /**
392  * Sets the instruction latency.
393  */
394 void set_ia32_latency(ir_node *node, unsigned latency);
395
396
397 /**
398  * Sets the flags for the n'th out.
399  */
400 void set_ia32_out_flags(ir_node *node, arch_irn_flags_t flags, int pos);
401
402 /**
403  * Gets the flags for the n'th out.
404  */
405 arch_irn_flags_t get_ia32_out_flags(const ir_node *node, int pos);
406
407 /**
408  * Get the list of available execution units.
409  */
410 const be_execution_unit_t ***get_ia32_exec_units(const ir_node *node);
411
412 #ifndef NDEBUG
413
414 /**
415  * Returns the name of the original ir node.
416  */
417 const char *get_ia32_orig_node(const ir_node *node);
418
419 /**
420  * Sets the name of the original ir node.
421  */
422 void set_ia32_orig_node(ir_node *node, const char *name);
423
424 #endif /* NDEBUG */
425
426 /******************************************************************************************************
427  *                      _       _         _   _           __                  _   _
428  *                     (_)     | |       | | | |         / _|                | | (_)
429  *  ___ _ __   ___  ___ _  __ _| |   __ _| |_| |_ _ __  | |_ _   _ _ __   ___| |_ _  ___  _ __    ___
430  * / __| '_ \ / _ \/ __| |/ _` | |  / _` | __| __| '__| |  _| | | | '_ \ / __| __| |/ _ \| '_ \  / __|
431  * \__ \ |_) |  __/ (__| | (_| | | | (_| | |_| |_| |    | | | |_| | | | | (__| |_| | (_) | | | | \__ \
432  * |___/ .__/ \___|\___|_|\__,_|_|  \__,_|\__|\__|_|    |_|  \__,_|_| |_|\___|\__|_|\___/|_| |_| |___/
433  *     | |
434  *     |_|
435  ******************************************************************************************************/
436
437 /**
438  * Gets the type of an ia32_Const.
439  */
440 unsigned get_ia32_Const_type(const ir_node *node);
441
442 /**
443  * Sets the type of an ia32_Const.
444  */
445 void set_ia32_Const_type(ir_node *node, int type);
446
447 /**
448  * Copy the attributes from an ia32_Const to an Immop (Add_i, Sub_i, ...) node
449  */
450 void set_ia32_Immop_attr(ir_node *node, ir_node *cnst);
451
452 /**
453  * Copy the attributes from Immop to an Immop
454  */
455 void copy_ia32_Immop_attr(ir_node *node, ir_node *src);
456
457 /**
458  * Copy the attributes from a Const to an ia32_Const
459  */
460 void set_ia32_Const_attr(ir_node *ia32_cnst, ir_node *cnst);
461
462 /**
463  * Sets the AddrMode attribute
464  * @param direction The "direction" of AM ('S' source or 'D' destination)
465  */
466 void set_ia32_AddrMode(ir_node *node, char direction);
467
468 /**
469  * Returns whether or not the node is an immediate operation with Const.
470  */
471 int is_ia32_ImmConst(const ir_node *node);
472
473 /**
474  * Returns whether or not the node is an immediate operation with SymConst.
475  */
476 int is_ia32_ImmSymConst(const ir_node *node);
477
478 /**
479  * Returns whether or not the node is an AddrModeS node.
480  */
481 int is_ia32_AddrModeS(const ir_node *node);
482
483 /**
484  * Returns whether or not the node is an AddrModeD node.
485  */
486 int is_ia32_AddrModeD(const ir_node *node);
487
488 /**
489  * Checks if node is a Load or fLoad.
490  */
491 int is_ia32_Ld(const ir_node *node);
492
493 /**
494  * Checks if node is a Store or fStore.
495  */
496 int is_ia32_St(const ir_node *node);
497
498 /**
499  * Checks if node is a Const or fConst.
500  */
501 int is_ia32_Cnst(const ir_node *node);
502
503 /**
504  * Initializes the nodes attributes.
505  */
506 void init_ia32_attributes(ir_node *node, arch_irn_flags_t flags, const ia32_register_req_t **in_reqs, \
507         const ia32_register_req_t **out_reqs, const be_execution_unit_t ***execution_units, int n_res, unsigned latency);
508
509 /* Include the generated headers */
510 #include "gen_ia32_new_nodes.h"
511
512 #endif /* _IA32_NEW_NODES_H_ */