experiment with new emitter style, change assembler syntax of ia32 backend to AT&T
[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 addressmode offset as long.
76  */
77 int get_ia32_am_offs_int(const ir_node *node);
78
79 /**
80  * Sets the addressmode offset
81  */
82 void set_ia32_am_offs_int(ir_node *node, int offset);
83
84 void add_ia32_am_offs_int(ir_node *node, int offset);
85
86 /**
87  * Returns the symconst ident associated to addrmode.
88  */
89 ident *get_ia32_am_sc(const ir_node *node);
90
91 /**
92  * Sets the symconst ident associated to addrmode.
93  */
94 void set_ia32_am_sc(ir_node *node, ident *sc);
95
96 /**
97  * Sets the sign bit for address mode symconst.
98  */
99 void set_ia32_am_sc_sign(ir_node *node);
100
101 /**
102  * Clears the sign bit for address mode symconst.
103  */
104 void clear_ia32_am_sc_sign(ir_node *node);
105
106 /**
107  * Returns the sign bit for address mode symconst.
108  */
109 int is_ia32_am_sc_sign(const ir_node *node);
110
111 /**
112  * Gets the addr mode const.
113  */
114 int get_ia32_am_scale(const ir_node *node);
115
116 /**
117  * Sets the const for addr mode.
118  */
119 void set_ia32_am_scale(ir_node *node, int scale);
120
121 /**
122  * Return the tarval of an immediate operation or NULL if none set
123  */
124 tarval *get_ia32_Immop_tarval(const ir_node *node);
125
126 /**
127  * Return the symconst ident of an immediate operation or NULL if none set
128  */
129 ident* get_ia32_Immop_symconst(const ir_node *node);
130
131 /**
132  * Sets the attributes of an immediate operation to the specified tarval
133  */
134 void set_ia32_Immop_tarval(ir_node *node, tarval *tv);
135
136 /**
137  * Sets the attributes of an immediate operation to the specified SymConst
138  */
139 void set_ia32_Immop_symconst(ir_node *node, ident *ident);
140
141 /**
142  * Sets the uses_frame flag.
143  */
144 void set_ia32_use_frame(ir_node *node);
145
146 /**
147  * Clears the uses_frame flag.
148  */
149 void clear_ia32_use_frame(ir_node *node);
150
151 /**
152  * Gets the uses_frame flag.
153  */
154 int is_ia32_use_frame(const ir_node *node);
155
156 /**
157  * Sets node to commutative.
158  */
159 void set_ia32_commutative(ir_node *node);
160
161 /**
162  * Sets node to non-commutative.
163  */
164 void clear_ia32_commutative(ir_node *node);
165
166 /**
167  * Checks if node is commutative.
168  */
169 int is_ia32_commutative(const ir_node *node);
170
171 /**
172  * Sets node emit_cl.
173  */
174 void set_ia32_emit_cl(ir_node *node);
175
176 /**
177  * Clears node emit_cl.
178  */
179 void clear_ia32_emit_cl(ir_node *node);
180
181 /**
182  * Checks if node is commutative.
183  */
184 int is_ia32_emit_cl(const ir_node *node);
185
186 /**
187  * Sets node got_lea.
188  */
189 void set_ia32_got_lea(ir_node *node);
190
191 /**
192  * Clears node got_lea.
193  */
194 void clear_ia32_got_lea(ir_node *node);
195
196 /**
197  * Checks if node got lea.
198  */
199 int is_ia32_got_lea(const ir_node *node);
200
201 /**
202  * Sets node got_reload.
203  */
204 void set_ia32_got_reload(ir_node *node);
205
206 /**
207  * Clears node got_reload.
208  */
209 void clear_ia32_got_reload(ir_node *node);
210
211 /**
212  * Checks if node got reload.
213  */
214 int is_ia32_got_reload(const ir_node *node);
215
216 /**
217  * Gets the mode of the stored/loaded value (only set for Store/Load)
218  */
219 ir_mode *get_ia32_ls_mode(const ir_node *node);
220
221 /**
222  * Sets the mode of the stored/loaded value (only set for Store/Load)
223  */
224 void set_ia32_ls_mode(ir_node *node, ir_mode *mode);
225
226 /**
227  * Gets the frame entity assigned to this node;
228  */
229 ir_entity *get_ia32_frame_ent(const ir_node *node);
230
231 /**
232  * Sets the frame entity for this node;
233  */
234 void set_ia32_frame_ent(ir_node *node, ir_entity *ent);
235
236 /**
237  * Returns the argument register requirements of an ia32 node.
238  */
239 const ia32_register_req_t **get_ia32_in_req_all(const ir_node *node);
240
241 /**
242  * Sets the argument register requirements of an ia32 node.
243  */
244 void set_ia32_in_req_all(ir_node *node, const ia32_register_req_t **reqs);
245
246 /**
247  * Returns the result register requirements of an ia32 node.
248  */
249 const ia32_register_req_t **get_ia32_out_req_all(const ir_node *node);
250
251 /**
252  * Sets the result register requirements of an ia32 node.
253  */
254 void set_ia32_out_req_all(ir_node *node, const ia32_register_req_t **reqs);
255
256 /**
257  * Returns the argument register requirements of an ia32 node.
258  */
259 const ia32_register_req_t *get_ia32_in_req(const ir_node *node, int pos);
260
261 /**
262  * Returns the result register requirements of an ia32 node.
263  */
264 const ia32_register_req_t *get_ia32_out_req(const ir_node *node, int pos);
265
266 /**
267  * Sets the OUT register requirements at position pos.
268  */
269 void set_ia32_req_out(ir_node *node, const ia32_register_req_t *req, int pos);
270
271 /**
272  * Sets the IN register requirements at position pos.
273  */
274 void set_ia32_req_in(ir_node *node, const ia32_register_req_t *req, int pos);
275
276 /**
277  * Returns the register flag of an ia32 node.
278  */
279 arch_irn_flags_t get_ia32_flags(const ir_node *node);
280
281 /**
282  * Sets the register flag of an ia32 node.
283  */
284 void set_ia32_flags(ir_node *node, arch_irn_flags_t flags);
285
286 /**
287  * Returns the result register slots of an ia32 node.
288  */
289 const arch_register_t **get_ia32_slots(const ir_node *node);
290
291 /**
292  * Returns the name of the OUT register at position pos.
293  */
294 const char *get_ia32_out_reg_name(const ir_node *node, int pos);
295
296 /**
297  * Returns the index of the OUT register at position pos within its register class.
298  */
299 int get_ia32_out_regnr(const ir_node *node, int pos);
300
301 /**
302  * Returns the OUT register at position pos.
303  */
304 const arch_register_t *get_ia32_out_reg(const ir_node *node, int pos);
305
306 /**
307  * Sets the number of results.
308  */
309 void set_ia32_n_res(ir_node *node, int n_res);
310
311 /**
312  * Returns the number of results.
313  */
314 int get_ia32_n_res(const ir_node *node);
315
316 /**
317  * Returns the flavour of an ia32 node,
318  */
319 ia32_op_flavour_t get_ia32_flavour(const ir_node *node);
320
321 /**
322  * Sets the flavour of an ia32 node to flavour_Div/Mod/DivMod/Mul/Mulh.
323  */
324 void set_ia32_flavour(ir_node *node, ia32_op_flavour_t op_flav);
325
326 /**
327  * Returns the projnum code.
328  */
329 pn_Cmp get_ia32_pncode(const ir_node *node);
330
331 /**
332  * Sets the projnum code
333  */
334 void set_ia32_pncode(ir_node *node, pn_Cmp code);
335
336 /**
337  * Gets the instruction latency.
338  */
339 unsigned get_ia32_latency(const ir_node *node);
340
341 /**
342  * Sets the instruction latency.
343  */
344 void set_ia32_latency(ir_node *node, unsigned latency);
345
346
347 /**
348  * Sets the flags for the n'th out.
349  */
350 void set_ia32_out_flags(ir_node *node, arch_irn_flags_t flags, int pos);
351
352 /**
353  * Gets the flags for the n'th out.
354  */
355 arch_irn_flags_t get_ia32_out_flags(const ir_node *node, int pos);
356
357 /**
358  * Get the list of available execution units.
359  */
360 const be_execution_unit_t ***get_ia32_exec_units(const ir_node *node);
361
362 #ifndef NDEBUG
363
364 /**
365  * Returns the name of the original ir node.
366  */
367 const char *get_ia32_orig_node(const ir_node *node);
368
369 /**
370  * Sets the name of the original ir node.
371  */
372 void set_ia32_orig_node(ir_node *node, const char *name);
373
374 #endif /* NDEBUG */
375
376 /******************************************************************************************************
377  *                      _       _         _   _           __                  _   _
378  *                     (_)     | |       | | | |         / _|                | | (_)
379  *  ___ _ __   ___  ___ _  __ _| |   __ _| |_| |_ _ __  | |_ _   _ _ __   ___| |_ _  ___  _ __    ___
380  * / __| '_ \ / _ \/ __| |/ _` | |  / _` | __| __| '__| |  _| | | | '_ \ / __| __| |/ _ \| '_ \  / __|
381  * \__ \ |_) |  __/ (__| | (_| | | | (_| | |_| |_| |    | | | |_| | | | | (__| |_| | (_) | | | | \__ \
382  * |___/ .__/ \___|\___|_|\__,_|_|  \__,_|\__|\__|_|    |_|  \__,_|_| |_|\___|\__|_|\___/|_| |_| |___/
383  *     | |
384  *     |_|
385  ******************************************************************************************************/
386
387 /**
388  * Returns the ident of an entity
389  * @param ent The entity
390  * @return The ident of the entity
391  */
392 ident *ia32_get_ent_ident(ir_entity *ent);
393
394 /**
395  * Copy the attributes from Immop to an Immop
396  */
397 void copy_ia32_Immop_attr(ir_node *node, ir_node *src);
398
399 /**
400  * Returns the proj of the result value for nodes that have the usual
401  * (res, Mem) result tuple
402  */
403 ir_node *get_ia32_result_proj(const ir_node *node);
404
405 /**
406  * Copy the attributes from a Const to an ia32_Const
407  */
408 void set_ia32_Const_attr(ir_node *ia32_cnst, ir_node *cnst);
409
410 void set_ia32_Const_tarval(ir_node *node, tarval *tv);
411
412 /**
413  * Sets the AddrMode attribute
414  * @param direction The "direction" of AM ('S' source or 'D' destination)
415  */
416 void set_ia32_AddrMode(ir_node *node, char direction);
417
418 /**
419  * Returns whether or not the node is an immediate operation with Const.
420  */
421 int is_ia32_ImmConst(const ir_node *node);
422
423 /**
424  * Returns whether or not the node is an immediate operation with SymConst.
425  */
426 int is_ia32_ImmSymConst(const ir_node *node);
427
428 /**
429  * Returns whether or not the node is an AddrModeS node.
430  */
431 int is_ia32_AddrModeS(const ir_node *node);
432
433 /**
434  * Returns whether or not the node is an AddrModeD node.
435  */
436 int is_ia32_AddrModeD(const ir_node *node);
437
438 /**
439  * Checks if node is a Load or fLoad.
440  */
441 int is_ia32_Ld(const ir_node *node);
442
443 /**
444  * Checks if node is a Store or fStore.
445  */
446 int is_ia32_St(const ir_node *node);
447
448 /**
449  * Checks if node is a Const or fConst.
450  */
451 int is_ia32_Cnst(const ir_node *node);
452
453 /**
454  * Initializes the nodes attributes.
455  */
456 void init_ia32_attributes(ir_node *node, arch_irn_flags_t flags, const ia32_register_req_t **in_reqs, \
457         const ia32_register_req_t **out_reqs, const be_execution_unit_t ***execution_units, int n_res, unsigned latency);
458
459 /**
460  * Registers the ia32_copy_attr function for all ia32 opcodes.
461  */
462 void ia32_register_copy_attr_func(void);
463
464 /* Include the generated headers */
465 #include "gen_ia32_new_nodes.h"
466
467 #endif /* _IA32_NEW_NODES_H_ */