aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Love <cel@linux.ibm.com>2024-07-09 14:09:42 -0400
committerCarl Love <cel@linux.ibm.com>2024-07-25 18:58:39 -0400
commit6689c587412547a995b81dce2cc2954dda98df59 (patch)
tree42ae9263fdf28b5b0efb5cdaf41bfc52ed3d3ba1
parentea435261ad58ea3eb811cbd16d085976964bff2c (diff)
downloadgcc-6689c587412547a995b81dce2cc2954dda98df59.zip
gcc-6689c587412547a995b81dce2cc2954dda98df59.tar.gz
gcc-6689c587412547a995b81dce2cc2954dda98df59.tar.bz2
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.
-rw-r--r--gcc/config/rs6000/rs6000-builtins.def9
-rw-r--r--gcc/testsuite/gcc.target/powerpc/vsx-builtin-3.c28
2 files changed, 21 insertions, 16 deletions
diff --git a/gcc/config/rs6000/rs6000-builtins.def b/gcc/config/rs6000/rs6000-builtins.def
index ffbeff6..900488c 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 60f91aa..d67f97c 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;
}