On Wed, 2025-09-24 at 08:30 +0200, Richard Biener via Gcc wrote:
>
>
> > 2. Implement mulv2di3 for this specific target (which does exactly
> > what
> > scalar code would do), and let expand pass (expand_mult) take care
> > of
> > converting mult to shift/add/sub.
>
> The expand pass wouldn't do this when the target implements mulv2di3.
>
Actually I tried it by adding define_expand "mulv2di3", and the
following code in expmed.cc from the function expand_mult
3550 {
3551 int shift = wi::exact_log2 (rtx_mode_t (scalar_op1,
mode));
3552 /* Perfect power of 2 (other than 1, which is handled
above). */
3553 if (shift > 0)
3554 return expand_shift (LSHIFT_EXPR, mode, op0,
3555 shift, target, unsignedp);
3556 else
3557 goto skip_synth;
Does a shift if operand 1 is power of 2. Also there are other
optimizations applied similar to vector pattern recog.
So instead of adding similar thing in expand_vector_operations, I was
thinking of adding mulv2di3 define_expand so that it goes through the
vectorizer and let expand pass handle the optimization of
multiplication.
>
Thanks and regards,
Avinash Jayakar