irgmod: Pass the new inputs to turn_into_tuple() instead of initialising them with...
[libfirm] / include / libfirm / irarch.h
1 /*
2  * Copyright (C) 1995-2008 University of Karlsruhe.  All right reserved.
3  *
4  * This file is part of libFirm.
5  *
6  * This file may be distributed and/or modified under the terms of the
7  * GNU General Public License version 2 as published by the Free Software
8  * Foundation and appearing in the file LICENSE.GPL included in the
9  * packaging of this file.
10  *
11  * Licensees holding valid libFirm Professional Edition licenses may use
12  * this file in accordance with the libFirm Commercial License.
13  * Agreement provided with the Software.
14  *
15  * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
16  * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17  * PURPOSE.
18  */
19
20 /**
21  * @file
22  * @brief  Some machine dependent optimizations.
23  * @date   1.10.2004
24  * @author Sebastian Hack
25  */
26 #ifndef FIRM_IR_IRARCH_H
27 #define FIRM_IR_IRARCH_H
28
29 #include "firm_types.h"
30 #include "begin.h"
31
32 /**
33  * @addtogroup iroptimize
34  * @{
35  */
36
37 /**
38  * The Multiplication replacement can consist of the following instructions.
39  */
40 typedef enum insn_kind {
41         LEA,   /**< the LEA instruction */
42         SHIFT, /**< the SHIFT instruction */
43         SUB,   /**< the SUB instruction */
44         ADD,   /**< the ADD instruction */
45         ZERO,  /**< creates a ZERO constant */
46         MUL,   /**< the original MUL instruction */
47         ROOT   /**< the ROOT value that is multiplied */
48 } insn_kind;
49
50 /**
51  * A Callback for evaluating the costs of an instruction.
52  *
53  * @param kind   the instruction
54  * @param mode   the mode of the instruction
55  * @param tv     for MUL instruction, the multiplication constant
56  *
57  * @return the costs of this instruction
58  */
59 typedef int (*evaluate_costs_func)(insn_kind kind, const ir_mode *mode, ir_tarval *tv);
60
61 /**
62  * A parameter structure that drives the machine dependent Firm
63  * optimizations.
64  */
65 typedef struct ir_settings_arch_dep_t {
66         /* Mul optimization */
67         unsigned also_use_subs : 1;    /**< Use also Subs when resolving Muls to shifts */
68         unsigned maximum_shifts;       /**< The maximum number of shifts that shall be inserted for a mul. */
69         unsigned highest_shift_amount; /**< The highest shift amount you want to
70                                             tolerate. Muls which would require a higher
71                                             shift constant are left. */
72         evaluate_costs_func evaluate;  /**< Evaluate the costs of a generated instruction. */
73
74         /* Div/Mod optimization */
75         unsigned allow_mulhs   : 1;    /**< Use the Mulhs operation for division by constant */
76         unsigned allow_mulhu   : 1;    /**< Use the Mulhu operation for division by constant */
77         unsigned max_bits_for_mulh;    /**< Maximum number of bits the Mulh operation can take.
78                                             Modes with higher amount of bits will use Mulh */
79 } ir_settings_arch_dep_t;
80
81 /**
82  * A factory function, that provides architecture parameters for
83  * machine dependent optimizations.
84  */
85 typedef const ir_settings_arch_dep_t *(*arch_dep_params_factory_t)(void);
86
87 /**
88  * Optimization flags.
89  */
90 typedef enum arch_dep_opts_t {
91         arch_dep_none         = 0,
92         arch_dep_mul_to_shift = 1u << 0,  /**< optimize Mul into Shift/Add/Sub */
93         arch_dep_div_by_const = 1u << 1,  /**< optimize Div into Shift/Add/Mulh */
94         arch_dep_mod_by_const = 1u << 2   /**< optimize Mod into Shift/Add/Mulh */
95 } arch_dep_opts_t;
96 ENUM_BITSET(arch_dep_opts_t)
97
98 /**
99  * Sets the optimizations that shall be applied.
100  * @param opts  An optimization bit mask.
101  */
102 FIRM_API void arch_dep_set_opts(arch_dep_opts_t opts);
103
104 /**
105  * Replaces Muls with Lea/Shifts/Add/Subs if these
106  * have smaller costs than the original multiplication.
107  *
108  * @param irn       The Firm node to inspect.
109  * @return          A replacement expression for irn.
110  */
111 FIRM_API ir_node *arch_dep_replace_mul_with_shifts(ir_node *irn);
112
113 /**
114  * Replaces Divs with Shifts and Add/Subs and Mulh.
115  * This function is driven by the 3 parameters:
116  * - allow_mulhu
117  * - allow_mulhs
118  * - max_bits_for_mulh
119  *
120  * If irn is a Div with a Const, the constant is inspected if it meets the
121  * requirements of the variables stated above. If a Shl/Add/Sub/Mulh
122  * sequence can be generated that meets these requirements, this expression
123  * is returned. In each other case irn is returned unmodified.
124  *
125  * @param irn       The Firm node to inspect.
126  * @return          A replacement expression for irn.
127  */
128 FIRM_API ir_node *arch_dep_replace_div_by_const(ir_node *irn);
129
130 /**
131  * Replaces Mods with Shifts and Add/Subs and Mulh.
132  * This function is driven by the 3 parameters:
133  * - allow_mulhu
134  * - allow_mulhs
135  * - max_bits_for_mulh
136  *
137  * If irn is a Mod with a Const, the constant is inspected if it meets the
138  * requirements of the variables stated above. If a Shl/Add/Sub/Mulh
139  * sequence can be generated that meets these requirements, this expression
140  * is returned. In each other case irn is returned unmodified.
141  *
142  * @param irn       The Firm node to inspect.
143  * @return          A replacement expression for irn.
144  */
145 FIRM_API ir_node *arch_dep_replace_mod_by_const(ir_node *irn);
146
147 /** @} */
148
149 #include "end.h"
150
151 #endif