GCC maintainers:
version 2, Updated patch comments, added missing ChangeLog. Fixed
unintended line removal.
The following patch removes the three __builtin_vsx_xvcmp[eq|ge|gt]sp
builtins as they similar to the overloaded vec_cmp[eq|ge|gt] built-ins.
The difference is the overloaded built-ins return a vector of boolean or
a vector of long long booleans where as the removed built-ins returned a
vector of floats or vector of doubles.
The tests for __builtin_vsx_xvcmp[eq|ge|gt]sp and
__builtin_vsx_xvcmp[eq|ge|gt]dp are updated to use the overloaded
vec_cmp[eq|ge|gt] built-in with the required changes for the return
type. Note __builtin_vsx_xvcmp[eq|ge|gt]dp are used internally.
The patches have been tested on a Power 10 LE system with no regressions.
Please let me know if the patch is acceptable for mainline. Thanks.
Carl
---------------------------------------------------------------------------------
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 (__builtin_vsx_xvcmpeqdp,
__builtin_vsx_xvcmpgtdp, __builtin_vsx_xvcmpgedp,
__builtin_vsx_xvcmpeqsp, __builtin_vsx_xvcmpgtsp,
__builtin_vsx_xvcmpgesp): Remove.
(vec_cmpeq, vec_cmpgt, vec_cmpge): Add tests for float
arguments that store result in boolean and cast result to
store result in float. Add tests for double arguments that
store the result in long long boolean and cast result to
double.
---
gcc/config/rs6000/rs6000-builtins.def | 9 ------
.../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 77eb0f7e406..47830b7dcb0 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 60f91aad23c..d67f97c8011 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;
}
--
2.45.2