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. 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);