X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fia32%2Fia32_nodes_attr.h;h=a4a23612b546b1deadccc3ea1a2707243822aaf2;hb=3242a8dfa467ac86a3043f80a90b4a946d80ce78;hp=f4daef57d7f51c1b4ed7570800e6e63caa9552ba;hpb=97b67441422777d2bd3b29dc4257f6d569fff308;p=libfirm diff --git a/ir/be/ia32/ia32_nodes_attr.h b/ir/be/ia32/ia32_nodes_attr.h index f4daef57d..a4a23612b 100644 --- a/ir/be/ia32/ia32_nodes_attr.h +++ b/ir/be/ia32/ia32_nodes_attr.h @@ -52,9 +52,15 @@ typedef enum { ia32_am_None = 0, /**<< no addrmode support */ ia32_am_Dest = 1, /**<< addrmode for destination only */ ia32_am_Source = 2, /**<< addrmode for source only */ - ia32_am_Full = 3 /**<< full addmode support */ + ia32_am_Full = 3, /**<< full addmode support */ } ia32_am_type_t; +typedef enum { + ia32_am_arity_none = 0, + ia32_am_unary = 1, + ia32_am_binary = 2, +} ia32_am_arity_t; + /** * Different Address Mode properties: * O - Offset is set @@ -99,16 +105,17 @@ typedef enum { typedef struct ia32_attr_t ia32_attr_t; struct ia32_attr_t { except_attr exc; /**< the exception attribute. MUST be the first one. */ - struct { + struct ia32_attr_data_bitfield { unsigned tp:3; /**< ia32 node type. */ unsigned imm_tp:2; /**< ia32 immop type. */ unsigned am_support:2; /**< Indicates the address mode type supported by this node. */ + unsigned am_arity : 2; unsigned am_flavour:4; /**< The concrete address mode characteristics. */ unsigned am_scale:2; /**< The address mode scale for index register. */ unsigned am_sc_sign:1; /**< The sign bit of the address mode symconst. */ unsigned use_frame:1; /**< Indicates whether the operation uses the frame pointer or not. */ - unsigned except_label:1; /**< Set if this node needs a label because of posiible exception. */ + unsigned except_label:1; /**< Set if this node needs a label because of possible exception. */ ia32_op_flavour_t op_flav:2;/**< Flavour of an op (flavour_Div/Mod/DivMod). */ @@ -121,6 +128,8 @@ struct ia32_attr_t { unsigned got_lea:1; /**< Indicates whether or not this node already consumed a LEA. */ unsigned need_stackent:1; /**< Set to 1 if node need space on stack. */ + unsigned need_64bit_stackent:1; /**< needs a 64bit stack entity (see double->unsigned int conv) */ + unsigned need_32bit_stackent:1; /**< needs a 32bit stack entity */ } data; int *out_flags; /**< flags for each produced value */ @@ -133,8 +142,8 @@ struct ia32_attr_t { ir_entity *sc; /**< the symconst ident */ } cnst_val; - ir_mode *ls_mode; /**< Load/Store mode: This is the mode of the value - that is manipulated by this node. */ + ir_mode *ls_mode; /**< Load/Store mode: This is the mode of the + value that is manipulated by this node. */ ir_entity *frame_ent; /**< the frame entity attached to this node */ @@ -154,6 +163,7 @@ struct ia32_attr_t { const arch_register_t **slots; /**< register slots for assigned registers */ }; +COMPILETIME_ASSERT(sizeof(struct ia32_attr_data_bitfield) <= 4, attr_bitfield); typedef struct ia32_immediate_attr_t ia32_immediate_attr_t; struct ia32_immediate_attr_t {