irarch.h 5.4 KB
Newer Older
Christian Würdig's avatar
Christian Würdig committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/*
 * 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.
 */

20
/**
Matthias Braun's avatar
Matthias Braun committed
21
22
23
 * @file
 * @brief  Some machine dependent optimizations.
 * @date   1.10.2004
24
 * @author Sebastian Hack
Matthias Braun's avatar
Matthias Braun committed
25
 * @version $Id$
26
 */
Matthias Braun's avatar
Matthias Braun committed
27
28
#ifndef FIRM_IR_IRARCH_H
#define FIRM_IR_IRARCH_H
29

30
#include "firm_types.h"
31
32
33
34
35
36

/**
 * A parameter structure that drives the machine dependent Firm
 * optimizations.
 */
typedef struct {
37
  /* Mul optimization */
38
  unsigned also_use_subs : 1;           /**< Use also Subs when resolving Muls to shifts */
39
40
41
42
43
44
  int maximum_shifts;                   /**< The maximum number of shifts that shall be inserted for a mul. */
  unsigned highest_shift_amount;        /**< The highest shift amount you want to
			                     tolerate. Muls which would require a higher
			                     shift constant are left. */

  /* Div/Mod optimization */
45
46
  unsigned allow_mulhs   : 1;   /**< Use the Mulhs operation for division by constant */
  unsigned allow_mulhu   : 1;   /**< Use the Mulhu operation for division by constant */
Michael Beck's avatar
Michael Beck committed
47
  int max_bits_for_mulh;        /**< Maximum number of bits the Mulh operation can take.
48
                                     Modes with higher amount of bits will use Mulh */
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
} arch_dep_params_t;

/**
 * A factory function, that provides architecture parameters for
 * machine dependent optimizations.
 */
typedef const arch_dep_params_t *(*arch_dep_params_factory_t)(void);

/**
 * A default parameter factory for testing purposes.
 */
const arch_dep_params_t *arch_dep_default_factory(void);

/**
 * Optimization flags.
 */
typedef enum {
Michael Beck's avatar
Michael Beck committed
66
67
  arch_dep_none         = 0,
  arch_dep_mul_to_shift = 1,	/**< optimize Mul into Shift/Add/Sub */
68
  arch_dep_div_by_const = 2,	/**< optimize Div into Shift/Add/Mulh */
69
  arch_dep_mod_by_const = 4	    /**< optimize Mod into Shift/Add/Mulh */
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
} arch_dep_opts_t;

/**
 * Initialize the machine dependent optimizations.
 * @param factory   A factory that delivers parameters for these
 *                  optimizations. If NULL is passed, or this method
 *                  is not called, the machine dependent optimizations
 *                  are not enabled at all.
 */
void arch_dep_init(arch_dep_params_factory_t factory);

/**
 * Set the optimizations that shall be applied.
 * @param opts An optimization bit mask.
 */
void arch_dep_set_opts(arch_dep_opts_t opts);

/**
 * Replace Muls with Shifts and Add/Subs.
 * This function is driven by the 3 parameters:
 * - also_use_subs
 * - maximum_shifts
 * - highest_shift_amount
 *
94
 * If irn is a Mul with a Const, the constant is inspected if it meets the
95
 * requirements of the three variables stated above. If a Shl/Add/Sub
96
97
 * sequence can be generated that meets these requirements, this expression
 * is returned. In each other case irn is returned unmodified.
98
99
100
101
102
103
 *
 * @param irn       The Firm node to inspect.
 * @return          A replacement expression for irn.
 */
ir_node *arch_dep_replace_mul_with_shifts(ir_node *irn);

Michael Beck's avatar
Michael Beck committed
104
/**
105
 * Replace Divs with Shifts and Add/Subs and Mulh.
Michael Beck's avatar
Michael Beck committed
106
 * This function is driven by the 3 parameters:
107
108
 * - allow_mulhu
 * - allow_mulhs
109
 * - max_bits_for_mulh
Michael Beck's avatar
Michael Beck committed
110
 *
111
 * If irn is a Div 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
114
 * sequence can be generated that meets these requirements, this expression
 * is returned. In each other case irn is returned unmodified.
Michael Beck's avatar
Michael Beck committed
115
116
117
118
 *
 * @param irn       The Firm node to inspect.
 * @return          A replacement expression for irn.
 */
119
ir_node *arch_dep_replace_div_by_const(ir_node *irn);
Michael Beck's avatar
Michael Beck committed
120

Michael Beck's avatar
Michael Beck committed
121
/**
122
 * Replace Mods with Shifts and Add/Subs and Mulh.
Michael Beck's avatar
Michael Beck committed
123
 * This function is driven by the 3 parameters:
124
125
 * - allow_mulhu
 * - allow_mulhs
126
 * - max_bits_for_mulh
Michael Beck's avatar
Michael Beck committed
127
 *
128
 * If irn is a Mod 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
131
 * sequence can be generated that meets these requirements, this expression
 * is returned. In each other case irn is returned unmodified.
Michael Beck's avatar
Michael Beck committed
132
133
134
135
 *
 * @param irn       The Firm node to inspect.
 * @return          A replacement expression for irn.
 */
136
ir_node *arch_dep_replace_mod_by_const(ir_node *irn);
Michael Beck's avatar
Michael Beck committed
137
138

/**
139
 * Replace DivMods with Shifts and Add/Subs and Mulh.
Michael Beck's avatar
Michael Beck committed
140
 * This function is driven by the 3 parameters:
141
142
 * - allow_mulhu
 * - allow_mulhs
143
 * - max_bits_for_mulh
Michael Beck's avatar
Michael Beck committed
144
 *
145
 * If irn is a DivMod with a Const, the constant is inspected if it meets the
146
 * requirements of the variables stated above. If a Shl/Add/Sub/Mulh
147
148
 * sequence can be generated that meets these requirements, this expression
 * is returned. In each other case irn is returned unmodified.
Michael Beck's avatar
Michael Beck committed
149
150
151
152
153
 *
 * @param div       After call contains the Firm node div result or NULL.
 * @param mod       After call contains the Firm node mod result or NULL.
 * @param irn       The Firm node to inspect.
 */
154
void arch_dep_replace_divmod_by_const(ir_node **div, ir_node **mod, ir_node *irn);
Michael Beck's avatar
Michael Beck committed
155

Matthias Braun's avatar
Matthias Braun committed
156
#endif