]> gcc.gnu.org Git - gcc.git/commitdiff
rs6000: Add support for vmsumcud and vec_msumc
authorBill Schmidt <wschmidt@linux.ibm.com>
Tue, 8 Feb 2022 16:36:14 +0000 (10:36 -0600)
committerBill Schmidt <wschmidt@linux.ibm.com>
Tue, 8 Feb 2022 18:39:16 +0000 (12:39 -0600)
2022-02-08  Bill Schmidt  <wschmidt@linux.ibm.com>

gcc/
* config/rs6000/rs6000-builtins.def (VMSUMCUD): New.
* config/rs6000/rs6000-overload.def (VEC_MSUMC): New.
* config/rs6000/vsx.md (UNSPEC_VMSUMCUD): New constant.
(vmsumcud): New define_insn.

gcc/testsuite/
* gcc.target/powerpc/vec-msumc.c: New test.

gcc/config/rs6000/rs6000-builtins.def
gcc/config/rs6000/rs6000-overload.def
gcc/config/rs6000/vsx.md
gcc/testsuite/gcc.target/powerpc/vec-msumc.c [new file with mode: 0644]

index 7f527b6709fbcb4da27d0e6313603c6ffecfe075..2d1e63fb20e8e5e85b9f35bd1bcce061f19be8b0 100644 (file)
   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 {}
 
index cdc703e97642316d5ee77a067d6de5ea347e1efa..49a6104ddd26f610d2fac1b38b57244f6c8b1419 100644 (file)
   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
index c8c891e13f41b18f361f71f2510e758fe8357a2c..2f5a2f7828dee81bc50bffa758f0e43358276379 100644 (file)
    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")]
+)
diff --git a/gcc/testsuite/gcc.target/powerpc/vec-msumc.c b/gcc/testsuite/gcc.target/powerpc/vec-msumc.c
new file mode 100644 (file)
index 0000000..524a222
--- /dev/null
@@ -0,0 +1,39 @@
+/* { 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;
+}
This page took 0.088893 seconds and 5 git commands to generate.