X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=include%2Flibfirm%2Firarch.h;h=c8b4400218cd1e51fad48742822c3d7c838d3ab7;hb=a5e1011f6b967b00491c503c59753625fc74cb61;hp=7465fdc57eef42940769a91104531312b2cec610;hpb=dbfc39c03e665d1711b6d2e82b9d956282c951bb;p=libfirm diff --git a/include/libfirm/irarch.h b/include/libfirm/irarch.h index 7465fdc57..c8b440021 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. * @@ -28,6 +28,7 @@ #define FIRM_IR_IRARCH_H #include "firm_types.h" +#include "begin.h" /** * The Multiplication replacement can consist of the following instructions. @@ -39,18 +40,19 @@ typedef enum instr { ADD, /**< the ADD instruction */ ZERO, /**< creates a ZERO constant */ MUL, /**< the original MUL instruction */ - ROOT, /**< the ROOT value that is multiplied */ + 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, tarval *tv); +typedef int (*evaluate_costs_func)(insn_kind kind, const ir_mode *mode, ir_tarval *tv); /** * A parameter structure that drives the machine dependent Firm @@ -59,7 +61,7 @@ typedef int (*evaluate_costs_func)(insn_kind kind, tarval *tv); 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. */ @@ -68,7 +70,7 @@ struct ir_settings_arch_dep_t { /* 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 */ }; @@ -78,11 +80,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. */ @@ -93,37 +90,20 @@ typedef enum { 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); - /** * 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. @@ -140,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. @@ -157,7 +137,7 @@ 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. @@ -175,6 +155,9 @@ ir_node *arch_dep_replace_mod_by_const(ir_node *irn); * @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); +FIRM_API void arch_dep_replace_divmod_by_const(ir_node **div, ir_node **mod, + ir_node *irn); + +#include "end.h" #endif