/*
- * Copyright (C) 1995-2007 University of Karlsruhe. All right reserved.
+ * Copyright (C) 1995-2008 University of Karlsruhe. All right reserved.
*
* This file is part of libFirm.
*
*
* documentation no more supported since 2001
*
- * ir node construction.
+ * IR node construction.
*
* This file documents all datatypes and constructors needed to
* build a FIRM representation of a procedure. The constructors are
* Three kinds of nodes
* --------------------
*
- * There are three kinds of nodes known to the ir: entities,
+ * There are three kinds of nodes known to the IR: entities,
* types, and ir_nodes
*
* + ir_nodes are the actual nodes of the FIRM intermediate representation.
* dataflow graph with reversed edges. It has to be traversed bottom
* up.
*
- * All nodes of the ir have the same basic structure. They are
+ * All nodes of the IR have the same basic structure. They are
* distinguished by a field containing the opcode.
*
* The fields of an ir_node:
* result. A Firm mode is a datatype as known to the target,
* not a type of the source language.
*
- * visit A flag for traversing the ir.
+ * visit A flag for traversing the IR.
*
* **in An array with pointers to the node's predecessors.
*
* set_cur_block(block). If several blocks are constructed in parallel block
* switches need to be performed constantly.
*
- * To generate a Block node (with the comfortable interface) it's predecessor
+ * To generate a Block node (with the comfortable interface), its predecessor
* control flow nodes need not be known. In case of cyclic control flow these
* can not be known when the block is constructed. With add_immBlock_pred(block,
* cfnode) predecessors can be added to the block. If all predecessors are
* ir_node *new_Cond (ir_node *c);
* ir_node *new_Return (ir_node *store, int arity, ir_node **in);
* ir_node *new_Const (ir_mode *mode, tarval *con);
- * ir_node *new_SymConst (symconst_symbol value, symconst_kind kind);
+ * ir_node *new_SymConst (ir_mode *mode, symconst_symbol value, symconst_kind kind);
* ir_node *new_simpleSel (ir_node *store, ir_node *objptr, ir_entity *ent);
* ir_node *new_Sel (ir_node *store, ir_node *objptr, int arity,
* ir_node **in, ir_entity *ent);
* ir_node *new_Sub (ir_node *op1, ir_node *op2, ir_mode *mode);
* ir_node *new_Minus (ir_node *op, ir_mode *mode);
* ir_node *new_Mul (ir_node *op1, ir_node *op2, ir_mode *mode);
- * ir_node *new_Quot (ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode);
- * ir_node *new_DivMod (ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode);
- * ir_node *new_Div (ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode);
- * ir_node *new_Mod (ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode);
+ * ir_node *new_Mulh (ir_node *op1, ir_node *op2, ir_mode *mode);
+ * ir_node *new_Quot (ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode, op_pin_state state);
+ * ir_node *new_DivMod (ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode, op_pin_state state);
+ * ir_node *new_Div (ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode, op_pin_state state);
+ * ir_node *new_Mod (ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode, op_pin_state state;
* ir_node *new_Abs (ir_node *op, ir_mode *mode);
* ir_node *new_And (ir_node *op1, ir_node *op2, ir_mode *mode);
* ir_node *new_Or (ir_node *op1, ir_node *op2, ir_mode *mode);
* ir_node *new_Shl (ir_node *op, ir_node *k, ir_mode *mode);
* ir_node *new_Shr (ir_node *op, ir_node *k, ir_mode *mode);
* ir_node *new_Shrs (ir_node *op, ir_node *k, ir_mode *mode);
- * ir_node *new_Rot (ir_node *op, ir_node *k, ir_mode *mode);
+ * ir_node *new_Rotl (ir_node *op, ir_node *k, ir_mode *mode);
* ir_node *new_Cmp (ir_node *op1, ir_node *op2);
* ir_node *new_Conv (ir_node *op, ir_mode *mode);
* ir_node *new_Cast (ir_node *op, ir_type *to_tp);
* ir_node *new_Proj (ir_node *arg, ir_mode *mode, long proj);
* ir_node *new_NoMem (void);
* ir_node *new_Mux (ir_node *sel, ir_node *ir_false, ir_node *ir_true, ir_mode *mode);
- * ir_node *new_Psi (int arity, ir_node *conds[], ir_node *vals[], ir_mode *mode);
* ir_node *new_CopyB (ir_node *store, ir_node *dst, ir_node *src, ir_type *data_type);
* ir_node *new_InstOf (ir_node *store, ir_node obj, ir_type *ent);
* ir_node *new_Raise (ir_node *store, ir_node *obj);
* in some block that is control flow dependent on this block, the construction
* is correct.
*
- * Example for faulty ir construction: (draw the graph on a paper and you'll
+ * Example for faulty IR construction: (draw the graph on a paper and you'll
* get it ;-)
*
* block_before_loop = new_block();
* attr.con A tarval* pointer to the proper entry in the constant
* table.
*
- * ir_node *new_SymConst (union symconst_symbol value, symconst_addr_ent kind)
- * ---------------------------------------------------------------------------
+ * ir_node *new_SymConst (ir_mode *mode,union symconst_symbol value, symconst_addr_ent kind)
+ * -----------------------------------------------------------------------------------------
*
- * There are three kinds of symbolic constants:
+ * There are three five of symbolic constants:
* symconst_type_tag The symbolic constant represents a type tag.
* symconst_type_size The symbolic constant represents the size of a type.
* symconst_type_align The symbolic constant represents the alignment of a type.
* symconst_addr_name Information for the linker, e.g. the name of a global
* variable.
- * symconst_addr_name The symbolic constant represents the address of an entity.
+ * symconst_addr_ent The symbolic constant represents the address of an entity.
*
* To represent a pointer to an entity that is represented by an entity
* datastructure don't use
* representing the linkage info.
*
* Inputs:
- * No inputs except the block it belogns to.
+ * No inputs except the block it belongs to.
* Output:
- * An unsigned integer (I_u) or a pointer (P).
+ * A symbolic constant.
*
* Attributes:
* attr.i.num The symconst_addr_ent, i.e. one of
* -symconst_type_size
* -symconst_type_align
* -symconst_addr_name
+ * -symconst_addr_ent
*
* If the attr.i.num is symconst_type_tag, symconst_type_size or symconst_type_align,
* the node contains an attribute:
*
- * attr.i.*type, a pointer to a type_class. The mode of the node is mode_Is.
+ * attr.i.*type, a pointer to a type_class.
* if it is linkage_ptr_info it contains
- * attr.i.*ptrinfo, an ident holding information for the linker. The mode
- * of the node is mode_P_mach.
+ * attr.i.*ptrinfo, an ident holding information for the linker.
*
* ---------------
*
* Attributes:
* attr.sel Pointer to the entity
*
- * The constructors new_Sel and new_simpleSel generate the same ir nodes.
+ * The constructors new_Sel and new_simpleSel generate the same IR nodes.
* simpleSel just sets the arity of the index inputs to zero.
*
*
*
* Trivial.
*
- * ir_node *new_Quot (ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode)
- * -----------------------------------------------------------------------------
+ * ir_node *new_Mulh (ir_node *op1, ir_node *op2, ir_mode *mode)
+ * ------------------------------------------------------------
+ *
+ * Returns the high order bits of a n*n=2n multiplication.
+ *
+ * ir_node *new_Quot (ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode, op_pin_state state)
+ * -------------------------------------------------------------------------------------------------
*
* Quot performs exact division of floating point numbers. It's mode
* is Tuple, the mode of the result must match the Proj mode
* A tuple containing a memory and a execution for modeling exceptions
* and the result of the arithmetic operation.
*
- * ir_node *new_DivMod (ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode)
- * -------------------------------------------------------------------------------
+ * ir_node *new_DivMod (ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode, op_pin_state state)
+ * ---------------------------------------------------------------------------------------------------
*
* Performs Div and Mod on integer values.
*
* A tuple containing a memory and a execution for modeling exceptions
* and the two result of the arithmetic operations.
*
- * ir_node *new_Div (ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode)
- * ----------------------------------------------------------------------------
+ * ir_node *new_Div (ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode, op_pin_state state)
+ * ------------------------------------------------------------------------------------------------
*
* Trivial.
*
- * ir_node *new_Mod (ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode)
- * ----------------------------------------------------------------------------
+ * ir_node *new_Mod (ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode, op_pin_state state)
+ * ------------------------------------------------------------------------------------------------
*
* Trivial.
*
*
* Arithmetic shift right, i.e., sign extended.
*
- * ir_node *new_Rot (ir_node *op, ir_node *k, ir_mode *mode)
+ * ir_node *new_Rotl (ir_node *op, ir_node *k, ir_mode *mode)
* ---------------------------------------------------------
*
- * Rotates the operand to the (right??) by k bits.
+ * Rotates the operand to the left by k bits.
*
* ir_node *new_Carry (ir_node *op1, ir_node *op2, ir_mode *mode)
* ------------------------------------------------------------
* ir_true, else ir_false;
*
*
- * ir_node *new_Psi (int arity, ir_node *conds[], ir_node *vals[], ir_mode *mode)
- * -----------------------------------------------------------------------------
- *
- * Creates a Psi node. This node implements the following semantic:
- * Enter it here!!!
- *
*
* OPERATIONS TO MANAGE MEMORY EXPLICITLY
* --------------------------------------
#include "firm_common.h"
#include "irnode.h"
#include "irgraph.h"
-#include "dbginfo.h"
/*-------------------------------------------------------------------------*/
/* The raw interface */
* automatic Phi node construction.
*
* @param *db A Pointer for debug information.
- * @param irg The ir graph the block belongs to.
+ * @param irg The IR graph the block belongs to.
* @param arity The number of control predecessors.
* @param in[] An array of control predecessors. The length of
* the array must be 'arity'. The constructor copies this array.
/** Constructor for a Start node.
*
* @param *db A pointer for debug information.
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
*/
ir_node *new_rd_Start (dbg_info *db, ir_graph *irg, ir_node *block);
/** Constructor for a End node.
*
* @param *db A pointer for debug information.
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
*/
ir_node *new_rd_End (dbg_info *db, ir_graph *irg, ir_node *block);
* Jmp represents control flow to a single control successor.
*
* @param *db A pointer for debug information.
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
*/
ir_node *new_rd_Jmp (dbg_info *db, ir_graph *irg, ir_node *block);
* statically known i.e. an indirect Jmp.
*
* @param *db A pointer for debug information.
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
- * @param *tgt The ir node representing the target address.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
+ * @param *tgt The IR node representing the target address.
*/
ir_node *new_rd_IJmp (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *tgt);
* behind Call nodes to represent the control flow to called procedures.
*
* @param *db A pointer for debug information.
- * @param *irg The ir graph the node belong to.
+ * @param *irg The IR graph the node belong to.
* @param *block The block the node belong to.
*/
ir_node *new_rd_Break (dbg_info *db, ir_graph *irg, ir_node *block);
* longs.
*
* @param *db A pointer for debug information.
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param *c The conditions parameter. Can be of mode b or I_u.
*/
ir_node *new_rd_Cond (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *c);
/** Constructor for a Return node.
*
- * Returns the memory an zero or more return values. Only node that
+ * Returns the memory and zero or more return values. Only node that
* can end regular control flow.
*
* @param *db A pointer for debug information.
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param *store The state of memory.
* @param arity Number of return values.
* @param *in Array of length arity with return values. The constructor copies this array.
* level type information for the constant value.
*
* @param *db A pointer for debug information.
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param *mode The mode of the operands and results.
* @param *con Points to an entry in the constant table.
* @param *tp The type of the constant.
* supported: If tv is entity derives a somehow useful type.)
*
* @param *db A pointer for debug information.
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param *mode The mode of the operands and results.
* @param *con Points to an entry in the constant table.
*/
* it can not cast the argument to an int.
*
* @param *db A pointer for debug information.
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
+ * @param mode The mode for the SymConst.
* @param symkind The kind of the symbolic constant: type_tag, size, addr_name or addr_ent.
* @param value A type, entity or a ident depending on the SymConst kind.
* @param tp The source type of the constant.
*/
-ir_node *new_rd_SymConst_type (dbg_info *db, ir_graph *irg, ir_node *block, union symconst_symbol value,
- symconst_kind symkind, ir_type *tp);
+ir_node *new_rd_SymConst_type(dbg_info *db, ir_graph *irg, ir_node *block, ir_mode *mode,
+ union symconst_symbol value,
+ symconst_kind symkind, ir_type *tp);
/** Constructor for a SymConst node.
*
- * Same as new_rd_SymConst_type, except that it sets the type to type_unknown. */
-ir_node *new_rd_SymConst (dbg_info *db, ir_graph *irg, ir_node *block,
- union symconst_symbol value, symconst_kind symkind);
+ * Same as new_rd_SymConst_type, except that it sets the type to type_unknown.
+ */
+ir_node *new_rd_SymConst(dbg_info *db, ir_graph *irg, ir_node *block, ir_mode *mode,
+ union symconst_symbol value, symconst_kind symkind);
/** Constructor for a SymConst addr_ent node.
*
* Same as new_rd_SymConst_type, except that the constructor is tailored for
* symconst_addr_ent.
* Adds the SymConst to the start block of irg. */
-ir_node *new_rd_SymConst_addr_ent (dbg_info *db, ir_graph *irg, ir_entity *symbol, ir_type *tp);
+ir_node *new_rd_SymConst_addr_ent(dbg_info *db, ir_graph *irg, ir_mode *mode,
+ ir_entity *symbol, ir_type *tp);
/** Constructor for a SymConst ofs_ent node.
*
* Same as new_rd_SymConst_type, except that the constructor is tailored for
* symconst_ofs_ent.
- * Adds the SymConst to the start block of irg. */
-ir_node *new_rd_SymConst_ofs_ent (dbg_info *db, ir_graph *irg, ir_entity *symbol, ir_type *tp);
+ * Adds the SymConst to the start block of irg.
+ */
+ir_node *new_rd_SymConst_ofs_ent(dbg_info *db, ir_graph *irg, ir_mode *mode,
+ ir_entity *symbol, ir_type *tp);
/** Constructor for a SymConst addr_name node.
*
* Same as new_rd_SymConst_type, except that the constructor is tailored for
* symconst_addr_ent.
- * Adds the SymConst to the start block of irg. */
-ir_node *new_rd_SymConst_addr_name (dbg_info *db, ir_graph *irg, ident *symbol, ir_type *tp);
+ * Adds the SymConst to the start block of irg.
+ */
+ir_node *new_rd_SymConst_addr_name(dbg_info *db, ir_graph *irg, ir_mode *mode,
+ ident *symbol, ir_type *tp);
/** Constructor for a SymConst type_tag node.
*
* Same as new_rd_SymConst_type, except that the constructor is tailored for
* symconst_addr_ent.
- * Adds the SymConst to the start block of irg. */
-ir_node *new_rd_SymConst_type_tag (dbg_info *db, ir_graph *irg, ir_type *symbol, ir_type *tp);
+ * Adds the SymConst to the start block of irg.
+ */
+ir_node *new_rd_SymConst_type_tag(dbg_info *db, ir_graph *irg, ir_mode *mode,
+ ir_type *symbol, ir_type *tp);
/** Constructor for a SymConst size node.
*
* Same as new_rd_SymConst_type, except that the constructor is tailored for
* symconst_type_size.
* Adds the SymConst to the start block of irg. */
-ir_node *new_rd_SymConst_size (dbg_info *db, ir_graph *irg, ir_type *symbol, ir_type *tp);
+ir_node *new_rd_SymConst_size(dbg_info *db, ir_graph *irg, ir_mode *mode,
+ ir_type *symbol, ir_type *tp);
/** Constructor for a SymConst size node.
*
* Same as new_rd_SymConst_type, except that the constructor is tailored for
* symconst_type_align.
- * Adds the SymConst to the start block of irg. */
-ir_node *new_rd_SymConst_align (dbg_info *db, ir_graph *irg, ir_type *symbol, ir_type *tp);
+ * Adds the SymConst to the start block of irg.
+ */
+ir_node *new_rd_SymConst_align(dbg_info *db, ir_graph *irg, ir_mode *mode,
+ ir_type *symbol, ir_type *tp);
/** Constructor for a simpleSel node.
*
* inputs. It adds the two parameters 0, NULL.
*
* @param *db A pointer for debug information.
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param *store The memory in which the object the entity should be
* selected from is allocated.
* @param *objptr The object from that the Sel operation selects a
* node takes the required array indices as inputs.
*
* @param *db A pointer for debug information.
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param *store The memory in which the object the entity should be selected
* from is allocated.
* @param *objptr A pointer to a compound entity the Sel operation selects a
* Represents all kinds of method and function calls.
*
* @param *db A pointer for debug information.
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param *store The current memory state.
* @param *callee A pointer to the called procedure.
* @param arity The number of procedure parameters.
/** Constructor for a Add node.
*
* @param *db A pointer for debug information.
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param *op1 The first operand.
* @param *op2 The second operand.
* @param *mode The mode of the operands and the result.
/** Constructor for a Sub node.
*
* @param *db A pointer for debug information.
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param *op1 The first operand.
* @param *op2 The second operand.
* @param *mode The mode of the operands and the result.
/** Constructor for a Minus node.
*
* @param *db A pointer for debug information.
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param *op The operand .
* @param *mode The mode of the operand and the result.
*/
/** Constructor for a Mul node.
*
* @param *db A pointer for debug information.
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param *op1 The first operand.
* @param *op2 The second operand.
* @param *mode The mode of the operands and the result.
ir_node *new_rd_Mul (dbg_info *db, ir_graph *irg, ir_node *block,
ir_node *op1, ir_node *op2, ir_mode *mode);
+/** Constructor for a Mulh node.
+ *
+ * @param *db A pointer for debug information.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
+ * @param *op1 The first operand.
+ * @param *op2 The second operand.
+ * @param *mode The mode of the operands and the result.
+ */
+ir_node *new_rd_Mulh (dbg_info *db, ir_graph *irg, ir_node *block,
+ ir_node *op1, ir_node *op2, ir_mode *mode);
+
/** Constructor for a Quot node.
*
* @param *db A pointer for debug information.
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param *memop The store needed to model exceptions
* @param *op1 The first operand.
* @param *op2 The second operand.
* @param *mode The mode of the result.
+ * @param state The pinned state.
*/
ir_node *new_rd_Quot (dbg_info *db, ir_graph *irg, ir_node *block,
- ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode);
+ ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode, op_pin_state state);
/** Constructor for a DivMod node.
*
* @param *db A pointer for debug information.
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param *memop The store needed to model exceptions
* @param *op1 The first operand.
* @param *op2 The second operand.
* @param *mode The mode of the results.
+ * @param state The pinned state.
*/
ir_node *new_rd_DivMod (dbg_info *db, ir_graph *irg, ir_node *block,
- ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode);
+ ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode, op_pin_state state);
/** Constructor for a Div node.
*
* @param *db A pointer for debug information.
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param *memop The store needed to model exceptions
* @param *op1 The first operand.
* @param *op2 The second operand.
* @param *mode The mode of the result.
+ * @param state The pinned state.
*/
ir_node *new_rd_Div (dbg_info *db, ir_graph *irg, ir_node *block,
- ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode);
+ ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode, op_pin_state state);
+
+/** Constructor for a remainderless Div node.
+ *
+ * @param *db A pointer for debug information.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
+ * @param *memop The store needed to model exceptions
+ * @param *op1 The first operand.
+ * @param *op2 The second operand.
+ * @param *mode The mode of the result.
+ * @param state The pinned state.
+ */
+ir_node *new_rd_DivRL (dbg_info *db, ir_graph *irg, ir_node *block,
+ ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode, op_pin_state state);
/** Constructor for a Mod node.
*
* @param *db A pointer for debug information.
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param *memop The store needed to model exceptions
* @param *op1 The first operand.
* @param *op2 The second operand.
* @param *mode The mode of the result.
+ * @param state The pinned state.
*/
ir_node *new_rd_Mod (dbg_info *db, ir_graph *irg, ir_node *block,
- ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode);
+ ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode, op_pin_state state);
/** Constructor for a Abs node.
*
* @param *db A pointer for debug information.
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param *op The operand
* @param *mode The mode of the operands and the result.
*/
/** Constructor for a And node.
*
* @param *db A pointer for debug information.
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param *op1 The first operand.
* @param *op2 The second operand.
* @param *mode The mode of the operands and the result.
/** Constructor for a Or node.
*
* @param *db A pointer for debug information.
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param *op1 The first operand.
* @param *op2 The second operand.
* @param *mode The mode of the operands and the result.
/** Constructor for a Eor node.
*
* @param *db A pointer for debug information.
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param *op1 The first operand.
* @param *op2 The second operand.
* @param *mode The mode of the operands and the results.
/** Constructor for a Not node.
*
* @param *db A pointer for debug information.
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param *op The operand.
* @param *mode The mode of the operand and the result.
*/
/** Constructor for a Cmp node.
*
* @param *db A pointer for debug information.
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param *op1 The first operand.
* @param *op2 The second operand.
*/
/** Constructor for a Shl node.
*
* @param *db A pointer for debug information.
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param *op The operand.
* @param *k The number of bits to shift the operand .
* @param *mode The mode of the operand and the result.
/** Constructor for a Shr node.
*
* @param *db A pointer for debug information.
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param *op The operand.
* @param *k The number of bits to shift the operand .
* @param *mode The mode of the operand and the result.
/** Constructor for a Shrs node.
*
* @param *db A pointer for debug information.
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param *op The operand.
* @param *k The number of bits to shift the operand.
* @param *mode The mode of the operand and the result.
ir_node *new_rd_Shrs (dbg_info *db, ir_graph *irg, ir_node *block,
ir_node *op, ir_node *k, ir_mode *mode);
-/** Constructor for a Rot node.
+/** Constructor for a Rotl node.
*
* @param *db A pointer for debug information.
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param *op The operand.
* @param *k The number of bits to rotate the operand.
* @param *mode The mode of the operand.
*/
-ir_node *new_rd_Rot (dbg_info *db, ir_graph *irg, ir_node *block,
+ir_node *new_rd_Rotl (dbg_info *db, ir_graph *irg, ir_node *block,
ir_node *op, ir_node *k, ir_mode *mode);
/** Constructor for a Conv node.
*
* @param *db A pointer for debug information.
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param *op The operand.
* @param *mode The mode of this the operand muss be converted .
*/
* High level type cast.
*
* @param *db A pointer for debug information.
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param *op The operand.
* @param *to_tp The type of this the operand muss be casted .
*/
/** Constructor for a Carry node.
*
* @param *db A pointer for debug information.
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param *op1 The first operand.
* @param *op2 The second operand.
* @param *mode The mode of the operands and the result.
/** Constructor for a Borrow node.
*
* @param *db A pointer for debug information.
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param *op1 The first operand.
* @param *op2 The second operand.
* @param *mode The mode of the operands and the result.
/** Constructor for a Phi node.
*
* @param *db A pointer for debug information.
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param arity The number of predecessors
* @param *in[] Array with predecessors. The constructor copies this array.
* @param *mode The mode of it's inputs and output.
/** Constructor for a Load node.
*
* @param *db A pointer for debug information.
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param *store The current memory
* @param *adr A pointer to the variable to be read in this memory.
* @param *mode The mode of the value to be loaded.
/** Constructor for a Store node.
*
* @param *db A pointer for debug information.
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param *store The current memory
* @param *adr A pointer to the variable to be read in this memory.
* @param *val The value to write to this variable.
* The Alloc node extends the memory by space for an entity of type alloc_type.
*
* @param *db A pointer for debug information.
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param *store The memory which shall contain the new variable.
* @param *size The number of bytes to allocate.
* @param *alloc_type The type of the allocated variable.
* @param where Where to allocate the variable, either heap_alloc or stack_alloc.
*/
ir_node *new_rd_Alloc (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *store,
- ir_node *size, ir_type *alloc_type, where_alloc where);
+ ir_node *size, ir_type *alloc_type, ir_where_alloc where);
/** Constructor for a Free node.
*
* arg. Type indicates the type of the entity the argument points to.
*
* @param *db A pointer for debug information.
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param *store The memory which shall contain the new variable.
* @param *ptr The pointer to the object to free.
* @param *size The number of objects of type free_type to free in a sequence.
* @param where Where the variable was allocated, either heap_alloc or stack_alloc.
*/
ir_node *new_rd_Free (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *store,
- ir_node *ptr, ir_node *size, ir_type *free_type, where_alloc where);
+ ir_node *ptr, ir_node *size, ir_type *free_type, ir_where_alloc where);
/** Constructor for a Sync node.
*
* value in all memories where it occurs.
*
* @param *db A pointer for debug information.
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param arity The number of memories to synchronize.
* @param *in[] An array of pointers to nodes that produce an output of type
* memory. The constructor copies this array.
* position of the value within the tuple.
*
* @param *db A pointer for debug information.
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param arg A node producing a tuple. The node must have mode_T.
* @param *mode The mode of the value to project.
* @param proj The position of the value in the tuple.
* Represents the default control flow of a Switch-Cond node.
*
* @param *db A pointer for debug information.
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param arg A node producing a tuple.
* @param max_proj The end position of the value in the tuple.
*/
* without changing the corresponding Proj nodes.
*
* @param *db A pointer for debug information.
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param arity The number of tuple elements.
* @param *in[] An array containing pointers to the nodes producing the tuple
* elements. The constructor copies this array.
* value.
*
* @param *db A pointer for debug information.
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param *val The value
* @param *mode The mode of *val.
*/
* Returns the unique Bad node of the graph. The same as
* get_irg_bad().
*
- * @param *irg The ir graph the node belongs to.
+ * @param *irg The IR graph the node belongs to.
*/
ir_node *new_rd_Bad (ir_graph *irg);
* Example: If the value never exceeds '100' this is expressed by placing a
* Confirm node val = new_d_Confirm(db, val, 100, '<=') on the dataflow edge.
*
- * @param *irg The ir graph the node belong to.
- * @param *block The ir block the node belong to.
+ * @param *irg The IR graph the node belong to.
+ * @param *block The IR block the node belong to.
* @param *db A pointer for debug information.
* @param *val The value we express a constraint for
* @param *bound The value to compare against. Must be a firm node, typically a constant.
*
* Represents an arbitrary value. Places the node in the start block.
*
- * @param *irg The ir graph the node belongs to.
+ * @param *irg The IR graph the node belongs to.
* @param *m The mode of the unknown value.
*/
ir_node *new_rd_Unknown(ir_graph *irg, ir_mode *m);
* node.
*
* @param *db A pointer for debug information.
- * @param *irg The ir graph the node belong to.
+ * @param *irg The IR graph the node belong to.
* @param *block The block the node belong to.
* @param *callee The call node visible in the intra procedural view.
*/
* Used to represent regular procedure end in interprocedual view.
*
* @param *db A pointer for debug information.
- * @param *irg The ir graph the node belong to.
+ * @param *irg The IR graph the node belong to.
* @param *block The block the node belong to.
*/
ir_node *new_rd_EndReg (dbg_info *db, ir_graph *irg, ir_node *block);
* Used to represent exceptional procedure end in interprocedural view.
*
* @param *db A pointer for debug information.
- * @param *irg The ir graph the node belong to.
+ * @param *irg The IR graph the node belong to.
* @param *block The block the node belong to.
*/
ir_node *new_rd_EndExcept(dbg_info *db, ir_graph *irg, ir_node *block);
* The constructor builds the Filter in intraprocedural view.
*
* @param *db A pointer for debug information.
- * @param *irg The ir graph the node belong to.
+ * @param *irg The IR graph the node belong to.
* @param *block The block the node belong to.
* @param *arg The tuple value to project from.
* @param *mode The mode of the projected value.
* Returns the unique NoMem node of the graph. The same as
* get_irg_no_mem().
*
- * @param *irg The ir graph the node belongs to.
+ * @param *irg The IR graph the node belongs to.
*/
ir_node *new_rd_NoMem (ir_graph *irg);
/** Constructor for a Mux node.
*
* @param *db A pointer for debug information.
- * @param *irg The ir graph the node belong to.
+ * @param *irg The IR graph the node belong to.
* @param *block The block the node belong to.
* @param *sel The ir_node that calculates the boolean select.
* @param *ir_true The ir_node that calculates the true result.
ir_node *new_rd_Mux (dbg_info *db, ir_graph *irg, ir_node *block,
ir_node *sel, ir_node *ir_false, ir_node *ir_true, ir_mode *mode);
-/** Constructor for a Psi node.
- *
- * @param *db A pointer for debug information.
- * @param *irg The ir graph the node belong to.
- * @param *block The block the node belong to.
- * @param *arity The arity of the conditions
- * @param *conds The array of mode_b conditions, length must be equal arity
- * @param *vals The array of mode values, length must be equal arity + 1
- * @param *mode The mode of the node (must be the mode of all vals).
- */
-ir_node *new_rd_Psi (dbg_info *db, ir_graph *irg, ir_node *block,
- int arity, ir_node *conds[], ir_node *vals[], ir_mode *mode);
-
/** Constructor for a CopyB node.
*
* @param *db A pointer for debug information.
- * @param *irg The ir graph the node belong to.
+ * @param *irg The IR graph the node belong to.
* @param *block The block the node belong to.
* @param *store The current memory
* @param *dst The ir_node that represents the destination address.
* A High-Level Type check.
*
* @param *db A pointer for debug information.
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param *store The memory in which the object the entity should be selected
* from is allocated.
* @param *objptr A pointer to a object of a class type.
* A High-Level Exception throw.
*
* @param *db A pointer for debug information.
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param *store The current memory.
* @param *obj A pointer to the Except variable.
*/
* A High-Level bounds check. Checks whether lower <= idx && idx < upper.
*
* @param *db A pointer for debug information.
- * @param *irg The ir graph the node belong to.
+ * @param *irg The IR graph the node belong to.
* @param *block The block the node belong to.
* @param *store The current memory.
* @param *idx The ir_node that represents an index.
/** Constructor for a Pin node.
*
* @param *db A pointer for debug information.
- * @param *irg The ir graph the node belong to.
+ * @param *irg The IR graph the node belong to.
* @param *block The block the node belong to.
* @param *node The node which value should be pinned.
*/
/** Constructor for an ASM pseudo node.
*
* @param *db A pointer for debug information.
- * @param *irg The ir graph the node belong to.
+ * @param *irg The IR graph the node belong to.
* @param *block The block the node belong to.
* @param arity The number of data inputs to the node.
* @param *in The array of length arity of data inputs.
* automatic Phi node construction.
*
*
- * @param irg The ir graph the block belongs to.
+ * @param irg The IR graph the block belongs to.
* @param arity The number of control predecessors.
* @param in[] An array of control predecessors. The length of
* the array must be 'arity'. The constructor copies this array.
/** Constructor for a Start node.
*
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
*/
ir_node *new_r_Start (ir_graph *irg, ir_node *block);
/** Constructor for a End node.
*
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
*/
ir_node *new_r_End (ir_graph *irg, ir_node *block);
*
* Jmp represents control flow to a single control successor.
*
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
*/
ir_node *new_r_Jmp (ir_graph *irg, ir_node *block);
* IJmp represents control flow to a single control successor not
* statically known i.e. an indirect Jmp.
*
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
- * @param *tgt The ir node representing the target address.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
+ * @param *tgt The IR node representing the target address.
*/
ir_node *new_r_IJmp (ir_graph *irg, ir_node *block, ir_node *tgt);
* This is not consistent: Input to Cond is Is, Proj has as proj number
* longs.
*
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param *c The conditions parameter.Can be of mode b or I_u.
*/
ir_node *new_r_Cond (ir_graph *irg, ir_node *block, ir_node *c);
/** Constructor for a Return node.
*
- * Returns the memory an zero or more return values. Only node that
+ * Returns the memory and zero or more return values. Only node that
* can end regular control flow.
*
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param *store The state of memory.
* @param arity Number of array indices.
* @param *in[] Array with index inputs to the node. The constructor copies this array.
* value. Sets the type information to type_unknown. (No more
* supported: If tv is entity derives a somehow useful type.)
*
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param *mode The mode of the operands and the results.
* @param *con Points to an entry in the constant table.
*/
* value. Sets the type information to type_unknown. (No more
* supported: If tv is entity derives a somehow useful type.)
*
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param *mode The mode of the operands and the results.
* @param value A value from which the tarval is made.
*/
* The constant represents a target value. This constructor sets high
* level type information for the constant value.
*
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param *mode The mode of the operands and results.
* @param *con Points to an entry in the constant table.
* @param *tp The type of the constant.
* Outputs of the node.
* An unsigned integer (I_u) or a pointer (P).
*
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
+ * @param mode The mode for the SymConst.
* @param value A type, entity or a ident depending on the SymConst kind.
* @param symkind The kind of the symbolic constant: type_tag, size or link_info.
*/
-ir_node *new_r_SymConst (ir_graph *irg, ir_node *block,
- union symconst_symbol value, symconst_kind symkind);
+ir_node *new_r_SymConst(ir_graph *irg, ir_node *block, ir_mode *mode,
+ union symconst_symbol value, symconst_kind symkind);
/** Constructor for a simpleSel node.
*
* Sel nodes that do not select from an array, i.e., have no index
* inputs. It adds the two parameters 0, NULL.
*
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param *store The memory in which the object the entity should be selected
* from is allocated.
* @param *objptr The object from that the Sel operation selects a
* entity. If the selected entity is an array element entity the Sel
* node takes the required array indices as inputs.
*
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param *store The memory in which the object the entity should be selected
* from is allocated.
* @param *objptr A pointer to a compound entity the Sel operation selects a
*
* Represents all kinds of method and function calls.
*
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param *store The actual store.
* @param *callee A pointer to the called procedure.
* @param arity The number of procedure parameters.
/** Constructor for a Add node.
*
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param *op1 The first operand.
* @param *op2 The second operand.
* @param *mode The mode of the operands and the result.
/**
* Constructor for a Sub node.
*
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param *op1 The first operand.
* @param *op2 The second operand.
* @param *mode The mode of the operands and the results.
/** Constructor for a Minus node.
*
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param *op The operand.
* @param *mode The mode of the operand and the result.
*/
ir_node *new_r_Minus (ir_graph *irg, ir_node *block,
ir_node *op, ir_mode *mode);
+
/** Constructor for a Mul node.
*
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param *op1 The first operand.
* @param *op2 The second operand.
* @param *mode The mode of the operands and the result.
ir_node *new_r_Mul (ir_graph *irg, ir_node *block,
ir_node *op1, ir_node *op2, ir_mode *mode);
+/** Constructor for a Mulh node.
+ *
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
+ * @param *op1 The first operand.
+ * @param *op2 The second operand.
+ * @param *mode The mode of the operands and the result.
+ */
+ir_node *new_r_Mulh (ir_graph *irg, ir_node *block,
+ ir_node *op1, ir_node *op2, ir_mode *mode);
+
/** Constructor for a Quot node.
*
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param *memop The store needed to model exceptions
* @param *op1 The first operand.
* @param *op2 The second operand.
* @param *mode The mode of the result.
+ * @param state The pinned state.
*/
ir_node *new_r_Quot (ir_graph *irg, ir_node *block,
- ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode);
+ ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode, op_pin_state state);
/** Constructor for a DivMod node.
*
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param *memop The store needed to model exceptions
* @param *op1 The first operand.
* @param *op2 The second operand.
* @param *mode The mode of the results.
+ * @param state The pinned state.
*/
ir_node *new_r_DivMod (ir_graph *irg, ir_node *block,
- ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode);
+ ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode, op_pin_state state);
/** Constructor for a Div node.
*
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param *memop The store needed to model exceptions
* @param *op1 The first operand.
* @param *op2 The second operand.
* @param *mode The mode of the result.
+ * @param state The pinned state.
*/
ir_node *new_r_Div (ir_graph *irg, ir_node *block,
- ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode);
+ ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode, op_pin_state state);
+
+/** Constructor for a remainderless Div node.
+ *
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
+ * @param *memop The store needed to model exceptions
+ * @param *op1 The first operand.
+ * @param *op2 The second operand.
+ * @param *mode The mode of the result.
+ * @param state The pinned state.
+ */
+ir_node *new_r_DivRL (ir_graph *irg, ir_node *block,
+ ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode, op_pin_state state);
/** Constructor for a Mod node.
*
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param *memop The store needed to model exceptions
* @param *op1 The first operand.
* @param *op2 The second operand.
* @param *mode The mode of the result.
+ * @param state The pinned state.
*/
ir_node *new_r_Mod (ir_graph *irg, ir_node *block,
- ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode);
+ ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode, op_pin_state state);
/** Constructor for a Abs node.
*
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param *op The operand
* @param *mode The mode of the operands and the result.
*/
/** Constructor for a And node.
*
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param *op1 The first operand.
* @param *op2 The second operand.
* @param *mode The mode of the operands and the result.
/** Constructor for a Or node.
*
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param *op1 The first operand.
* @param *op2 The second operand.
* @param *mode The mode of the operands and the result.
/** Constructor for a Eor node.
*
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param *op1 The first operand.
* @param *op2 The second operand.
* @param *mode The mode of the operands and the results.
/** Constructor for a Not node.
*
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param *op The operand.
* @param *mode The mode of the operand and the result.
*/
/** Constructor for a Cmp node.
*
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param *op1 The first operand.
* @param *op2 The second operand.
*/
/** Constructor for a Shl node.
*
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param *op The operand.
* @param *k The number of bits to shift the operand .
* @param *mode The mode of the operand and the result.
/** Constructor for a Shr node.
*
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param *op The operand.
* @param *k The number of bits to shift the operand .
* @param *mode The mode of the operand and the result.
/**
* Constructor for a Shrs node.
*
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param *op The operand.
* @param *k The number of bits to shift the operand.
* @param *mode The mode of the operand and the result.
ir_node *new_r_Shrs (ir_graph *irg, ir_node *block,
ir_node *op, ir_node *k, ir_mode *mode);
-/** Constructor for a Rot node.
+/** Constructor for a Rotl node.
*
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param *op The operand.
* @param *k The number of bits to rotate the operand.
* @param *mode The mode of the operand.
*/
-ir_node *new_r_Rot (ir_graph *irg, ir_node *block,
+ir_node *new_r_Rotl (ir_graph *irg, ir_node *block,
ir_node *op, ir_node *k, ir_mode *mode);
/** Constructor for a Conv node.
*
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param *op The operand.
* @param *mode The mode of this the operand muss be converted .
*/
*
* High level type cast
*
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param *op The operand.
* @param *to_tp The type of this the operand muss be casted .
*/
/** Constructor for a Carry node.
*
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param *op1 The first operand.
* @param *op2 The second operand.
* @param *mode The mode of the operands and the result.
/**
* Constructor for a Borrow node.
*
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param *op1 The first operand.
* @param *op2 The second operand.
* @param *mode The mode of the operands and the results.
/** Constructor for a Phi node.
*
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param arity The number of predecessors
* @param *in[] Array with predecessors. The constructor copies this array.
* @param *mode The mode of it's inputs and output.
/** Constructor for a Load node.
*
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param *store The current memory
* @param *adr A pointer to the variable to be read in this memory.
* @param *mode The mode of the value to be loaded.
/** Constructor for a Store node.
*
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param *store The current memory
* @param *adr A pointer to the variable to be read in this memory.
* @param *val The value to write to this variable.
*
* The Alloc node extends the memory by space for an entity of type alloc_type.
*
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param *store The memory which shall contain the new variable.
* @param *size The number of bytes to allocate.
* @param *alloc_type The type of the allocated variable.
* @param where Where to allocate the variable, either heap_alloc or stack_alloc.
*/
ir_node *new_r_Alloc (ir_graph *irg, ir_node *block, ir_node *store,
- ir_node *size, ir_type *alloc_type, where_alloc where);
+ ir_node *size, ir_type *alloc_type, ir_where_alloc where);
/** Constructor for a Free node.
*
* Frees the memory occupied by the entity pointed to by the pointer
* arg. Type indicates the type of the entity the argument points to.
*
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param *store The memory which shall contain the new variable.
* @param *ptr The pointer to the object to free.
* @param *size The number of objects of type free_type to free in a sequence.
* @param where Where the variable was allocated, either heap_alloc or stack_alloc.
*/
ir_node *new_r_Free (ir_graph *irg, ir_node *block, ir_node *store,
- ir_node *ptr, ir_node *size, ir_type *free_type, where_alloc where);
+ ir_node *ptr, ir_node *size, ir_type *free_type, ir_where_alloc where);
/** Constructor for a Sync node.
*
* either occurs only in one of the memories, or it contains the same
* value in all memories where it occurs.
*
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param arity The number of memories to synchronize.
* @param *in[] An array of pointers to nodes that produce an output of type memory.
* The constructor copies this array.
* Projects a single value out of a tuple. The parameter proj gives the
* position of the value within the tuple.
*
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param arg A node producing a tuple.
* @param *mode The mode of the value to project.
* @param proj The position of the value in the tuple.
*
* Represents the default control flow of a Switch-Cond node.
*
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param arg A node producing a tuple.
* @param max_proj The end position of the value in the tuple.
*/
* This is an auxiliary node to replace a node that returns a tuple
* without changing the corresponding Proj nodes.
*
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param arity The number of tuple elements.
* @param *in[] An array containing pointers to the nodes producing the tuple elements.
* The constructor copies this array.
* This is an auxiliary node to replace a node that returns a single
* value.
*
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param *val The operand to Id.
* @param *mode The mode of *val.
*/
* Returns the unique Bad node of the graph. The same as
* get_irg_bad().
*
- * @param *irg The ir graph the node belongs to.
+ * @param *irg The IR graph the node belongs to.
*
*/
ir_node *new_r_Bad (ir_graph *irg);
* Example: If the value never exceeds '100' this is expressed by placing a
* Confirm node val = new_d_Confirm(db, val, 100, '<=') on the dataflow edge.
*
- * @param *irg The ir graph the node belong to.
- * @param *block The ir block the node belong to.
+ * @param *irg The IR graph the node belong to.
+ * @param *block The IR block the node belong to.
* @param *val The value we express a constraint for
* @param *bound The value to compare against. Must be a firm node, typically a constant.
* @param cmp The compare operation.
* Represents an arbitrary value. Places the node in
* the start block.
*
- * @param *irg The ir graph the node belongs to.
+ * @param *irg The IR graph the node belongs to.
* @param *m The mode of the unknown value.
*/
ir_node *new_r_Unknown(ir_graph *irg, ir_mode *m);
* constructor copies the method pointer input from the passed Call
* node.
*
- * @param *irg The ir graph the node belong to.
+ * @param *irg The IR graph the node belong to.
* @param *block The block the node belong to.
* @param *callee The call node visible in the intra procedural view.
*/
*
* Used to represent regular procedure end in interprocedual view.
*
- * @param *irg The ir graph the node belong to.
+ * @param *irg The IR graph the node belong to.
* @param *block The block the node belong to.
*/
ir_node *new_r_EndReg (ir_graph *irg, ir_node *block);
*
* Used to represent exceptional procedure end in interprocedural view.
*
- * @param *irg The ir graph the node belong to.
+ * @param *irg The IR graph the node belong to.
* @param *block The block the node belong to.
*/
ir_node *new_r_EndExcept(ir_graph *irg, ir_node *block);
* It is used for the interprocedural representation where blocks are parted
* behind Call nodes to represent the control flow to called procedures.
*
- * @param *irg The ir graph the node belong to.
+ * @param *irg The IR graph the node belong to.
* @param *block The block the node belong to.
*/
ir_node *new_r_Break (ir_graph *irg, ir_node *block);
*
* The constructor builds the Filter in intraprocedural view.
*
- * @param *irg The ir graph the node belong to.
+ * @param *irg The IR graph the node belong to.
* @param *block The block the node belong to.
* @param *arg The tuple value to project from.
* @param *mode The mode of the projected value.
* Returns the unique NoMem node of the graph. The same as
* get_irg_no_mem().
*
- * @param *irg The ir graph the node belongs to.
+ * @param *irg The IR graph the node belongs to.
*/
ir_node *new_r_NoMem (ir_graph *irg);
/** Constructor for a Mux node.
*
- * @param *irg The ir graph the node belong to.
+ * @param *irg The IR graph the node belong to.
* @param *block The block the node belong to.
* @param *sel The ir_node that calculates the boolean select.
* @param *ir_true The ir_node that calculates the true result.
ir_node *new_r_Mux (ir_graph *irg, ir_node *block,
ir_node *sel, ir_node *ir_false, ir_node *ir_true, ir_mode *mode);
-/** Constructor for a Psi node.
- *
- * @param *irg The ir graph the node belong to.
- * @param *block The block the node belong to.
- * @param *arity The arity of the conditions
- * @param *conds The array of mode_b conditions, length must be equal arity
- * @param *vals The array of mode values, length must be equal arity + 1
- * @param *mode The mode of the node (must be the mode of all vals).
- */
-ir_node *new_r_Psi (ir_graph *irg, ir_node *block,
- int arity, ir_node *conds[], ir_node *vals[], ir_mode *mode);
-
/** Constructor for a CopyB node.
*
- * @param *irg The ir graph the node belong to.
+ * @param *irg The IR graph the node belong to.
* @param *block The block the node belong to.
* @param *store The current memory
* @param *dst The ir_node that represents the destination address.
*
* A High-Level Type check.
*
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param *store The memory in which the object the entity should be selected
* from is allocated.
* @param *objptr A pointer to a object of a class type.
*
* A High-Level Exception throw.
*
- * @param *irg The ir graph the node belongs to.
- * @param *block The ir block the node belongs to.
+ * @param *irg The IR graph the node belongs to.
+ * @param *block The IR block the node belongs to.
* @param *store The current memory.
* @param *obj A pointer to the Except variable.
*/
*
* A High-Level bounds check. Checks whether lower <= idx && idx < upper.
*
- * @param *irg The ir graph the node belong to.
+ * @param *irg The IR graph the node belong to.
* @param *block The block the node belong to.
* @param *store The current memory.
* @param *idx The ir_node that represents an index.
/** Constructor for a Pin node.
*
- * @param *irg The ir graph the node belong to.
+ * @param *irg The IR graph the node belong to.
* @param *block The block the node belong to.
* @param *node The node which value should be pinned.
*/
/** Constructor for an ASM pseudo node.
*
- * @param *irg The ir graph the node belong to.
+ * @param *irg The IR graph the node belong to.
* @param *block The block the node belong to.
* @param arity The number of data inputs to the node.
* @param *in The array of length arity of data inputs.
* statically known i.e. an indirect Jmp.
*
* @param *db A pointer for debug information.
- * @param *tgt The ir node representing the target address.
+ * @param *tgt The IR node representing the target address.
*/
ir_node *new_d_IJmp (dbg_info *db, ir_node *tgt);
*
* Adds the node to the block in current_ir_block.
*
- * Returns the memory an zero or more return values. Only node that
+ * Returns the memory and zero or more return values. Only node that
* can end regular control flow.
*
* @param *db A pointer for debug information.
* An unsigned integer (I_u) or a pointer (P).
*
* @param *db A pointer for debug information.
+ * @param mode The mode for the SymConst.
* @param value A type, entity or ident depending on the SymConst kind.
* @param kind The kind of the symbolic constant: symconst_type_tag, symconst_type_size,
* symconst_type_align, symconst_addr_name or symconst_addr_ent.
* @param tp The source type of the constant.
*/
-ir_node *new_d_SymConst_type (dbg_info *db, union symconst_symbol value, symconst_kind kind, ir_type *tp);
+ir_node *new_d_SymConst_type(dbg_info *db, ir_mode *mode,
+ union symconst_symbol value, symconst_kind kind, ir_type *tp);
/** Constructor for a SymConst node.
*
- * Same as new_d_SymConst_type, except that it sets the type to type_unknown. */
-ir_node *new_d_SymConst (dbg_info *db, union symconst_symbol value, symconst_kind kind);
+ * Same as new_d_SymConst_type, except that it sets the type to type_unknown.
+ */
+ir_node *new_d_SymConst(dbg_info *db, ir_mode *mode,
+ union symconst_symbol value, symconst_kind kind);
/** Constructor for a simpleSel node.
*
*/
ir_node *new_d_Mul (dbg_info *db, ir_node *op1, ir_node *op2, ir_mode *mode);
+/** Constructor for a Mulh node.
+ *
+ * Adds the node to the block in current_ir_block.
+ *
+ * @param *db A pointer for debug information.
+ * @param *op1 The first operand.
+ * @param *op2 The second operand.
+ * @param *mode The mode of the operands and the result.
+ */
+ir_node *new_d_Mulh (dbg_info *db, ir_node *op1, ir_node *op2, ir_mode *mode);
+
/** Constructor for a Quot node.
*
* Adds the node to the block in current_ir_block.
* @param *op1 The first operand.
* @param *op2 The second operand.
* @param *mode The mode of the result.
+ * @param state The pinned state.
*/
-ir_node *new_d_Quot (dbg_info *db, ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode);
+ir_node *new_d_Quot (dbg_info *db, ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode, op_pin_state state);
/** Constructor for a DivMod node.
*
* @param *op1 The first operand.
* @param *op2 The second operand.
* @param *mode The mode of the results.
+ * @param state The pinned state.
*/
-ir_node *new_d_DivMod (dbg_info *db, ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode);
+ir_node *new_d_DivMod (dbg_info *db, ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode, op_pin_state state);
/** Constructor for a Div node.
*
* @param *op1 The first operand.
* @param *op2 The second operand.
* @param *mode The mode of the result.
+ * @param state The pinned state.
+ */
+ir_node *new_d_Div (dbg_info *db, ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode, op_pin_state state);
+
+/** Constructor for a remainderless Div node.
+ *
+ * Adds the node to the block in current_ir_block.
+ *
+ * @param *db A pointer for debug information.
+ * @param *memop The store needed to model exceptions
+ * @param *op1 The first operand.
+ * @param *op2 The second operand.
+ * @param *mode The mode of the result.
+ * @param state The pinned state.
*/
-ir_node *new_d_Div (dbg_info *db, ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode);
+ir_node *new_d_DivRL (dbg_info *db, ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode, op_pin_state state);
/** Constructor for a Mod node.
*
* @param *op1 The first operand.
* @param *op2 The second operand.
* @param *mode The mode of the result.
+ * @param state The pinned state.
*/
-ir_node *new_d_Mod (dbg_info *db, ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode);
+ir_node *new_d_Mod (dbg_info *db, ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode, op_pin_state state);
/** Constructor for a Abs node.
*
*/
ir_node *new_d_Shrs (dbg_info *db, ir_node *op, ir_node *k, ir_mode *mode);
-/** Constructor for a Rot node.
+/** Constructor for a Rotl node.
*
* Adds the node to the block in current_ir_block.
*
* @param *k The number of bits to rotate the operand.
* @param *mode The mode of the operand.
*/
-ir_node *new_d_Rot (dbg_info *db, ir_node *op, ir_node *k, ir_mode *mode);
+ir_node *new_d_Rotl (dbg_info *db, ir_node *op, ir_node *k, ir_mode *mode);
/** Constructor for a Cmp node.
*
* @param where Where to allocate the variable, either heap_alloc or stack_alloc.
*/
ir_node *new_d_Alloc (dbg_info *db, ir_node *store, ir_node *size, ir_type *alloc_type,
- where_alloc where);
+ ir_where_alloc where);
/** Constructor for a Free node.
*
* @param where Where the variable was allocated, either heap_alloc or stack_alloc.
*/
ir_node *new_d_Free (dbg_info *db, ir_node *store, ir_node *ptr, ir_node *size,
- ir_type *free_type, where_alloc where);
+ ir_type *free_type, ir_where_alloc where);
/** Constructor for a Sync node.
*
ir_node *new_d_Mux (dbg_info *db, ir_node *sel,
ir_node *ir_false, ir_node *ir_true, ir_mode *mode);
-/** Constructor for a Psi node.
- *
- * @param *db A pointer for debug information.
- * @param *arity The arity of the conditions
- * @param *conds The array of mode_b conditions, length must be equal arity
- * @param *vals The array of mode values, length must be equal arity + 1
- * @param *mode The mode of the node (must be the mode of all vals).
- */
-ir_node *new_d_Psi (dbg_info *db,
- int arity, ir_node *conds[], ir_node *vals[], ir_mode *mode);
-
/** Constructor for a CopyB node.
*
* @param *db A pointer for debug information.
* IJmp represents control flow to a single control successor not
* statically known i.e. an indirect Jmp.
*
- * @param *tgt The ir node representing the target address.
+ * @param *tgt The IR node representing the target address.
*/
ir_node *new_IJmp (ir_node *tgt);
/** Constructor for a Return node.
*
- * Returns the memory an zero or more return values. Only node that
+ * Returns the memory and zero or more return values. Only node that
* can end regular control flow. Adds the node to the block in current_ir_block.
*
* @param *store The state of memory.
* Outputs of the node.
* An unsigned integer (I_u) or a pointer (P).
*
+ * @param mode The mode for the SymConst.
* @param value A type or a ident depending on the SymConst kind.
* @param kind The kind of the symbolic constant: symconst_type_tag, symconst_type_size
* symconst_type_align, symconst_addr_name or symconst_addr_ent.
* @param tp The source type of the constant.
*/
-ir_node *new_SymConst_type (union symconst_symbol value, symconst_kind kind, ir_type *tp);
+ir_node *new_SymConst_type(ir_mode *mode, union symconst_symbol value, symconst_kind kind, ir_type *tp);
/** Constructor for a SymConst node.
*
* Outputs of the node.
* An unsigned integer (I_u) or a pointer (P).
*
+ * @param mode The mode for the SymConst.
* @param value A type or a ident depending on the SymConst kind.
* @param kind The kind of the symbolic constant: symconst_type_tag, symconst_type_size
* symconst_type_align, symconst_addr_name or symconst_addr_ent.
*/
-ir_node *new_SymConst (union symconst_symbol value, symconst_kind kind);
+ir_node *new_SymConst(ir_mode *mode, union symconst_symbol value, symconst_kind kind);
/** Constructor for a simpelSel node.
*
* @param *tp Type information of the procedure called.
*/
ir_node *new_Call (ir_node *store, ir_node *callee, int arity, ir_node *in[],
- ir_type *tp);
+ ir_type *tp);
/** Constructor for a CallBegin node.
*
*/
ir_node *new_Mul (ir_node *op1, ir_node *op2, ir_mode *mode);
+/**
+ * Constructor for a Mulh node. Adds the node to the block in current_ir_block.
+ *
+ * @param *op1 The first operand.
+ * @param *op2 The second operand.
+ * @param *mode The mode of the operands and the result.
+ */
+ir_node *new_Mulh (ir_node *op1, ir_node *op2, ir_mode *mode);
+
/** Constructor for a Quot node.
*
* Adds the node to the block in current_ir_block.
* @param *op1 The first operand.
* @param *op2 The second operand.
* @param *mode The mode of the result.
+ * @param state The pinned state.
*/
-ir_node *new_Quot (ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode);
+ir_node *new_Quot (ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode, op_pin_state state);
/** Constructor for a DivMod node.
*
* @param *op1 The first operand.
* @param *op2 The second operand.
* @param *mode The mode of the results.
+ * @param state The pinned state.
*/
-ir_node *new_DivMod (ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode);
+ir_node *new_DivMod (ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode, op_pin_state state);
/** Constructor for a Div node.
*
* @param *op1 The first operand.
* @param *op2 The second operand.
* @param *mode The mode of the result.
+ * @param state The pinned state.
*/
-ir_node *new_Div (ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode);
+ir_node *new_Div (ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode, op_pin_state state);
+
+/** Constructor for a remainderless Div node.
+ *
+ * Adds the node to the block in current_ir_block.
+ *
+ * @param *memop The store needed to model exceptions
+ * @param *op1 The first operand.
+ * @param *op2 The second operand.
+ * @param *mode The mode of the result.
+ * @param state The pinned state.
+ */
+ir_node *new_DivRL (ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode, op_pin_state state);
/** Constructor for a Mod node.
*
* @param *op1 The first operand.
* @param *op2 The second operand.
* @param *mode The mode of the result.
+ * @param state The pinned state.
*/
-ir_node *new_Mod (ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode);
+ir_node *new_Mod (ir_node *memop, ir_node *op1, ir_node *op2, ir_mode *mode, op_pin_state state);
/** Constructor for a Abs node.
*
*/
ir_node *new_Shrs (ir_node *op, ir_node *k, ir_mode *mode);
-/** Constructor for a Rot node.
+/** Constructor for a Rotl node.
*
* Adds the node to the block in current_ir_block.
*
* @param *k The number of bits to rotate the operand.
* @param *mode The mode of the operand.
*/
-ir_node *new_Rot (ir_node *op, ir_node *k, ir_mode *mode);
+ir_node *new_Rotl (ir_node *op, ir_node *k, ir_mode *mode);
/** Constructor for a Cmp node.
*
* @param where Where to allocate the variable, either heap_alloc or stack_alloc.
*/
ir_node *new_Alloc (ir_node *store, ir_node *size, ir_type *alloc_type,
- where_alloc where);
+ ir_where_alloc where);
/** Constructor for a Free node.
*
* @param where Where the variable was allocated, either heap_alloc or stack_alloc.
*/
ir_node *new_Free (ir_node *store, ir_node *ptr, ir_node *size,
- ir_type *free_type, where_alloc where);
+ ir_type *free_type, ir_where_alloc where);
/** Constructor for a Sync node.
*
*/
ir_node *new_Mux (ir_node *sel, ir_node *ir_false, ir_node *ir_true, ir_mode *mode);
-/** Constructor for a Psi node.
- *
- * @param *arity The arity of the conditions
- * @param *conds The array of mode_b conditions, length must be equal arity
- * @param *vals The array of mode values, length must be equal arity + 1
- * @param *mode The mode of the node (must be the mode of all vals).
- */
-ir_node *new_Psi (int arity, ir_node *conds[], ir_node *vals[], ir_mode *mode);
-
/** Constructor for a CopyB node.
*
* Adds the node to the block in current_ir_block.
ir_type *get_cur_frame_type(void);
-/* --- initialize and finalize ir construction --- */
+/* --- initialize and finalize IR construction --- */
/** Puts the graph into state "phase_high" */
#define irg_finalize_cons(irg) set_irg_phase_state(irg, phase_high)