https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108787
--- Comment #2 from Jakub Jelinek <jakub at gcc dot gnu.org> --- In *.optimized dump it looks correct: d_16 = h2_14(D) w* s1_15(D); _19 = WIDEN_MULT_PLUS_EXPR <h1_10(D), s2_11(D), d_16>; d0_17 = WIDEN_MULT_PLUS_EXPR <h0_7(D), r0_8(D), _19>; where WIDEN_MULT_EXPR has 2 64-bit unsigned operands and 128-bit result, and the 2 WIDEN_MULT_PLUS_EXPR which as documented have 2 64-bit unsigned operands and 128-bit result as well as last argument. But the actual rs6000.md implementation looks broken in several ways.