-typedef enum {
- ia32_am_N = 0,
- ia32_am_O = ia32_O,
- ia32_am_B = ia32_B,
- ia32_am_I = ia32_I,
- ia32_am_IS = ia32_I | ia32_S,
- ia32_am_OB = ia32_O | ia32_B,
- ia32_am_OI = ia32_O | ia32_I,
- ia32_am_OIS = ia32_O | ia32_I | ia32_S,
- ia32_am_OBIS = ia32_O | ia32_B | ia32_I | ia32_S
-} ia32_am_flavour_t;
-
-typedef struct _ia32_register_req_t {
- const arch_register_req_t req;
- int same_pos; /**<< in case of "should be same" we need to remember the pos to get the irn */
- int different_pos; /**<< in case of "should be different" we need to remember the pos to get the irn */
-} ia32_register_req_t;
-
-typedef struct _ia32_attr_t {
- ia32_op_type_t tp; /**<< ia32 node type */
- ia32_am_type_t am_support; /**<< indicates addrmode type supported by this node */
- ia32_am_flavour_t am_flavour; /**<< the concrete addrmode characteristics */
-
- struct obstack *am_offs; /**<< offsets for AddrMode */
- char offs_sign; /**<< the sign of the first offset */
- int am_scale; /**<< addrmode scale for index register */
-
- tarval *tv; /**<< tarval for immediate operations */
- char *sc; /**<< symconst name */
- char *cnst; /**<< points to the string representation of the constant value (either tv or sc) */
-
- char use_frame; /**<< indicates whether the operation uses the frame pointer or not */
-
- ir_mode *ls_mode; /**<< the mode of the stored/loaded value */
-
- ia32_op_flavour_t op_flav; /**<< flavour of an op (flavour_Div/Mod/DivMod/Mul/Mulh) */
- long pn_code; /**<< projnum "types" (e.g. indicate compare operators and argument numbers) */
- long n_res; /**<< number of results */
- arch_irn_flags_t flags; /**<< indicating if spillable and/or rematerializeable */
-
- const ia32_register_req_t **in_req; /**<< register requirements for arguments */
- const ia32_register_req_t **out_req; /**<< register requirements for results */
-
- const arch_register_t **slots; /**<< register slots for assigned registers */
-} ia32_attr_t;
-
-#endif /* _IA32_NODES_ATTR_H_ */
+/**
+ * The attributes for a Call node.
+ */
+typedef struct ia32_call_attr_t ia32_call_attr_t;
+struct ia32_call_attr_t {
+ ia32_attr_t attr; /**< generic attribute */
+ unsigned pop; /**< number of bytes that get popped by the callee */
+ ir_type *call_tp; /**< The call type, copied from the original Call node. */
+};
+
+/**
+ * The attributes for nodes with condition code.
+ */
+typedef struct ia32_condcode_attr_t ia32_condcode_attr_t;
+struct ia32_condcode_attr_t {
+ ia32_attr_t attr; /**< generic attribute */
+ ia32_condition_code_t condition_code; /**< condition code*/
+};
+
+/**
+ * The attributes for Switches
+ */
+typedef struct ia32_switch_attr_t ia32_switch_attr_t;
+struct ia32_switch_attr_t {
+ ia32_attr_t attr; /**< generic attribute */
+ long default_pn;
+};
+
+/**
+ * The attributes for CopyB code.
+ */
+typedef struct ia32_copyb_attr_t ia32_copyb_attr_t;
+struct ia32_copyb_attr_t {
+ ia32_attr_t attr; /**< generic attribute */
+ unsigned size; /**< size of copied block */
+};
+
+/**
+ * The attributes for immediates.
+ */
+typedef struct ia32_immediate_attr_t ia32_immediate_attr_t;
+struct ia32_immediate_attr_t {
+ ia32_attr_t attr; /**< generic attribute */
+ ir_entity *symconst; /**< An entity if any. */
+ long offset; /**< An offset if any. */
+ unsigned sc_sign : 1; /**< The sign bit of the symconst. */
+ unsigned no_pic_adjust : 1; /**< constant can be relative to EIP */
+};
+
+/**
+ * The attributes for x87 nodes.
+ */
+typedef struct ia32_x87_attr_t ia32_x87_attr_t;
+struct ia32_x87_attr_t {
+ ia32_attr_t attr; /**< the generic attribute */
+ const arch_register_t *x87[3]; /**< register slots for x87 register */
+};
+
+typedef struct ia32_asm_reg_t ia32_asm_reg_t;
+struct ia32_asm_reg_t {
+ unsigned use_input : 1; /* use input or output pos */
+ unsigned valid : 1;
+ unsigned memory : 1;
+ unsigned dummy_fill : 13;
+ unsigned inout_pos : 16; /* in/out pos where the
+ register is assigned */
+ const ir_mode *mode;
+};
+
+/**
+ * The attributes for ASM nodes.
+ */
+typedef struct ia32_asm_attr_t ia32_asm_attr_t;
+struct ia32_asm_attr_t {
+ ia32_x87_attr_t x87_attr;
+ ident *asm_text;
+ const ia32_asm_reg_t *register_map;
+};
+
+/**
+ * The attributes for the ClimbFrame node.
+ */
+typedef struct ia32_climbframe_attr_t ia32_climbframe_attr_t;
+struct ia32_climbframe_attr_t {
+ ia32_attr_t attr; /**< generic attribute */
+ unsigned count; /**< number of frames to climb up */
+};
+
+/* the following union is necessary to indicate to the compiler that we might want to cast
+ * the structs (we use them to simulate OO-inheritance) */
+union allow_casts_attr_t_ {
+ ia32_attr_t attr;
+ ia32_call_attr_t call_attr;
+ ia32_condcode_attr_t cc_attr;
+ ia32_copyb_attr_t cpy_attr;
+ ia32_x87_attr_t x87_attr;
+ ia32_asm_attr_t asm_attr;
+ ia32_immediate_attr_t immediate_attr;
+ ia32_climbframe_attr_t climbframe_attr;
+ ia32_switch_attr_t switch_attr;
+};
+
+#ifndef NDEBUG
+#define CAST_IA32_ATTR(type,ptr) (assert( ((const ia32_attr_t*)(ptr))->attr_type & IA32_ATTR_ ## type ), (type*) (ptr))
+#define CONST_CAST_IA32_ATTR(type,ptr) (assert( ((const ia32_attr_t*)(ptr))->attr_type & IA32_ATTR_ ## type ), (const type*) (ptr))
+#else
+#define CAST_IA32_ATTR(type,ptr) ((type*) (ptr))
+#define CONST_CAST_IA32_ATTR(type,ptr) ((const type*) (ptr))
+#endif
+
+#endif