https://gcc.gnu.org/g:6689c587412547a995b81dce2cc2954dda98df59

commit r15-2327-g6689c587412547a995b81dce2cc2954dda98df59
Author: Carl Love <c...@linux.ibm.com>
Date:   Tue Jul 9 14:09:42 2024 -0400

    rs6000, remove __builtin_vsx_xvcmp* built-ins
    
    This patch removes the built-ins:
     __builtin_vsx_xvcmpeqsp, __builtin_vsx_xvcmpgesp,
     __builtin_vsx_xvcmpgtsp.
    
    which are similar to the recommended PVIPR documented overloaded
    vec_cmpeq, vec_cmpgt and vec_cmpge built-ins.
    
    The difference is that the overloaded built-ins return a vector of
    32-bit booleans.  The removed built-ins returned a vector of floats.
    
    The __builtin_vsx_xvcmpeqdp, __builtin_vsx_xvcmpgedp and
    __builtin_vsx_xvcmpgtdp are not removed as they are used by the
    overloaded vec_cmpeq, vec_cmpgt and vec_cmpge built-ins.
    
    The test cases for the __builtin_vsx_xvcmpeqsp, __builtin_vsx_xvcmpgesp,
    __builtin_vsx_xvcmpgtsp, __builtin_vsx_xvcmpeqdp,
    __builtin_vsx_xvcmpgedp and __builtin_vsx_xvcmpgtdp  are changed to use
    the overloaded vec_cmpeq, vec_cmpgt, vec_cmpge built-ins.  Use of the
    overloaded built-ins requires the result to be stored in a vector of
    boolean of the appropriate size or the result must be cast to the return
    type used by the original __builtin_vsx_xvcmp* built-ins.
    
    gcc/ChangeLog:
            * config/rs6000/rs6000-builtins.def (__builtin_vsx_xvcmpeqsp,
            __builtin_vsx_xvcmpgesp, __builtin_vsx_xvcmpgtsp): Remove
            definitions.
    
    gcc/testsuite/ChangeLog:
            * gcc.target/powerpc/vsx-builtin-3.c (do_cmp): Replace
            __builtin_vsx_xvcmp{eq,gt,ge}{sp,dp} by vec_cmp{eq,gt,ge}
            respectively and add explicit casts to vector {float,double}.
            Add more testing code assigning result to vector boolean types.

Diff:
---
 gcc/config/rs6000/rs6000-builtins.def            |  9 --------
 gcc/testsuite/gcc.target/powerpc/vsx-builtin-3.c | 28 ++++++++++++++++++------
 2 files changed, 21 insertions(+), 16 deletions(-)

diff --git a/gcc/config/rs6000/rs6000-builtins.def 
b/gcc/config/rs6000/rs6000-builtins.def
index ffbeff64d6d6..900488c72423 100644
--- a/gcc/config/rs6000/rs6000-builtins.def
+++ b/gcc/config/rs6000/rs6000-builtins.def
@@ -1579,18 +1579,12 @@
   const signed int __builtin_vsx_xvcmpeqdp_p (signed int, vd, vd);
     XVCMPEQDP_P vector_eq_v2df_p {pred}
 
-  const vf __builtin_vsx_xvcmpeqsp (vf, vf);
-    XVCMPEQSP vector_eqv4sf {}
-
   const vd __builtin_vsx_xvcmpgedp (vd, vd);
     XVCMPGEDP vector_gev2df {}
 
   const signed int __builtin_vsx_xvcmpgedp_p (signed int, vd, vd);
     XVCMPGEDP_P vector_ge_v2df_p {pred}
 
-  const vf __builtin_vsx_xvcmpgesp (vf, vf);
-    XVCMPGESP vector_gev4sf {}
-
   const signed int __builtin_vsx_xvcmpgesp_p (signed int, vf, vf);
     XVCMPGESP_P vector_ge_v4sf_p {pred}
 
@@ -1600,9 +1594,6 @@
   const signed int __builtin_vsx_xvcmpgtdp_p (signed int, vd, vd);
     XVCMPGTDP_P vector_gt_v2df_p {pred}
 
-  const vf __builtin_vsx_xvcmpgtsp (vf, vf);
-    XVCMPGTSP vector_gtv4sf {}
-
   const signed int __builtin_vsx_xvcmpgtsp_p (signed int, vf, vf);
     XVCMPGTSP_P vector_gt_v4sf_p {pred}
 
diff --git a/gcc/testsuite/gcc.target/powerpc/vsx-builtin-3.c 
b/gcc/testsuite/gcc.target/powerpc/vsx-builtin-3.c
index 60f91aad23c2..d67f97c8011d 100644
--- a/gcc/testsuite/gcc.target/powerpc/vsx-builtin-3.c
+++ b/gcc/testsuite/gcc.target/powerpc/vsx-builtin-3.c
@@ -156,13 +156,27 @@ int do_cmp (void)
 {
   int i = 0;
 
-  d[i][0] = __builtin_vsx_xvcmpeqdp (d[i][1], d[i][2]); i++;
-  d[i][0] = __builtin_vsx_xvcmpgtdp (d[i][1], d[i][2]); i++;
-  d[i][0] = __builtin_vsx_xvcmpgedp (d[i][1], d[i][2]); i++;
-
-  f[i][0] = __builtin_vsx_xvcmpeqsp (f[i][1], f[i][2]); i++;
-  f[i][0] = __builtin_vsx_xvcmpgtsp (f[i][1], f[i][2]); i++;
-  f[i][0] = __builtin_vsx_xvcmpgesp (f[i][1], f[i][2]); i++;
+  /* The __builtin_vsx_xvcmp[gt|ge|eq]dp and __builtin_vsx_xvcmp[gt|ge|eq]sp
+     have been removed in favor of the overloaded vec_cmpeq, vec_cmpgt and
+     vec_cmpge built-ins.  The __builtin_vsx_xvcmp* builtins returned a vector
+     result of the same type as the arguments.  The vec_cmp* built-ins return
+     a vector of boolenas of the same size as the arguments.  Thus the result
+     assignment must be to a boolean or cast to a boolean.  Test both cases.
+  */
+     
+  d[i][0] = (vector double) vec_cmpeq (d[i][1], d[i][2]); i++;
+  d[i][0] = (vector double) vec_cmpgt (d[i][1], d[i][2]); i++;
+  d[i][0] = (vector double) vec_cmpge (d[i][1], d[i][2]); i++;
+  bl[i][0] = vec_cmpeq (d[i][1], d[i][2]); i++;
+  bl[i][0] = vec_cmpgt (d[i][1], d[i][2]); i++;
+  bl[i][0] = vec_cmpge (d[i][1], d[i][2]); i++;
+
+  f[i][0] = (vector float) vec_cmpeq (f[i][1], f[i][2]); i++;
+  f[i][0] = (vector float) vec_cmpgt (f[i][1], f[i][2]); i++;
+  f[i][0] = (vector float) vec_cmpge (f[i][1], f[i][2]); i++;
+  bi[i][0] = vec_cmpeq (f[i][1], f[i][2]); i++;
+  bi[i][0] = vec_cmpgt (f[i][1], f[i][2]); i++;
+  bi[i][0] = vec_cmpge (f[i][1], f[i][2]); i++;
   return i;
 }

Reply via email to