On Mon, Jul 4, 2011 at 4:26 PM, Andrew Stubbs <a...@codesourcery.com> wrote: > On 28/06/11 15:14, Andrew Stubbs wrote: >> >> On 28/06/11 13:33, Andrew Stubbs wrote: >>> >>> On 23/06/11 15:41, Andrew Stubbs wrote: >>>> >>>> If one or both of the inputs to a widening multiply are of unsigned type >>>> then the compiler will attempt to use usmul_widen_optab or >>>> umul_widen_optab, respectively. >>>> >>>> That works fine, but only if the target supports those operations >>>> directly. Otherwise, it just bombs out and reverts to the normal >>>> inefficient non-widening multiply. >>>> >>>> This patch attempts to catch these cases and use an alternative signed >>>> widening multiply instruction, if one of those is available. >>>> >>>> I believe this should be legal as long as the top bit of both inputs is >>>> guaranteed to be zero. The code achieves this guarantee by >>>> zero-extending the inputs to a wider mode (which must still be narrower >>>> than the output mode). >>>> >>>> OK? >>> >>> This update fixes the testsuite issue Janis pointed out. >> >> And this one fixes up the wmul-5.c testcase also. The patch has changed >> the correct result. > > Here's an update for the context changed by the update to patch 3. > > The content of the patch has not changed.
+ gimple stmt = gimple_build_assign (result, fold_convert (type, val)); please use gimple_build_assign_with_ops -convert_mult_to_widen (gimple stmt) +convert_mult_to_widen (gimple stmt, gimple_stmt_iterator *gsi) The comment needs updating for the new parameter. + type1 = type2 = lang_hooks.types.type_for_mode (from_mode, 0); don't use type_for_mode, use build_nonstandard_integer_type (GET_MODE_PRECISION (from_mode), 0) instead. Both types are equal, so please share the temporary variable you create + rhs1 = build_and_insert_cast (gsi, gimple_location (stmt), + create_tmp_var (type1, NULL), rhs1, type1); + rhs2 = build_and_insert_cast (gsi, gimple_location (stmt), + create_tmp_var (type2, NULL), rhs2, type2); here (CSE create_tmp_var). + type1 = type2 = lang_hooks.types.type_for_mode (mode, 0); + mult_rhs1 = build_and_insert_cast (gsi, gimple_location (stmt), + create_tmp_var (type1, NULL), + mult_rhs1, type1); + mult_rhs2 = build_and_insert_cast (gsi, gimple_location (stmt), + create_tmp_var (type2, NULL), + mult_rhs2, type2); Likewise. Thanks, Richard. > Andrew >