X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=include%2Flibfirm%2Firop.h;h=200b30122f25f1482d074d962c85c26d564e71b5;hb=b4e4aa344ee87e7e12a89c314286ef07eca1af00;hp=2964a93979c7abe9846c669924c3e64092431072;hpb=086f13604f2ba0c462952366b5656b6f0bc0a355;p=libfirm diff --git a/include/libfirm/irop.h b/include/libfirm/irop.h index 2964a9397..200b30122 100644 --- a/include/libfirm/irop.h +++ b/include/libfirm/irop.h @@ -39,61 +39,62 @@ /** The allowed parities */ typedef enum { - oparity_invalid = 0, - oparity_unary, /**< an unary operator -- considering 'numeric' arguments. */ - oparity_binary, /**< an binary operator -- considering 'numeric' arguments.*/ - oparity_trinary, /**< an trinary operator -- considering 'numeric' arguments.*/ - oparity_zero, /**< no operators, as e.g. Const. */ - oparity_variable, /**< arity not fixed by opcode, but statically - known. E.g., number of arguments to call. */ - oparity_dynamic, /**< arity depends on state of firm representation. - Can change by optimizations... - We must allocate a dynamic in array for the node! */ - oparity_any /**< other arity */ + oparity_invalid = 0, + oparity_unary, /**< an unary operator -- considering 'numeric' arguments. */ + oparity_binary, /**< an binary operator -- considering 'numeric' arguments.*/ + oparity_trinary, /**< an trinary operator -- considering 'numeric' arguments.*/ + oparity_zero, /**< no operators, as e.g. Const. */ + oparity_variable, /**< arity not fixed by opcode, but statically + known. E.g., number of arguments to call. */ + oparity_dynamic, /**< arity depends on state of firm representation. + Can change by optimizations... + We must allocate a dynamic in array for the node! */ + oparity_any /**< other arity */ } op_arity; /** The irop flags */ typedef enum { - irop_flag_none = 0x00000000, /**< Nothing. */ - irop_flag_labeled = 0x00000001, /**< If set, output edge labels on in-edges in vcg graph. */ - irop_flag_commutative = 0x00000002, /**< This operation is commutative. */ - irop_flag_cfopcode = 0x00000004, /**< This operation is a control flow operation. */ - irop_flag_ip_cfopcode = 0x00000008, /**< This operation manipulates the interprocedural control flow. */ - irop_flag_fragile = 0x00000010, /**< Set if the operation can change the control flow because - of an exception. */ - irop_flag_forking = 0x00000020, /**< Forking control flow at this operation. */ - irop_flag_highlevel = 0x00000040, /**< This operation is a pure high-level one and can be - skipped in low-level optimizations. */ - irop_flag_constlike = 0x00000080, /**< This operation has no arguments and is some - kind of a constant. */ - irop_flag_always_opt = 0x00000100, /**< This operation must always be optimized .*/ - 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_machine = 0x00000800, /**< This operation is a machine operation. */ - irop_flag_machine_op = 0x00001000, /**< This operation is a machine operand. */ - irop_flag_user = 0x00002000 /**< This flag and all higher ones are free for machine user. */ + irop_flag_none = 0x00000000, /**< Nothing. */ + irop_flag_labeled = 0x00000001, /**< If set, output edge labels on in-edges in vcg graph. */ + irop_flag_commutative = 0x00000002, /**< This operation is commutative. */ + irop_flag_cfopcode = 0x00000004, /**< This operation is a control flow operation. */ + irop_flag_ip_cfopcode = 0x00000008, /**< This operation manipulates the interprocedural control flow. */ + irop_flag_fragile = 0x00000010, /**< Set if the operation can change the control flow because + of an exception. */ + irop_flag_forking = 0x00000020, /**< Forking control flow at this operation. */ + irop_flag_highlevel = 0x00000040, /**< This operation is a pure high-level one and can be + skipped in low-level optimizations. */ + irop_flag_constlike = 0x00000080, /**< This operation has no arguments and is some + kind of a constant. */ + irop_flag_always_opt = 0x00000100, /**< This operation must always be optimized .*/ + 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_machine = 0x00000800, /**< This operation is a machine operation. */ + irop_flag_machine_op = 0x00001000, /**< This operation is a machine operand. */ + irop_flag_user = 0x00002000 /**< This flag and all higher ones are free for machine user. */ } irop_flags; /** The opcodes of the libFirm predefined operations. */ typedef enum { - iro_Block, - iro_Start, iro_End, iro_Jmp, iro_IJmp, iro_Cond, iro_Return, - iro_Const, iro_SymConst, - iro_Sel, - iro_Call, iro_Add, iro_Sub, iro_Minus, iro_Mul, 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_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_InstOf, iro_Raise, iro_Bound, - iro_Pin, - iro_ASM, - iro_MaxOpcode + iro_Block, + iro_Start, iro_End, iro_Jmp, iro_IJmp, iro_Cond, iro_Return, + iro_Const, iro_SymConst, + 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_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_InstOf, iro_Raise, iro_Bound, + iro_Pin, + iro_ASM, + iro_Anchor, + iro_MaxOpcode } ir_opcode; extern ir_op *op_Block; ir_op *get_op_Block (void); @@ -114,6 +115,7 @@ extern ir_op *op_Add; ir_op *get_op_Add (void); extern ir_op *op_Sub; ir_op *get_op_Sub (void); extern ir_op *op_Minus; ir_op *get_op_Minus (void); extern ir_op *op_Mul; ir_op *get_op_Mul (void); +extern ir_op *op_Mulh; ir_op *get_op_Mulh (void); extern ir_op *op_Quot; ir_op *get_op_Quot (void); extern ir_op *op_DivMod; ir_op *get_op_DivMod (void); extern ir_op *op_Div; ir_op *get_op_Div (void); @@ -168,6 +170,8 @@ 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_Anchor; ir_op *get_op_Anchor (void); + /** Returns the ident for the opcode name */ ident *get_op_ident(const ir_op *op); @@ -179,12 +183,12 @@ 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_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; const char *get_op_pin_state_name(op_pin_state s); @@ -193,7 +197,7 @@ const char *get_op_pin_state_name(op_pin_state s); op_pin_state get_op_pinned(const ir_op *op); /** Sets pinned in the opcode. Setting it to floating has no effect - for Block, Phi and control flow nodes. */ + for Block, Phi and control flow nodes. */ void set_op_pinned(ir_op *op, op_pin_state pinned); /** Returns the next free IR opcode number, allows to register user ops */ @@ -324,23 +328,35 @@ typedef enum { */ typedef int (*dump_node_func)(ir_node *self, FILE *F, dump_reason_t reason); +/** + * Export a node to an archive. + */ +typedef void (*ar_export_func)(ir_node *self, FILE *F); + +/** + * Read a node back from an archive. + */ +typedef void (*ar_import_func)(ir_node *self, FILE *F); + /** * 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 */ + 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. */ + ar_export_func write_node; /**< Export a node into an archive. */ + ar_import_func read_node; /**< Import a node from an archive. */ + op_func generic; /**< A generic function pointer. */ } ir_op_ops; /**