rtx op3_hi = gen_rtx_SUBREG (DImode, operands[3], BYTES_BIG_ENDIAN ? 0 : 8);
rtx hi_temp = gen_reg_rtx (DImode);
- emit_insn (gen_maddlddi4 (op0_lo, operands[1], operands[2], op3_lo));
-
if (BYTES_BIG_ENDIAN)
emit_insn (gen_umadddi4_highpart (hi_temp, operands[1], operands[2],
op3_lo));
emit_insn (gen_umadddi4_highpart_le (hi_temp, operands[1], operands[2],
op3_lo));
+ emit_insn (gen_maddlddi4 (op0_lo, operands[1], operands[2], op3_lo));
+
emit_insn (gen_adddi3 (op0_hi, hi_temp, op3_hi));
DONE;
--- /dev/null
+/* PR target/108862 */
+/* { dg-do run { target int128 } } */
+/* { dg-options "-O2" } */
+
+unsigned long long a[2] = { 0x04a13945d898c296ULL, 0x0000100000000fffULL };
+unsigned long long b[4] = { 0x04a13945d898c296ULL, 0, 0, 0x0000100000000fffULL };
+
+__attribute__((noipa)) unsigned __int128
+foo (int x, unsigned long long *y, unsigned long long *z)
+{
+ unsigned __int128 w = 0;
+ for (int i = 0; i < x; i++)
+ w += (unsigned __int128)*y++ * (unsigned __int128)*z--;
+ return w;
+}
+
+int
+main ()
+{
+ unsigned __int128 x = foo (1, &a[0], &a[1]);
+ unsigned __int128 y = foo (2, &b[0], &b[3]);
+ if ((unsigned long long) (x >> 64) != 0x0000004a13945dd3ULL
+ || (unsigned long long) x != 0x9b1c8443b3909d6aULL
+ || x != y)
+ __builtin_abort ();
+ return 0;
+}
--- /dev/null
+/* PR target/108862 */
+/* { dg-do run { target int128 } } */
+/* { dg-require-effective-target p9vector_hw } */
+/* { dg-options "-O2 -mdejagnu-cpu=power9" } */
+
+#include "../../gcc.dg/pr108862.c"