X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firnode_t.h;h=13efa35fcca9d0431aed1579fa0dd98520b1d21f;hb=75bdba692afeb0617e59ddc2ea08e0662c356e03;hp=01b616d94d2ad933b628a6db2a4f91a607ef7e85;hpb=eb08138c6b80c169945568e4414f491a9bc20388;p=libfirm diff --git a/ir/ir/irnode_t.h b/ir/ir/irnode_t.h index 01b616d94..13efa35fc 100644 --- a/ir/ir/irnode_t.h +++ b/ir/ir/irnode_t.h @@ -17,26 +17,14 @@ * PURPOSE. */ -/* - * Project: libFIRM - * File name: ir/ir/irnode_t.h - * Purpose: Representation of an intermediate operation -- private header. - * Author: Martin Trapp, Christian Schaefer - * Modified by: Goetz Lindenmaier, Michael Beck - * Created: - * CVS-ID: $Id$ - * Copyright: (c) 1998-2003 Universität Karlsruhe - */ - /** - * @file irnode_t.h - * - * Declarations of an ir node. - * - * @author Martin Trapp, Christian Schaefer + * @file + * @brief Representation of an intermediate operation -- private header. + * @author Martin Trapp, Christian Schaefer, Goetz Lindenmaier, Michael Beck + * @version $Id$ */ -#ifndef _FIRM_IRNODE_T_H_ -#define _FIRM_IRNODE_T_H_ +#ifndef FIRM_IR_IRNODE_T_H +#define FIRM_IR_IRNODE_T_H #include "firm_config.h" #include "irnode.h" @@ -66,8 +54,9 @@ typedef struct { ir_graph *irg; /**< The graph this block belongs to. */ unsigned long block_visited; /**< For the walker that walks over all blocks. */ /* Attributes private to construction: */ - unsigned matured:1; /**< If set, all in-nodes of the block are fixed. */ - unsigned dead:1; /**< If set, the block is dead (and could be replace by a Bad. */ + unsigned is_matured:1; /**< If set, all in-nodes of the block are fixed. */ + unsigned is_dead:1; /**< If set, the block is dead (and could be replace by a Bad. */ + unsigned is_mb_head:1; /**< Set if this block is a macroblock head. */ ir_node **graph_arr; /**< An array to store all parameters. */ /* Attributes holding analyses information */ ir_dom_info dom; /**< Datastructure that holds information about dominators. @@ -85,6 +74,7 @@ typedef struct { @@@ @todo Ev. replace by bit field! */ ir_extblk *extblk; /**< The extended basic block this block belongs to. */ ir_region *region; /**< The immediate structural region this block belongs to. */ + unsigned mb_depth; /**< The macroblock depth: A distance from the macroblock header */ struct list_head succ_head; /**< A list head for all successor edges of a block. */ } block_attr; @@ -158,11 +148,6 @@ typedef struct { @todo Ev. replace by bitfield! */ } filter_attr; -/** EndReg/EndExcept attributes. */ -typedef struct { - char dummy; -} end_attr; - /** CallBegin attributes. */ typedef struct { ir_node * call; /**< Associated Call-operation. */ @@ -186,7 +171,20 @@ typedef struct { ir_volatility volatility; /**< the volatility of a Store operation */ } store_attr; -typedef pn_Cmp confirm_attr; /**< Attribute to hold compare operation */ +typedef struct { + int pos; /**< For Phi0. Used to remember the value defined by + this Phi node. Needed when the Phi is completed + to call get_r_internal_value to find the + predecessors. If this attribute is set, the Phi + node takes the role of the obsolete Phi0 node, + therefore the name. */ +} phi0_attr; + + +/**< Confirm attribute. */ +typedef struct { + pn_Cmp cmp; /**< The compare operation. */ +} confirm_attr; /** CopyB attribute. */ typedef struct { @@ -204,44 +202,55 @@ typedef struct { char strict; /**< If set, this is a strict Conv that cannot be removed. */ } conv_attr; +/** Div/Mod/DivMod/Quot attribute. */ +typedef struct { + except_attr exc; /**< The exception attribute. MUST be the first one. */ + ir_mode *res_mode; /**< Result mode for the division. */ +} divmod_attr; + +/** Inline Assembler support attribute. */ +typedef struct { + op_pin_state pin_state; /**< the pin state for operations that might generate a exception */ + ident *asm_text; /**< The inline assembler text. */ + ir_asm_constraint *inputs; /**< Input constraints. */ + ir_asm_constraint *outputs; /**< Output constraints. */ + ident **clobber; /**< List of clobbered registers. */ +} asm_attr; + /** Some IR-nodes just have one attribute, these are stored here, some have more. Their name is 'irnodename_attr' */ typedef union { - block_attr block; /**< For Block: Fields needed to construct it */ - cond_attr cond; /**< For Cond. */ - const_attr con; /**< For Const: contains the value of the constant and a type */ - symconst_attr symc; /**< For SymConst. */ - sel_attr sel; /**< For Sel. */ - call_attr call; /**< For Call: pointer to the type of the method to call */ - callbegin_attr callbegin; /**< For CallBegin */ - alloc_attr alloc; /**< For Alloc. */ - free_attr free; /**< For Free. */ - io_attr instof; /**< For InstOf */ - cast_attr cast; /**< For Cast. */ - load_attr load; /**< For Load. */ - store_attr store; /**< For Store. */ - int phi0_pos; /**< For Phi. Used to remember the value defined by - this Phi node. Needed when the Phi is completed - to call get_r_internal_value to find the - predecessors. If this attribute is set, the Phi - node takes the role of the obsolete Phi0 node, - therefore the name. */ - int *phi_backedge; /**< For Phi after construction. - Field n set to true if pred n is backedge. - @todo Ev. replace by bitfield! */ + block_attr block; /**< For Block: Fields needed to construct it */ + cond_attr cond; /**< For Cond. */ + const_attr con; /**< For Const: contains the value of the constant and a type */ + symconst_attr symc; /**< For SymConst. */ + sel_attr sel; /**< For Sel. */ + call_attr call; /**< For Call: pointer to the type of the method to call */ + callbegin_attr callbegin; /**< For CallBegin */ + alloc_attr alloc; /**< For Alloc. */ + free_attr free; /**< For Free. */ + io_attr instof; /**< For InstOf */ + cast_attr cast; /**< For Cast. */ + load_attr load; /**< For Load. */ + store_attr store; /**< For Store. */ + phi0_attr phi0; /**< for Phi0 nodes. */ + int *phi_backedge; /**< For Phi after construction. + Field n set to true if pred n is backedge. + @todo Ev. replace by bitfield! */ long proj; /**< For Proj: contains the result position to project */ - confirm_attr confirm_cmp; /**< For Confirm: compare operation */ + confirm_attr confirm; /**< For Confirm: compare operation and region. */ filter_attr filter; /**< For Filter */ - end_attr end; /**< For EndReg, EndExcept */ except_attr except; /**< For Phi node construction in case of exceptions */ copyb_attr copyb; /**< For CopyB operation */ bound_attr bound; /**< For Bound operation */ conv_attr conv; /**< For Conv operation */ + divmod_attr divmod; /**< For Div/Mod/DivMod operation */ + asm_attr assem; /**< For ASM operation. */ } attr; /** -* Edge info to put into an irn. -*/ + * Edge info to put into an irn. + */ typedef struct _irn_edge_kind_info_t { struct list_head outs_head; /**< The list of all outs. */ int out_count; /**< Number of outs in the list. */ @@ -306,7 +315,7 @@ symconst_attr get_irn_symconst_attr (ir_node *node); ir_type *get_irn_call_attr (ir_node *node); ir_type *get_irn_funccall_attr (ir_node *node); sel_attr get_irn_sel_attr (ir_node *node); -int get_irn_phi_attr (ir_node *node); +int get_irn_phi0_attr (ir_node *node); block_attr get_irn_block_attr (ir_node *node); load_attr get_irn_load_attr (ir_node *node); store_attr get_irn_store_attr (ir_node *node); @@ -659,6 +668,12 @@ _is_NoMem(const ir_node *node) { return (_get_irn_op(node) == op_NoMem); } +static INLINE int +_is_Minus(const ir_node *node) { + assert(node); + return (_get_irn_op(node) == op_Minus); +} + static INLINE int _is_Mod(const ir_node *node) { assert(node); @@ -683,6 +698,24 @@ _is_Quot(const ir_node *node) { return (_get_irn_op(node) == op_Quot); } +static INLINE int +_is_Add(const ir_node *node) { + assert(node); + return (_get_irn_op(node) == op_Add); +} + +static INLINE int +_is_Sub(const ir_node *node) { + assert(node); + return (_get_irn_op(node) == op_Sub); +} + +static INLINE int +_is_Tuple(const ir_node *node) { + assert(node); + return (_get_irn_op(node) == op_Tuple); +} + static INLINE int _is_Start(const ir_node *node) { assert(node); @@ -701,6 +734,12 @@ _is_Const(const ir_node *node) { return (_get_irn_op(node) == op_Const); } +static INLINE int +_is_Conv(const ir_node *node) { + assert(node); + return (_get_irn_op(node) == op_Conv); +} + static INLINE int _is_CopyB(const ir_node *node) { assert(node); @@ -731,6 +770,12 @@ _is_Sel(const ir_node *node) { return (_get_irn_op(node) == op_Sel); } +static INLINE int +_is_Mul(const ir_node *node) { + assert(node); + return (_get_irn_op(node) == op_Mul); +} + static INLINE int _is_Mux(const ir_node *node) { assert(node); @@ -807,6 +852,12 @@ _is_Raise(const ir_node *node) { return (_get_irn_op(node) == op_Raise); } +static INLINE int +_is_ASM(const ir_node *node) { + assert(node); + return (_get_irn_op(node) == op_ASM); +} + static INLINE int _is_no_Block(const ir_node *node) { assert(node && _is_ir_node(node)); @@ -885,7 +936,7 @@ _Block_block_visited(const ir_node *node) { static INLINE ir_node * _set_Block_dead(ir_node *block) { assert(_get_irn_op(block) == op_Block); - block->attr.block.dead = 1; + block->attr.block.is_dead = 1; return block; } @@ -897,11 +948,11 @@ _is_Block_dead(const ir_node *block) { return 1; else { assert(op == op_Block); - return block->attr.block.dead; + return block->attr.block.is_dead; } } -static INLINE tarval *_get_Const_tarval(ir_node *node) { +static INLINE tarval *_get_Const_tarval(const ir_node *node) { assert(_get_irn_op(node) == op_Const); return node->attr.con.tv; } @@ -964,7 +1015,7 @@ static INLINE int _is_irn_machine_user(const ir_node *node, unsigned n) { return is_op_machine_user(_get_irn_op(node), n); } -static INLINE cond_jmp_predicate _get_Cond_jmp_pred(ir_node *node) { +static INLINE cond_jmp_predicate _get_Cond_jmp_pred(const ir_node *node) { assert(_get_irn_op(node) == op_Cond); return node->attr.cond.pred; } @@ -979,6 +1030,14 @@ static INLINE int _get_Psi_n_conds(ir_node *node) { return _get_irn_arity(node) >> 1; } +static INLINE void *_get_irn_generic_attr(ir_node *node) { + return &node->attr; +} + +static INLINE const void *_get_irn_generic_attr_const(const ir_node *node) { + return &node->attr; +} + static INLINE unsigned _get_irn_idx(const ir_node *node) { return node->node_idx; } @@ -1008,10 +1067,12 @@ static INLINE unsigned _get_irn_idx(const ir_node *node) { #define is_unop(node) _is_unop(node) #define is_binop(node) _is_binop(node) #define is_Const(node) _is_Const(node) +#define is_Conv(node) _is_Conv(node) #define is_Unknown(node) _is_Unknown(node) #define is_Return(node) _is_Return(node) #define is_Call(node) _is_Call(node) #define is_Sel(node) _is_Sel(node) +#define is_Mul(node) _is_Mul(node) #define is_Mux(node) _is_Mux(node) #define is_Load(node) _is_Load(node) #define is_Sync(node) _is_Sync(node) @@ -1024,14 +1085,19 @@ static INLINE unsigned _get_irn_idx(const ir_node *node) { #define is_Alloc(node) _is_Alloc(node) #define is_Jmp(node) _is_Jmp(node) #define is_Raise(node) _is_Raise(node) +#define is_ASM(node) _is_ASM(node) #define is_Bad(node) _is_Bad(node) #define is_NoMem(node) _is_NoMem(node) #define is_Start(node) _is_Start(node) #define is_End(node) _is_End(node) +#define is_Minus(node) _is_Minus(node) #define is_Mod(node) _is_Mod(node) #define is_Div(node) _is_Div(node) #define is_DivMod(node) _is_DivMod(node) #define is_Quot(node) _is_Quot(node) +#define is_Add(node) _is_Add(node) +#define is_Sub(node) _is_Sub(node) +#define is_Tuple(node) _is_Tuple(node) #define is_no_Block(node) _is_no_Block(node) #define is_Block(node) _is_Block(node) #define get_Block_n_cfgpreds(node) _get_Block_n_cfgpreds(node) @@ -1060,6 +1126,8 @@ static INLINE unsigned _get_irn_idx(const ir_node *node) { #define get_Cond_jmp_pred(node) _get_Cond_jmp_pred(node) #define set_Cond_jmp_pred(node, pred) _set_Cond_jmp_pred(node, pred) #define get_Psi_n_conds(node) _get_Psi_n_conds(node) +#define get_irn_generic_attr(node) _get_irn_generic_attr(node) +#define get_irn_generic_attr_const(node) _get_irn_generic_attr_const(node) #define get_irn_idx(node) _get_irn_idx(node) #define get_irn_deps(node) _get_irn_deps(node) @@ -1069,4 +1137,4 @@ static INLINE unsigned _get_irn_idx(const ir_node *node) { #define get_irn_ins_or_deps(node) _get_irn_ins_or_deps(node) #define get_irn_in_or_dep(node, pos) _get_irn_in_or_dep(node, pos) -#endif /* _FIRM_IRNODE_T_H_ */ +#endif