On Wed, 2 Nov 2011, DJ Delorie wrote: > > GCC assumes the target has a multiply insn, but better code is > generated using shifts if it doesn't (vs a libcall). Found with the > rl78-elf port. > > * expr.c (expand_expr_real_2): Don't try to emit a MUL-based > expression if the target doesn't have a multiply pattern. Fall > back to shifts instead of using libgcc calls.
Wouldn't this stop targets that have a scaling "lea"-type indexing pattern but no multiply insns from using those patterns? > > Index: gcc/expr.c > =================================================================== > --- gcc/expr.c (revision 180758) > +++ gcc/expr.c (working copy) > @@ -8289,12 +8289,13 @@ expand_expr_real_2 (sepops ops, rtx targ > } > > /* Attempt to return something suitable for generating an > indexed address, for machines that support that. */ > > if (modifier == EXPAND_SUM && mode == ptr_mode > + && optab_handler (smul_optab, mode) != CODE_FOR_nothing > && host_integerp (treeop1, 0)) > { > tree exp1 = treeop1; > > op0 = expand_expr (treeop0, subtarget, VOIDmode, > EXPAND_SUM); >