X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=include%2Flibfirm%2Firop.h;h=9920c817279d02edf10de753468ea2abcc28a3a6;hb=1da43c3844e6865b0384d4370810fc936e828c32;hp=36d472426f0f8e72d1d97ad5bf43735d02e4f117;hpb=f7c6bc17c4d0905181f24e1272f7f4fe4a6bdd13;p=libfirm diff --git a/include/libfirm/irop.h b/include/libfirm/irop.h index 36d472426..9920c8172 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,21 +86,21 @@ 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_ASM, iro_Builtin, iro_Anchor, - /* last middleend node number */ - iro_Last, + /* first not middleend node number */ + iro_Last = iro_Anchor, /* first backend node number */ - beo_First = iro_Last, + beo_First, /* backend specific nodes */ beo_Spill = beo_First, beo_Reload, @@ -117,9 +119,9 @@ typedef enum { beo_Barrier, beo_Unwind, /* last backend node number */ - beo_Last, - /* last fixed number. Dynamic node numbers start here */ - iro_MaxOpcode = beo_Last + beo_Last = beo_Unwind, + /* first unfixed number. Dynamic node numbers start here */ + iro_MaxOpcode } ir_opcode; extern ir_op *op_Block; ir_op *get_op_Block (void); @@ -154,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); @@ -184,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); @@ -194,6 +197,7 @@ extern ir_op *op_Bound; ir_op *get_op_Bound (void); extern ir_op *op_Pin; ir_op *get_op_Pin (void); extern ir_op *op_ASM; ir_op *get_op_ASM (void); +extern ir_op *op_Builtin; ir_op *get_op_Builtin (void); extern ir_op *op_Anchor; ir_op *get_op_Anchor (void); @@ -206,16 +210,6 @@ const char *get_op_name(const ir_op *op); /** Returns the enum for the opcode */ unsigned get_op_code(const ir_op *op); -/** op_pin_state_pinned states. */ -typedef enum { - op_pin_state_floats = 0, /**< Nodes of this opcode can be placed in any basic block. */ - op_pin_state_pinned = 1, /**< Nodes must remain in this basic block. */ - op_pin_state_exc_pinned, /**< Node must be remain in this basic block if it can throw an - exception, else can float. Used internally. */ - op_pin_state_mem_pinned /**< Node must be remain in this basic block if it can throw an - exception or uses memory, else can float. Used internally. */ -} op_pin_state; - /** Returns a human readable name of an op_pin_state. */ const char *get_op_pin_state_name(op_pin_state s); @@ -250,12 +244,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. @@ -358,19 +363,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; /**