+ * Copyright (C) 1995-2007 University of Karlsruhe. All right reserved.
+ *
+ * This file is part of libFirm.
+ *
+ * This file may be distributed and/or modified under the terms of the
+ * GNU General Public License version 2 as published by the Free Software
+ * Foundation and appearing in the file LICENSE.GPL included in the
+ * packaging of this file.
+ *
+ * Licensees holding valid libFirm Professional Edition licenses may use
+ * this file in accordance with the libFirm Commercial License.
+ * Agreement provided with the Software.
+ *
+ * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+ * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ */
+
+/**
+ * @file
+ * @brief Representation of opcode of intermediate operation.
+ * @author Christian Schaefer, Goetz Lindenmaier
+ * @version $Id$
+ * @summary
+ * Operators of firm nodes.
+ *
+ * This module specifies the opcodes possible for ir nodes. Their
+ * definition is close to the operations specified in UKA Tech-Report
+ * 1999-14
+ */
+#ifndef FIRM_IR_IROP_H
+#define FIRM_IR_IROP_H
+
+#include "firm_types.h"
+
+#include <stdio.h>
+#include "ident.h"
+
+/** The allowed parities */
+typedef enum {
+ oparity_invalid = 0,
+ oparity_unary, /**< an unary operator -- considering 'numeric' arguments. */
+ oparity_binary, /**< an binary operator -- considering 'numeric' arguments.*/
+ oparity_trinary, /**< an trinary operator -- considering 'numeric' arguments.*/
+ oparity_zero, /**< no operators, as e.g. Const. */
+ oparity_variable, /**< arity not fixed by opcode, but statically
+ known. E.g., number of arguments to call. */
+ oparity_dynamic, /**< arity depends on state of firm representation.
+ Can change by optimizations...
+ We must allocate a dynamic in array for the node! */
+ oparity_any /**< other arity */
+} op_arity;
+
+
+/** The irop flags */
+typedef enum {
+ irop_flag_none = 0x00000000, /**< Nothing. */
+ irop_flag_labeled = 0x00000001, /**< If set, output edge labels on in-edges in vcg graph. */
+ irop_flag_commutative = 0x00000002, /**< This operation is commutative. */
+ irop_flag_cfopcode = 0x00000004, /**< This operation is a control flow operation. */
+ irop_flag_ip_cfopcode = 0x00000008, /**< This operation manipulates the interprocedural control flow. */
+ irop_flag_fragile = 0x00000010, /**< Set if the operation can change the control flow because
+ of an exception. */
+ irop_flag_forking = 0x00000020, /**< Forking control flow at this operation. */
+ irop_flag_highlevel = 0x00000040, /**< This operation is a pure high-level one and can be
+ skipped in low-level optimizations. */
+ irop_flag_constlike = 0x00000080, /**< This operation has no arguments and is some
+ kind of a constant. */
+ irop_flag_always_opt = 0x00000100, /**< This operation must always be optimized .*/
+ irop_flag_keep = 0x00000200, /**< This operation can be kept in End's keep-alive list. */
+ irop_flag_start_block = 0x00000400, /**< This operation is always placed in the Start block. */
+ irop_flag_machine = 0x00000800, /**< This operation is a machine operation. */
+ irop_flag_machine_op = 0x00001000, /**< This operation is a machine operand. */
+ irop_flag_user = 0x00002000 /**< This flag and all higher ones are free for machine user. */
+} irop_flags;
+
+/** The opcodes of the libFirm predefined operations. */