X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firarch.h;h=564b00319c32bc028904809a980bb312bf68253c;hb=fc7e44183102c47e31152fc136a35034c1820873;hp=95ba5e9722f5054467a6cd55cc876e23671e497f;hpb=6451df9379e2c82d11d02507080e707c8c11260b;p=libfirm diff --git a/ir/ir/irarch.h b/ir/ir/irarch.h index 95ba5e972..564b00319 100644 --- a/ir/ir/irarch.h +++ b/ir/ir/irarch.h @@ -17,15 +17,18 @@ * optimizations. */ typedef struct { - int 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. */ - - int highest_shift_amount; /**< The highest shift amount you want to - tolerate. Muls which would require a higher - shift constant are left. */ + /* Mul optimization */ + int 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 */ + int allow_mulhs : 1; /**< Use the Mulhs operation for division by constant */ + int 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 */ } arch_dep_params_t; /** @@ -45,7 +48,8 @@ const arch_dep_params_t *arch_dep_default_factory(void); typedef enum { arch_dep_none = 0, arch_dep_mul_to_shift = 1, /**< optimize Mul into Shift/Add/Sub */ - arch_dep_div_to_shift = 2 /**< optimize Div into Shift/Add/Mul */ + 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; /** @@ -81,20 +85,52 @@ void arch_dep_set_opts(arch_dep_opts_t opts); ir_node *arch_dep_replace_mul_with_shifts(ir_node *irn); /** - * Replace Divs with Shifts and Add/Subs. + * Replace Divs with Shifts and Add/Subs and Mulh. * This function is driven by the 3 parameters: - * - also_use_subs - * - maximum_shifts - * - highest_shift_amount + * - allow_mulhu + * - allow_mulhs * * If irn is a Div with a Const, The constant is inspected, if it meets the - * requirements of the three variables stated above. If a Shl/Add/Sub + * 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 irn The Firm node to inspect. * @return A replacement expression for irn. */ -ir_node *arch_dep_replace_div_with_shifts(ir_node *irn); +ir_node *arch_dep_replace_div_by_const(ir_node *irn); + +/** + * Replace Mods with Shifts and Add/Subs and Mulh. + * This function is driven by the 3 parameters: + * - allow_mulhu + * - allow_mulhs + * + * If irn is a Mod 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 irn The Firm node to inspect. + * @return A replacement expression for irn. + */ +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 + * + * 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); #endif