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