X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=include%2Flibfirm%2Firop.h;h=182c259fc072f1570f8c5ab9a6eb8bea02f430ec;hb=fa9c992b5f23e7a059ac91fdd04b409b951ebcc4;hp=f3ed7582416b05ef460ea5eb92ffe50b11137ee3;hpb=1ce363f80e6a204d4011f85813362d9bd1d0e7e4;p=libfirm diff --git a/include/libfirm/irop.h b/include/libfirm/irop.h index f3ed75824..182c259fc 100644 --- a/include/libfirm/irop.h +++ b/include/libfirm/irop.h @@ -71,9 +71,11 @@ typedef enum { irop_flag_keep = 0x00000200, /**< This operation can be kept in End's keep-alive list. */ irop_flag_start_block = 0x00000400, /**< This operation is always placed in the Start block. */ irop_flag_uses_memory = 0x00000800, /**< This operation has a memory input and may change the memory state. */ - irop_flag_machine = 0x00001000, /**< This operation is a machine operation. */ - irop_flag_machine_op = 0x00002000, /**< This operation is a machine operand. */ - irop_flag_user = 0x00004000 /**< This flag and all higher ones are free for machine user. */ + irop_flag_dump_noblock = 0x00001000, /**< node should be dumped outside any blocks */ + irop_flag_dump_noinput = 0x00002000, /**< node is a placeholder for "no input" */ + irop_flag_machine = 0x00010000, /**< This operation is a machine operation. */ + irop_flag_machine_op = 0x00020000, /**< This operation is a machine operand. */ + irop_flag_user = 0x00040000 /**< This flag and all higher ones are free for machine user. */ } irop_flags; /** The opcodes of the libFirm predefined operations. */ @@ -84,17 +86,41 @@ typedef enum { iro_Sel, iro_Call, iro_Add, iro_Sub, iro_Minus, iro_Mul, iro_Mulh, iro_Quot, iro_DivMod, iro_Div, iro_Mod, iro_Abs, iro_And, iro_Or, iro_Eor, iro_Not, - iro_Cmp, iro_Shl, iro_Shr, iro_Shrs, iro_Rot, iro_Conv, iro_Cast, + iro_Cmp, iro_Shl, iro_Shr, iro_Shrs, iro_Rotl, iro_Conv, iro_Cast, iro_Carry, iro_Borrow, iro_Phi, iro_Load, iro_Store, iro_Alloc, iro_Free, iro_Sync, iro_Proj, iro_Tuple, iro_Id, iro_Bad, iro_Confirm, iro_Unknown, iro_Filter, iro_Break, iro_CallBegin, iro_EndReg, iro_EndExcept, - iro_NoMem, iro_Mux, iro_Psi, iro_CopyB, + iro_NoMem, iro_Mux, iro_Min, iro_Max, iro_CopyB, iro_InstOf, iro_Raise, iro_Bound, iro_Pin, iro_ASM, iro_Anchor, + /* first not middleend node number */ + iro_Last = iro_Anchor, + /* first backend node number */ + beo_First, + /* backend specific nodes */ + beo_Spill = beo_First, + beo_Reload, + beo_Perm, + beo_MemPerm, + beo_Copy, + beo_Keep, + beo_CopyKeep, + beo_Call, + beo_Return, + beo_AddSP, + beo_SubSP, + beo_IncSP, + beo_RegParams, + beo_FrameAddr, + beo_Barrier, + beo_Unwind, + /* last backend node number */ + beo_Last = beo_Unwind, + /* first unfixed number. Dynamic node numbers start here */ iro_MaxOpcode } ir_opcode; @@ -130,7 +156,7 @@ extern ir_op *op_Cmp; ir_op *get_op_Cmp (void); extern ir_op *op_Shl; ir_op *get_op_Shl (void); extern ir_op *op_Shr; ir_op *get_op_Shr (void); extern ir_op *op_Shrs; ir_op *get_op_Shrs (void); -extern ir_op *op_Rot; ir_op *get_op_Rot (void); +extern ir_op *op_Rotl; ir_op *get_op_Rotl (void); extern ir_op *op_Conv; ir_op *get_op_Conv (void); extern ir_op *op_Cast; ir_op *get_op_Cast (void); extern ir_op *op_Carry; ir_op *get_op_Carry (void); @@ -160,7 +186,8 @@ extern ir_op *op_EndExcept; ir_op *get_op_EndExcept (void); extern ir_op *op_NoMem; ir_op *get_op_NoMem (void); extern ir_op *op_Mux; ir_op *get_op_Mux (void); -extern ir_op *op_Psi; ir_op *get_op_Psi (void); +extern ir_op *op_Min; ir_op *get_op_Min (void); +extern ir_op *op_Max; ir_op *get_op_Max (void); extern ir_op *op_CopyB; ir_op *get_op_CopyB (void); extern ir_op *op_InstOf; ir_op *get_op_InstOf (void); @@ -226,12 +253,23 @@ op_func get_generic_function_ptr(const ir_op *op); */ void set_generic_function_ptr(ir_op *op, op_func func); +/** + * Return the irop flags of an IR opcode. + */ +irop_flags get_op_flags(const ir_op *op); + +/** + * The hash operation. + * This operation calculates a hash value for a given IR node. + */ +typedef unsigned (*hash_func)(const ir_node *self); + /** * The compute value operation. * This operation evaluates an IR node into a tarval if possible, * returning tarval_bad otherwise. */ -typedef tarval *(*computed_value_func)(ir_node *self); +typedef tarval *(*computed_value_func)(const ir_node *self); /** * The equivalent node operation. @@ -334,19 +372,24 @@ typedef int (*dump_node_func)(ir_node *self, FILE *F, dump_reason_t reason); * io_op Operations. */ typedef struct { - computed_value_func computed_value; /**< Evaluates a node into a tarval if possible. */ - equivalent_node_func equivalent_node; /**< Optimizes the node by returning an equivalent one. */ - transform_node_func transform_node; /**< Optimizes the node by transforming it. */ - node_cmp_attr_func node_cmp_attr; /**< Compares two node attributes. */ - reassociate_func reassociate; /**< Reassociate a tree. */ - copy_attr_func copy_attr; /**< Copy node attributes. */ - get_type_func get_type; /**< Return the type of a node. */ - get_type_attr_func get_type_attr; /**< Return the type attribute of a node. */ - get_entity_attr_func get_entity_attr; /**< Return the entity attribute of a node. */ - verify_node_func verify_node; /**< Verify the node. */ - verify_proj_node_func verify_proj_node; /**< Verify the Proj node. */ - dump_node_func dump_node; /**< Dump a node. */ - op_func generic; /**< A generic function pointer. */ + hash_func hash; /**< Calculate a hash value for an IR node. */ + computed_value_func computed_value; /**< Evaluates a node into a tarval if possible. */ + computed_value_func computed_value_Proj; /**< Evaluates a Proj node into a tarval if possible. */ + equivalent_node_func equivalent_node; /**< Optimizes the node by returning an equivalent one. */ + equivalent_node_func equivalent_node_Proj; /**< Optimizes the Proj node by returning an equivalent one. */ + transform_node_func transform_node; /**< Optimizes the node by transforming it. */ + equivalent_node_func transform_node_Proj; /**< Optimizes the Proj node by transforming it. */ + node_cmp_attr_func node_cmp_attr; /**< Compares two node attributes. */ + reassociate_func reassociate; /**< Reassociate a tree. */ + copy_attr_func copy_attr; /**< Copy node attributes. */ + get_type_func get_type; /**< Return the type of a node. */ + get_type_attr_func get_type_attr; /**< Return the type attribute of a node. */ + get_entity_attr_func get_entity_attr; /**< Return the entity attribute of a node. */ + verify_node_func verify_node; /**< Verify the node. */ + verify_proj_node_func verify_proj_node; /**< Verify the Proj node. */ + dump_node_func dump_node; /**< Dump a node. */ + op_func generic; /**< A generic function pointer. */ + const arch_irn_ops_t *be_ops; /**< callbacks used by the backend. */ } ir_op_ops; /**