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.