added new licence header
[libfirm] / ir / ir / irarch.h
1 /*
2  * Copyright (C) 1995-2007 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 irarch.h
22  * @date 1.10.2004
23  * @author Sebastian Hack
24  * @brief Some machine dependent optimizations.
25  *
26  * $Id$
27  */
28
29 #ifndef _FIRM_IR_IRARCH_H_
30 #define _FIRM_IR_IRARCH_H_
31
32 #include "firm_types.h"
33
34 /**
35  * A parameter structure that drives the machine dependent Firm
36  * optimizations.
37  */
38 typedef struct {
39   /* Mul optimization */
40   unsigned also_use_subs : 1;           /**< Use also Subs when resolving Muls to shifts */
41   int maximum_shifts;                   /**< The maximum number of shifts that shall be inserted for a mul. */
42   unsigned highest_shift_amount;        /**< The highest shift amount you want to
43                                              tolerate. Muls which would require a higher
44                                              shift constant are left. */
45
46   /* Div/Mod optimization */
47   unsigned allow_mulhs   : 1;   /**< Use the Mulhs operation for division by constant */
48   unsigned allow_mulhu   : 1;   /**< Use the Mulhu operation for division by constant */
49   int max_bits_for_mulh;        /**< Maximum number of bits the Mulh operation can take.
50                                      Modes with higher amount of bits will use Mulh */
51 } arch_dep_params_t;
52
53 /**
54  * A factory function, that provides architecture parameters for
55  * machine dependent optimizations.
56  */
57 typedef const arch_dep_params_t *(*arch_dep_params_factory_t)(void);
58
59 /**
60  * A default parameter factory for testing purposes.
61  */
62 const arch_dep_params_t *arch_dep_default_factory(void);
63
64 /**
65  * Optimization flags.
66  */
67 typedef enum {
68   arch_dep_none         = 0,
69   arch_dep_mul_to_shift = 1,    /**< optimize Mul into Shift/Add/Sub */
70   arch_dep_div_by_const = 2,    /**< optimize Div into Shift/Add/Mulh */
71   arch_dep_mod_by_const = 4         /**< optimize Mod into Shift/Add/Mulh */
72 } arch_dep_opts_t;
73
74 /**
75  * Initialize the machine dependent optimizations.
76  * @param factory   A factory that delivers parameters for these
77  *                  optimizations. If NULL is passed, or this method
78  *                  is not called, the machine dependent optimizations
79  *                  are not enabled at all.
80  */
81 void arch_dep_init(arch_dep_params_factory_t factory);
82
83 /**
84  * Set the optimizations that shall be applied.
85  * @param opts An optimization bit mask.
86  */
87 void arch_dep_set_opts(arch_dep_opts_t opts);
88
89 /**
90  * Replace Muls with Shifts and Add/Subs.
91  * This function is driven by the 3 parameters:
92  * - also_use_subs
93  * - maximum_shifts
94  * - highest_shift_amount
95  *
96  * If irn is a Mul with a Const, the constant is inspected if it meets the
97  * requirements of the three variables stated above. If a Shl/Add/Sub
98  * sequence can be generated that meets these requirements, this expression
99  * is returned. In each other case irn is returned unmodified.
100  *
101  * @param irn       The Firm node to inspect.
102  * @return          A replacement expression for irn.
103  */
104 ir_node *arch_dep_replace_mul_with_shifts(ir_node *irn);
105
106 /**
107  * Replace Divs with Shifts and Add/Subs and Mulh.
108  * This function is driven by the 3 parameters:
109  * - allow_mulhu
110  * - allow_mulhs
111  * - max_bits_for_mulh
112  *
113  * If irn is a Div with a Const, the constant is inspected if it meets the
114  * requirements of the variables stated above. If a Shl/Add/Sub/Mulh
115  * sequence can be generated that meets these requirements, this expression
116  * is returned. In each other case irn is returned unmodified.
117  *
118  * @param irn       The Firm node to inspect.
119  * @return          A replacement expression for irn.
120  */
121 ir_node *arch_dep_replace_div_by_const(ir_node *irn);
122
123 /**
124  * Replace Mods with Shifts and Add/Subs and Mulh.
125  * This function is driven by the 3 parameters:
126  * - allow_mulhu
127  * - allow_mulhs
128  * - max_bits_for_mulh
129  *
130  * If irn is a Mod with a Const, the constant is inspected if it meets the
131  * requirements of the variables stated above. If a Shl/Add/Sub/Mulh
132  * sequence can be generated that meets these requirements, this expression
133  * is returned. In each other case irn is returned unmodified.
134  *
135  * @param irn       The Firm node to inspect.
136  * @return          A replacement expression for irn.
137  */
138 ir_node *arch_dep_replace_mod_by_const(ir_node *irn);
139
140 /**
141  * Replace DivMods with Shifts and Add/Subs and Mulh.
142  * This function is driven by the 3 parameters:
143  * - allow_mulhu
144  * - allow_mulhs
145  * - max_bits_for_mulh
146  *
147  * If irn is a DivMod with a Const, the constant is inspected if it meets the
148  * requirements of the variables stated above. If a Shl/Add/Sub/Mulh
149  * sequence can be generated that meets these requirements, this expression
150  * is returned. In each other case irn is returned unmodified.
151  *
152  * @param div       After call contains the Firm node div result or NULL.
153  * @param mod       After call contains the Firm node mod result or NULL.
154  * @param irn       The Firm node to inspect.
155  */
156 void arch_dep_replace_divmod_by_const(ir_node **div, ir_node **mod, ir_node *irn);
157
158 #endif /* _FIRM_IR_IRARCH_H_ */