fixed the fix of the fix (that was fix)
[libfirm] / ir / ir / irnode_t.h
index 01b616d..13efa35 100644 (file)
  * 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