Added architecture dependent optimizations framework.
[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   int also_use_subs : 1; /**< Use also Subs when resolving muls to shifts */
21
22   int maximum_shifts;    /**< The maximum number of shifts that shall be
23                             inserted for a mul. */
24
25   int highest_shift_amount; /**< The highest shift amount you want to
26                                tolerate. Muls which would require a higher
27                                shift constant are left. */
28
29 } arch_dep_params_t;
30
31 /**
32  * A factory function, that provides architecture parameters for
33  * machine dependent optimizations.
34  */
35 typedef const arch_dep_params_t *(*arch_dep_params_factory_t)(void);
36
37 /**
38  * A default parameter factory for testing purposes.
39  */
40 const arch_dep_params_t *arch_dep_default_factory(void);
41
42 /**
43  * Optimization flags.
44  */
45 typedef enum {
46   arch_dep_none = 0,
47   arch_dep_mul_to_shift = 1
48 } arch_dep_opts_t;
49
50 /**
51  * Initialize the machine dependent optimizations.
52  * @param factory   A factory that delivers parameters for these
53  *                  optimizations. If NULL is passed, or this method
54  *                  is not called, the machine dependent optimizations
55  *                  are not enabled at all.
56  */
57 void arch_dep_init(arch_dep_params_factory_t factory);
58
59 /**
60  * Set the optimizations that shall be applied.
61  * @param opts An optimization bit mask.
62  */
63 void arch_dep_set_opts(arch_dep_opts_t opts);
64
65 /**
66  * Replace Muls with Shifts and Add/Subs.
67  * This function is driven by the 3 parameters:
68  * - also_use_subs
69  * - maximum_shifts
70  * - highest_shift_amount
71  *
72  * If irn is a Mul with a Const, The constant is inspected, if it meets the
73  * requirements of the three variables stated above. If a Shl/Add/Sub
74  * sequence can be generated, that meets these requirements, this expression
75  * is returned. In each other case, irn is returned unmodified.
76  *
77  * @param irn       The Firm node to inspect.
78  * @return          A replacement expression for irn.
79  */
80 ir_node *arch_dep_replace_mul_with_shifts(ir_node *irn);
81
82 #endif