const signed int __builtin_altivec_vstrihr_p (vss);
VSTRIHR_P vstrir_p_v8hi {}
+ const vuq __builtin_vsx_vmsumcud (vull, vull, vuq);
+ VMSUMCUD vmsumcud {}
+
const signed int __builtin_vsx_xvtlsbb_all_ones (vsc);
XVTLSBB_ONES xvtlsbbo {}
vuq __builtin_vec_msum (vull, vull, vuq);
VMSUMUDM VMSUMUDM_U
+[VEC_MSUMC, vec_msumc, __builtin_vec_msumc]
+ vuq __builtin_vec_msumc (vull, vull, vuq);
+ VMSUMCUD
+
[VEC_MSUMS, vec_msums, __builtin_vec_msums]
vui __builtin_vec_msums (vus, vus, vui);
VMSUMUHS
UNSPEC_REPLACE_UN
UNSPEC_VDIVES
UNSPEC_VDIVEU
+ UNSPEC_VMSUMCUD
UNSPEC_XXEVAL
UNSPEC_XXSPLTIW
UNSPEC_XXSPLTIDP
emit_move_insn (operands[0], tmp4);
DONE;
})
+
+;; vmsumcud
+(define_insn "vmsumcud"
+[(set (match_operand:V1TI 0 "register_operand" "+v")
+ (unspec:V1TI [(match_operand:V2DI 1 "register_operand" "v")
+ (match_operand:V2DI 2 "register_operand" "v")
+ (match_operand:V1TI 3 "register_operand" "v")]
+ UNSPEC_VMSUMCUD))]
+ "TARGET_POWER10"
+ "vmsumcud %0,%1,%2,%3"
+ [(set_attr "type" "veccomplex")]
+)
--- /dev/null
+/* { dg-do run { target { power10_hw } } } */
+/* { dg-require-effective-target power10_ok } */
+/* { dg-options "-mdejagnu-cpu=power10 -O2" } */
+#include <altivec.h>
+
+#define DEBUG 0
+
+#if DEBUG
+#include <stdio.h>
+#endif
+
+extern void abort (void);
+
+int
+main ()
+{
+ vector unsigned long long arg1, arg2;
+ vector unsigned __int128 arg3, result, expected;
+ unsigned __int128 c = (unsigned __int128) (-1); /* 2^128 - 1 */
+
+ arg1 = (vector unsigned long long) { 111ULL, 300ULL };
+ arg2 = (vector unsigned long long) { 700ULL, 222ULL };
+ arg3 = (vector unsigned __int128) { c };
+ expected = (vector unsigned __int128) { 1 };
+
+ result = vec_msumc (arg1, arg2, arg3);
+ if (result[0] != expected[0])
+ {
+#if DEBUG
+ printf ("ERROR, expected %d, result %d\n",
+ (unsigned int) expected[0],
+ (unsigned int) result[0]);
+#else
+ abort ();
+#endif
+ }
+
+ return 0;
+}