diff options
author | Carl Love <cel@linux.ibm.com> | 2024-07-09 14:09:42 -0400 |
---|---|---|
committer | Thomas Koenig <tkoenig@gcc.gnu.org> | 2024-07-28 19:05:58 +0200 |
commit | 652670a35a0188b0e1d4a1735679e12db9b8faef (patch) | |
tree | fe8659b6a7272d8005bd4b5f58b2924b212dc107 /gcc | |
parent | 4c58169086fd844cc725d3b56077dd2b2eb962d6 (diff) | |
download | gcc-652670a35a0188b0e1d4a1735679e12db9b8faef.zip gcc-652670a35a0188b0e1d4a1735679e12db9b8faef.tar.gz gcc-652670a35a0188b0e1d4a1735679e12db9b8faef.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.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/config/rs6000/rs6000-builtins.def | 9 | ||||
-rw-r--r-- | 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 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; } |