* 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"
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.
@@@ @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;
@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. */
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 {
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. */
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);
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);
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);
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);
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);
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));
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;
}
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;
}
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;
}
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;
}
#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)
#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)
#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)
#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