https://gcc.gnu.org/bugzilla/show_bug.cgi?id=127452

--- Comment #7 from Richard Biener <rguenth at gcc dot gnu.org> ---
(In reply to Richard Biener from comment #6)
> standalone testcase
> 
> #include <stdint.h>
> 
> void mulu64_high (uint64_t * __restrict r, uint64_t *a, uint64_t *b)
> {
>   for (int i = 0; i < 128; ++i)
>     r[i] = ((unsigned __int128)a[i] * (unsigned __int128)b[i]) >> 64;
> }

optimal code via patterns might be difficult to achieve, we'd like to use
vpmuludq which maps to vec_widen_umult_even.  There might be the option
to implement umulvNdi3_highpart in the backend.  A scalar pattern
would end up with shift -> narrow -> widen mult with possibly the RTL
combiner fixing things up.

I have a prototype for that.

Reply via email to