X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=include%2Flibfirm%2Firarch.h;h=a94495bcf0eaafb8bd9e15bcdbab32cdc4579e54;hb=abe1a1208ecb24b75b001bfe98ea0c500407a094;hp=bacbf2bfc247443d311b7d7e16fbc5948963f6f9;hpb=e7ba741cdd9599ce05d7989bff60a1c6137ee0b5;p=libfirm diff --git a/include/libfirm/irarch.h b/include/libfirm/irarch.h index bacbf2bfc..a94495bcf 100644 --- a/include/libfirm/irarch.h +++ b/include/libfirm/irarch.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 1995-2007 University of Karlsruhe. All right reserved. + * Copyright (C) 1995-2008 University of Karlsruhe. All right reserved. * * This file is part of libFirm. * @@ -22,31 +22,56 @@ * @brief Some machine dependent optimizations. * @date 1.10.2004 * @author Sebastian Hack - * @version $Id$ */ #ifndef FIRM_IR_IRARCH_H #define FIRM_IR_IRARCH_H #include "firm_types.h" +#include "begin.h" + +/** + * The Multiplication replacement can consist of the following instructions. + */ +typedef enum instr { + LEA, /**< the LEA instruction */ + SHIFT, /**< the SHIFT instruction */ + SUB, /**< the SUB instruction */ + ADD, /**< the ADD instruction */ + ZERO, /**< creates a ZERO constant */ + MUL, /**< the original MUL instruction */ + ROOT /**< the ROOT value that is multiplied */ +} insn_kind; + +/** + * A Callback for evaluating the costs of an instruction. + * + * @param kind the instruction + * @param mode the mode of the instruction + * @param tv for MUL instruction, the multiplication constant + * + * @return the costs of this instruction + */ +typedef int (*evaluate_costs_func)(insn_kind kind, const ir_mode *mode, ir_tarval *tv); /** * A parameter structure that drives the machine dependent Firm * optimizations. */ -struct ir_settings_arch_dep_t { +typedef struct ir_settings_arch_dep_t { /* Mul optimization */ unsigned also_use_subs : 1; /**< Use also Subs when resolving Muls to shifts */ - int maximum_shifts; /**< The maximum number of shifts that shall be inserted for a mul. */ + unsigned 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. */ + evaluate_costs_func evaluate; /**< Evaluate the costs of a generated instruction. */ /* Div/Mod optimization */ unsigned allow_mulhs : 1; /**< Use the Mulhs operation for division by constant */ unsigned allow_mulhu : 1; /**< Use the Mulhu operation for division by constant */ - int max_bits_for_mulh; /**< Maximum number of bits the Mulh operation can take. + unsigned max_bits_for_mulh; /**< Maximum number of bits the Mulh operation can take. Modes with higher amount of bits will use Mulh */ -}; +} ir_settings_arch_dep_t; /** * A factory function, that provides architecture parameters for @@ -54,11 +79,6 @@ struct ir_settings_arch_dep_t { */ typedef const ir_settings_arch_dep_t *(*arch_dep_params_factory_t)(void); -/** - * A default parameter factory for testing purposes. - */ -const ir_settings_arch_dep_t *arch_dep_default_factory(void); - /** * Optimization flags. */ @@ -68,38 +88,22 @@ typedef enum { arch_dep_div_by_const = 2, /**< optimize Div into Shift/Add/Mulh */ arch_dep_mod_by_const = 4 /**< optimize Mod into Shift/Add/Mulh */ } 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); +ENUM_BITSET(arch_dep_opts_t) /** * Set the optimizations that shall be applied. * @param opts An optimization bit mask. */ -void arch_dep_set_opts(arch_dep_opts_t opts); +FIRM_API 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 - * - * If irn is a Mul with a Const, the constant is inspected if it meets the - * requirements of the three variables stated above. If a Shl/Add/Sub - * sequence can be generated that meets these requirements, this expression - * is returned. In each other case irn is returned unmodified. + * Replace Muls with Lea/Shifts/Add/Subs if these + * have smaller costs than the original multiplication. * * @param irn The Firm node to inspect. * @return A replacement expression for irn. */ -ir_node *arch_dep_replace_mul_with_shifts(ir_node *irn); +FIRM_API ir_node *arch_dep_replace_mul_with_shifts(ir_node *irn); /** * Replace Divs with Shifts and Add/Subs and Mulh. @@ -116,7 +120,7 @@ ir_node *arch_dep_replace_mul_with_shifts(ir_node *irn); * @param irn The Firm node to inspect. * @return A replacement expression for irn. */ -ir_node *arch_dep_replace_div_by_const(ir_node *irn); +FIRM_API ir_node *arch_dep_replace_div_by_const(ir_node *irn); /** * Replace Mods with Shifts and Add/Subs and Mulh. @@ -133,24 +137,8 @@ ir_node *arch_dep_replace_div_by_const(ir_node *irn); * @param irn The Firm node to inspect. * @return A replacement expression for irn. */ -ir_node *arch_dep_replace_mod_by_const(ir_node *irn); +FIRM_API ir_node *arch_dep_replace_mod_by_const(ir_node *irn); -/** - * Replace DivMods with Shifts and Add/Subs and Mulh. - * This function is driven by the 3 parameters: - * - allow_mulhu - * - allow_mulhs - * - max_bits_for_mulh - * - * If irn is a DivMod with a Const, the constant is inspected if it meets the - * requirements of the variables stated above. If a Shl/Add/Sub/Mulh - * sequence can be generated that meets these requirements, this expression - * is returned. In each other case irn is returned unmodified. - * - * @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. - */ -void arch_dep_replace_divmod_by_const(ir_node **div, ir_node **mod, ir_node *irn); +#include "end.h" #endif