X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=include%2Flibfirm%2Firarch.h;h=79071db40d4f78afefa701c093761d892052c09b;hb=fa9c992b5f23e7a059ac91fdd04b409b951ebcc4;hp=2a36ac28fe9799c83597a30c1e7c68940f2a797c;hpb=1ec30d95387eb392ba5a1adc7958ebd91383d59c;p=libfirm diff --git a/include/libfirm/irarch.h b/include/libfirm/irarch.h index 2a36ac28f..79071db40 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. * @@ -29,44 +29,68 @@ #include "firm_types.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 tv for MUL instruction, the multiplication constant + * + * @return the costs of this instruction + */ +typedef int (*evaluate_costs_func)(insn_kind kind, tarval *tv); + /** * A parameter structure that drives the machine dependent Firm * optimizations. */ -typedef struct { - /* 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 highest_shift_amount; /**< The highest shift amount you want to - tolerate. Muls which would require a higher - shift constant are left. */ - - /* 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. - Modes with higher amount of bits will use Mulh */ -} arch_dep_params_t; +struct ir_settings_arch_dep_t { + /* Mul optimization */ + unsigned also_use_subs : 1; /**< Use also Subs when resolving Muls to shifts */ + 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 */ + unsigned max_bits_for_mulh; /**< Maximum number of bits the Mulh operation can take. + Modes with higher amount of bits will use Mulh */ +}; /** * A factory function, that provides architecture parameters for * machine dependent optimizations. */ -typedef const arch_dep_params_t *(*arch_dep_params_factory_t)(void); +typedef const ir_settings_arch_dep_t *(*arch_dep_params_factory_t)(void); /** * A default parameter factory for testing purposes. */ -const arch_dep_params_t *arch_dep_default_factory(void); +const ir_settings_arch_dep_t *arch_dep_default_factory(void); /** * Optimization flags. */ typedef enum { - arch_dep_none = 0, - arch_dep_mul_to_shift = 1, /**< optimize Mul into Shift/Add/Sub */ - 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_none = 0, + arch_dep_mul_to_shift = 1, /**< optimize Mul into Shift/Add/Sub */ + 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; /**