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 * The Multiplication replacement can consist of the following instructions. 34 */ 35 typedef enum instr { 36 LEA, /**< the LEA instruction */ 37 SHIFT, /**< the SHIFT instruction */ 38 SUB, /**< the SUB instruction */ 39 ADD, /**< the ADD instruction */ 40 ZERO, /**< creates a ZERO constant */ 41 MUL, /**< the original MUL instruction */ 42 ROOT /**< the ROOT value that is multiplied */ 43 } insn_kind; 44 45 /** 46 * A Callback for evaluating the costs of an instruction. 47 * 48 * @param kind the instruction 49 * @param mode the mode of the instruction 50 * @param tv for MUL instruction, the multiplication constant 51 * 52 * @return the costs of this instruction 53 */ 54 typedef int (*evaluate_costs_func)(insn_kind kind, const ir_mode *mode, ir_tarval *tv); 55 56 /** 57 * A parameter structure that drives the machine dependent Firm 58 * optimizations. 59 */ 60 typedef struct ir_settings_arch_dep_t { 61 /* Mul optimization */ 62 unsigned also_use_subs : 1; /**< Use also Subs when resolving Muls to shifts */ 63 unsigned maximum_shifts; /**< The maximum number of shifts that shall be inserted for a mul. */ 64 unsigned highest_shift_amount; /**< The highest shift amount you want to 65 tolerate. Muls which would require a higher 66 shift constant are left. */ 67 evaluate_costs_func evaluate; /**< Evaluate the costs of a generated instruction. */ 68 69 /* Div/Mod optimization */ 70 unsigned allow_mulhs : 1; /**< Use the Mulhs operation for division by constant */ 71 unsigned allow_mulhu : 1; /**< Use the Mulhu operation for division by constant */ 72 unsigned max_bits_for_mulh; /**< Maximum number of bits the Mulh operation can take. 73 Modes with higher amount of bits will use Mulh */ 74 } ir_settings_arch_dep_t; 75 76 /** 77 * A factory function, that provides architecture parameters for 78 * machine dependent optimizations. 79 */ 80 typedef const ir_settings_arch_dep_t *(*arch_dep_params_factory_t)(void); 81 82 /** 83 * Optimization flags. 84 */ 85 typedef enum { 86 arch_dep_none = 0, 87 arch_dep_mul_to_shift = 1, /**< optimize Mul into Shift/Add/Sub */ 88 arch_dep_div_by_const = 2, /**< optimize Div into Shift/Add/Mulh */ 89 arch_dep_mod_by_const = 4 /**< optimize Mod into Shift/Add/Mulh */ 90 } arch_dep_opts_t; 91 ENUM_BITSET(arch_dep_opts_t) 92 93 /** 94 * Sets the optimizations that shall be applied. 95 * @param opts An optimization bit mask. 96 */ 97 FIRM_API void arch_dep_set_opts(arch_dep_opts_t opts); 98 99 /** 100 * Replaces Muls with Lea/Shifts/Add/Subs if these 101 * have smaller costs than the original multiplication. 102 * 103 * @param irn The Firm node to inspect. 104 * @return A replacement expression for irn. 105 */ 106 FIRM_API ir_node *arch_dep_replace_mul_with_shifts(ir_node *irn); 107 108 /** 109 * Replaces Divs with Shifts and Add/Subs and Mulh. 110 * This function is driven by the 3 parameters: 111 * - allow_mulhu 112 * - allow_mulhs 113 * - max_bits_for_mulh 114 * 115 * If irn is a Div with a Const, the constant is inspected if it meets the 116 * requirements of the variables stated above. If a Shl/Add/Sub/Mulh 117 * sequence can be generated that meets these requirements, this expression 118 * is returned. In each other case irn is returned unmodified. 119 * 120 * @param irn The Firm node to inspect. 121 * @return A replacement expression for irn. 122 */ 123 FIRM_API ir_node *arch_dep_replace_div_by_const(ir_node *irn); 124 125 /** 126 * Replaces Mods with Shifts and Add/Subs and Mulh. 127 * This function is driven by the 3 parameters: 128 * - allow_mulhu 129 * - allow_mulhs 130 * - max_bits_for_mulh 131 * 132 * If irn is a Mod with a Const, the constant is inspected if it meets the 133 * requirements of the variables stated above. If a Shl/Add/Sub/Mulh 134 * sequence can be generated that meets these requirements, this expression 135 * is returned. In each other case irn is returned unmodified. 136 * 137 * @param irn The Firm node to inspect. 138 * @return A replacement expression for irn. 139 */ 140 FIRM_API ir_node *arch_dep_replace_mod_by_const(ir_node *irn); 141 142 #include "end.h" 143 144 #endif 145