From: Michael Beck Date: Wed, 11 Jul 2007 13:07:18 +0000 (+0000) Subject: op_Anchor added X-Git-Url: http://nsz.repo.hu/git/?a=commitdiff_plain;h=7d5b2d73e8a40c73c57a8e93acb7638ab0fb5ebb;p=libfirm op_Anchor added [r15040] --- diff --git a/include/libfirm/irop.h b/include/libfirm/irop.h index 2964a9397..1f92e19d0 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_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); @@ -168,6 +169,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 +182,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); @@ -362,8 +365,8 @@ typedef struct { * The behavior of new opcode depends on the operations \c ops and the \c flags. */ ir_op *new_ir_op(unsigned code, const char *name, op_pin_state p, - unsigned flags, op_arity opar, int op_index, size_t attr_size, - const ir_op_ops *ops); + unsigned flags, op_arity opar, int op_index, size_t attr_size, + const ir_op_ops *ops); /** Returns the ir_op_ops of an ir_op. */ const ir_op_ops *get_op_ops(const ir_op *op); diff --git a/ir/ir/irop.c b/ir/ir/irop.c index 7878b8a73..793a0ffab 100644 --- a/ir/ir/irop.c +++ b/ir/ir/irop.c @@ -116,6 +116,7 @@ ir_op *op_Bound; ir_op *get_op_Bound (void) { return op_Bound; } ir_op *op_Pin; ir_op *get_op_Pin (void) { return op_Pin; } ir_op *op_ASM; ir_op *get_op_ASM (void) { return op_ASM; } +ir_op *op_Anchor; ir_op *get_op_Anchor (void) { return op_Anchor; } /* * Copies all attributes stored in the old node to the new node. @@ -356,6 +357,8 @@ init_op(void) /* HMM: may contain branches so X|Y */ op_ASM = new_ir_op(iro_ASM, "ASM", op_pin_state_mem_pinned, K|X|Y, oparity_variable, -1, sizeof(asm_attr), NULL); + op_Anchor = new_ir_op(iro_Anchor, "Anchor", op_pin_state_pinned, N, oparity_variable, -1, 0, NULL); + #undef S #undef H #undef Y @@ -437,6 +440,8 @@ void finish_op(void) { free_ir_op (op_Bound ); op_Bound = NULL; free_ir_op (op_Pin ); op_Pin = NULL; + free_ir_op (op_ASM ); op_ASM = NULL; + free_ir_op (op_Anchor ); op_Anchor = NULL; } /* Returns the string for the opcode. */