added call emit
[libfirm] / ir / be / ia32 / ia32_nodes_attr.h
1 #ifndef _IA32_NODES_ATTR_H_
2 #define _IA32_NODES_ATTR_H_
3
4 #include "firm_types.h"
5 #include "../bearch.h"
6
7 typedef enum { flavour_Div = 1, flavour_Mod, flavour_DivMod, flavour_Mul, flavour_Mulh } op_flavour_t;
8 typedef enum { pn_EAX, pn_EDX } pn_ia32_Register;
9 typedef enum { asmop_Normal, asmop_Const, asmop_SymConst, asmop_AddrMode } asmop_type_t;
10 typedef enum {
11         am_Reg = 1,          /**<<  (%reg)              */
12         am_OffsReg,          /**<< o(%reg)              */
13         am_RegReg,           /**<<  (%reg, %reg)        */
14         am_RegConst,         /**<<  (    , %reg, const) */
15         am_OffsRegConst,     /**<< o(    , %reg, const) */
16         am_OffsRegReg,       /**<< o(%reg, %reg)        */
17         am_RegRegConst,      /**<<  (%reg, %reg, const) */
18         am_OffsRegRegConst   /**<< o(%reg, %reg, const) */
19 } addrmode_type_t;
20
21 typedef struct _ia32_register_req_t {
22         const arch_register_req_t req;
23         int pos;   /**<< in case of "should be same/different" we need to remember the pos to get the irn */
24 } ia32_register_req_t;
25
26 typedef struct _ia32_asmop_attr {
27         asmop_type_t    tp;      /**<< ia32 node type */
28         addrmode_type_t am_tp;   /**<< addr mode type */
29
30         tarval  *am_offs;  /**<< offset for AddrMode */
31         tarval  *am_const; /**<< shift const for AddrMode */
32
33         tarval  *tv;       /**<< tarval for immediate operations */
34         ir_node *old_ir;   /**<< old ir node to avoid duplicating information (symconst in case of asmop_SymConst) */
35
36         op_flavour_t     op_flav;   /**<< flavour of an op (flavour_Div/Mod/DivMod/Mul/Mulh) */
37         long             pn_code;   /**<< projnum "types" (e.g. indicate compare operators and argument numbers) */
38         long             n_res;     /**<< number of results */
39         arch_irn_flags_t flags;     /**<< indicating if spillable and/or rematerializeable */
40
41         const ia32_register_req_t **in_req;  /**<< register requirements for arguments */
42         const ia32_register_req_t **out_req; /**<< register requirements for results */
43
44         const arch_register_t **slots;          /**<< register slots for assigned registers */
45 } asmop_attr;
46
47 #endif /* _IA32_NODES_ATTR_H_ */