Hi,

on 2024/2/21 01:55, Carl Love wrote:
> 
> GCC maintainers:
> 
> This patch fixes the arguments and return type for the various 
> __builtin_vsx_cmple* built-ins.  They were defined as signed but should have 
> been defined as unsigned.
> 
> The patch has been tested on Power 10 with no regressions.
> 
> Please let me know if this patch is acceptable for mainline.  Thanks.
> 
>                       Carl 
> 
> -----------------------------------------------------
> 
> rs6000, Fix __builtin_vsx_cmple* args and documentation, builtins
> 
> The built-ins __builtin_vsx_cmple_u16qi, __builtin_vsx_cmple_u2di,
> __builtin_vsx_cmple_u4si and __builtin_vsx_cmple_u8hi should take
> unsigned arguments and return an unsigned result.  This patch changes
> the arguments and return type from signed to unsigned.

Apparently the types mismatch the corresponding bif names, but I wonder
if these __builtin_vsx_cmple* actually provide some value?

Users can just use vec_cmple as PVIPR defines, as altivec.h shows,
vec_cmple gets redefined with vec_cmpge, these are not for the underlying
implementation.  I also checked the documentation of openXL (xl compiler),
they don't support these either (these are not for compability).

So can we just remove these bifs?

> 
> The documentation for the signed and unsigned versions of
> __builtin_vsx_cmple is missing from extend.texi.  This patch adds the
> missing documentation.
> 
> Test cases are added for each of the signed and unsigned built-ins.
> 
> gcc/ChangeLog:
>       * config/rs6000/rs6000-builtins.def (__builtin_vsx_cmple_u16qi,
>       __builtin_vsx_cmple_u2di, __builtin_vsx_cmple_u4si): Change
>       arguments and return from signed to unsigned.
>       * doc/extend.texi (__builtin_vsx_cmple_16qi,
>       __builtin_vsx_cmple_8hi, __builtin_vsx_cmple_4si,
>       __builtin_vsx_cmple_u16qi, __builtin_vsx_cmple_u8hi,
>       __builtin_vsx_cmple_u4si): Add documentation.
> 
> gcc/testsuite/ChangeLog:
>       * gcc.target/powerpc/vsx-cmple.c: New test file.
> ---
>  gcc/config/rs6000/rs6000-builtins.def        |  10 +-
>  gcc/doc/extend.texi                          |  23 ++++
>  gcc/testsuite/gcc.target/powerpc/vsx-cmple.c | 127 +++++++++++++++++++
>  3 files changed, 155 insertions(+), 5 deletions(-)
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vsx-cmple.c
> 
> diff --git a/gcc/config/rs6000/rs6000-builtins.def 
> b/gcc/config/rs6000/rs6000-builtins.def
> index 3bc7fed6956..d66a53a0fab 100644
> --- a/gcc/config/rs6000/rs6000-builtins.def
> +++ b/gcc/config/rs6000/rs6000-builtins.def
> @@ -1349,16 +1349,16 @@
>    const vss __builtin_vsx_cmple_8hi (vss, vss);
>      CMPLE_8HI vector_ngtv8hi {}
>  
> -  const vsc __builtin_vsx_cmple_u16qi (vsc, vsc);
> +  const vuc __builtin_vsx_cmple_u16qi (vuc, vuc);
>      CMPLE_U16QI vector_ngtuv16qi {}
>  
> -  const vsll __builtin_vsx_cmple_u2di (vsll, vsll);
> +  const vull __builtin_vsx_cmple_u2di (vull, vull);
>      CMPLE_U2DI vector_ngtuv2di {}
>  
> -  const vsi __builtin_vsx_cmple_u4si (vsi, vsi);
> +  const vui __builtin_vsx_cmple_u4si (vui, vui);
>      CMPLE_U4SI vector_ngtuv4si {}
>  
> -  const vss __builtin_vsx_cmple_u8hi (vss, vss);
> +  const vus __builtin_vsx_cmple_u8hi (vus, vus);
>      CMPLE_U8HI vector_ngtuv8hi {}
>  
>    const vd __builtin_vsx_concat_2df (double, double);
> @@ -1769,7 +1769,7 @@
>    const vf __builtin_vsx_xvcvuxdsp (vull);
>      XVCVUXDSP vsx_xvcvuxdsp {}
>  
> -  const vd __builtin_vsx_xvcvuxwdp (vsi);
> +  const vd __builtin_vsx_xvcvuxwdp (vui);
>      XVCVUXWDP vsx_xvcvuxwdp {}

This change is unexpected, it should not be in this sub-patch. :)

>  
>    const vf __builtin_vsx_xvcvuxwsp (vsi);
> diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi
> index 2b8ba1949bf..4d8610f6aa8 100644
> --- a/gcc/doc/extend.texi
> +++ b/gcc/doc/extend.texi
> @@ -22522,6 +22522,29 @@ if the VSX instruction set is available.  The 
> @samp{vec_vsx_ld} and
>  @samp{vec_vsx_st} built-in functions always generate the VSX @samp{LXVD2X},
>  @samp{LXVW4X}, @samp{STXVD2X}, and @samp{STXVW4X} instructions.
>  
> +
> +@smallexample
> +vector signed char __builtin_vsx_cmple_16qi (vector signed char,
> +                                             vector signed char);
> +vector signed short __builtin_vsx_cmple_8hi (vector signed short,
> +                                             vector signed short);
> +vector signed int __builtin_vsx_cmple_4si (vector signed int,
> +                                             vector signed int);
> +vector unsigned char __builtin_vsx_cmple_u16qi (vector unsigned char,
> +                                                vector unsigned char);
> +vector unsigned short __builtin_vsx_cmple_u8hi (vector unsigned short,
> +                                                vector unsigned short);
> +vector unsigned int __builtin_vsx_cmple_u4si (vector unsigned int,
> +                                              vector unsigned int);
> +@end smallexample

We don't document any vsx_cmp*, that's why I thought they acts as internal
implementation for the external interfaces vec_cmp*, but as mentioned above
these eight (missing 2 DI, so 6 here) ones are useless.

BR,
Kewen

> +
> +The builti-ins @code{__builtin_vsx_cmple_16qi}, 
> @code{__builtin_vsx_cmple_8hi},
> +@code{__builtin_vsx_cmple_4si}, @code{__builtin_vsx_cmple_u16qi},
> +@code{__builtin_vsx_cmple_u8hi} and @code{__builtin_vsx_cmple_u4si} compare
> +vectors of their defined type.  The corresponding result element is set to
> +all ones if the two argument elements are less than or equal and all zeros
> +otherwise.
> +
>  @node PowerPC AltiVec Built-in Functions Available on ISA 2.07
>  @subsubsection PowerPC AltiVec Built-in Functions Available on ISA 2.07
>  
> diff --git a/gcc/testsuite/gcc.target/powerpc/vsx-cmple.c 
> b/gcc/testsuite/gcc.target/powerpc/vsx-cmple.c
> new file mode 100644
> index 00000000000..081817b4ba3
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vsx-cmple.c
> @@ -0,0 +1,127 @@
> +/* { dg-do run } */
> +/* { dg-require-effective-target powerpc_altivec_ok } */
> +/* { dg-options "-maltivec -O2 -save-temps" } */
> +
> +#define DEBUG 0
> +
> +#include <altivec.h>
> +
> +#if DEBUG
> +#include <stdio.h>
> +#include <stdlib.h>
> +#endif
> +
> +void abort (void);
> +
> +#if DEBUG
> +  #define ACTION(NAME, TYPE_NAME)                                         \
> +  printf ("test_vsx_cmple_%s: result_%s[%d] = 0x%x, expected_result_%s[%d] = 
> 0x%x\n", \
> +       #NAME, #TYPE_NAME, i, result_##TYPE_NAME[i],                    \
> +       #TYPE_NAME, i, (int)expected_result_##TYPE_NAME[i]);
> +#else
> +  #define ACTION(NAME, TYPE_NAME)                                         \
> +  abort();
> +#endif
> +
> +#define TEST(NAME, TYPE, TYPE_NAME)                                  \
> +void test_vsx_cmple_##NAME (vector TYPE arg1_##TYPE_NAME,               \
> +                         vector TYPE arg2_##TYPE_NAME,               \
> +                         vector TYPE expected_result_##TYPE_NAME)    \
> +{                                                                       \
> +  vector TYPE result_##TYPE_NAME;                                    \
> +  int i, len = 16/sizeof(TYPE);                                              
> \
> +                                                                        \
> +  result_##TYPE_NAME = __builtin_vsx_cmple_##NAME (arg1_##TYPE_NAME,    \
> +                                                arg2_##TYPE_NAME);   \
> +  for (i = 0; i < len; i++)                                             \
> +    if (result_##TYPE_NAME[i] != expected_result_##TYPE_NAME[i])        \
> +      ACTION(TYPE, TYPE_NAME)                                           \
> +}
> +
> +int main ()
> +{
> +
> +  vector signed char vsc_arg1, vsc_arg2, vsc_expected_result;
> +  vector signed short vsh_arg1, vsh_arg2, vsh_expected_result;
> +  vector signed int vsi_arg1, vsi_arg2, vsi_expected_result;
> +  vector signed long long vsll_arg1, vsll_arg2, vsll_expected_result;
> +  vector unsigned char vuc_arg1, vuc_arg2, vuc_expected_result;
> +  vector unsigned short vuh_arg1, vuh_arg2, vuh_expected_result;
> +  vector unsigned int vui_arg1, vui_arg2, vui_expected_result;
> +  vector unsigned long long vull_arg1, vull_arg2, vull_expected_result;
> +
> +  vsc_arg1 = (vector signed char) {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
> +                                14, 15, 16};
> +  vsc_arg2 = (vector signed char) {11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
> +                                21, 22, 23, 24, 25, 26};
> +  vsc_expected_result = (vector signed char) {0xFF, 0xFF, 0xFF, 0xFF,
> +                                           0xFF, 0xFF, 0xFF, 0xFF,
> +                                           0xFF, 0xFF, 0xFF, 0xFF,
> +                                           0xFF, 0xFF, 0xFF, 0xFF};
> +  /* Test for __builtin_vsx_cmple_16qi */
> +  TEST (16qi, signed char, vsc)
> +  test_vsx_cmple_16qi (vsc_arg1, vsc_arg2, vsc_expected_result);
> +
> +  vsh_arg1 = (vector signed short) {1, 2, 3, 4, 5, 6, 7, 8};
> +  vsh_arg2 = (vector signed short) {11, 12, 13, 14, 15, 16, 17, 18};
> +  vsh_expected_result = (vector signed short) {0xFFFF, 0xFFFF, 0xFFFF, 
> 0xFFFF,
> +                                            0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF};
> +  /* Test for __builtin_vsx_cmple_8hi */
> +  TEST (8hi, signed short, vsh)
> +  test_vsx_cmple_8hi (vsh_arg1, vsh_arg2, vsh_expected_result);
> +
> +  vsi_arg1 = (vector signed int) {1, 2, 3, 4};
> +  vsi_arg2 = (vector signed int) {11, 12, 13, 14};
> +  vsi_expected_result = (vector signed int) {0xFFFFFFFF, 0xFFFFFFFF,
> +                                          0xFFFFFFFF, 0xFFFFFFFF};
> +  /* Test for __builtin_vsx_cmple_4si */
> +  TEST (4si, signed int, vsi)
> +  test_vsx_cmple_4si (vsi_arg1, vsi_arg2, vsi_expected_result);
> +
> +  vsll_arg1 = (vector signed long long) {1, 2};
> +  vsll_arg2 = (vector signed long long) {11, 12};
> +  vsll_expected_result = (vector signed long long) {0xFFFFFFFFFFFFFFFF,
> +                                                 0xFFFFFFFFFFFFFFFF};
> +  /* Test for __builtin_vsx_cmple_2di */
> +  TEST (2di, signed long long, vsll)
> +  test_vsx_cmple_2di (vsll_arg1, vsll_arg2, vsll_expected_result);
> +
> +  vuc_arg1 = (vector unsigned char) {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 
> 13,
> +                                  14, 15, 16};
> +  vuc_arg2 = (vector unsigned char) {11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 
> 21,
> +                                  22, 23, 24, 25, 26};
> +  vuc_expected_result = (vector unsigned char) {0xFF, 0xFF, 0xFF, 0xFF,
> +                                             0xFF, 0xFF, 0xFF, 0xFF,
> +                                             0xFF, 0xFF, 0xFF, 0xFF,
> +                                             0xFF, 0xFF, 0xFF, 0xFF};
> +  /* Test for __builtin_vsx_cmple_u16qi */
> +  TEST (u16qi, unsigned char, vuc)
> +  test_vsx_cmple_u16qi (vuc_arg1, vuc_arg2, vuc_expected_result);
> +
> +  vuh_arg1 = (vector unsigned short) {1, 2, 3, 4, 5, 6, 7, 8};
> +  vuh_arg2 = (vector unsigned short) {11, 12, 13, 14, 15, 16, 17, 18};
> +  vuh_expected_result = (vector unsigned short) {0xFFFF, 0xFFFF,
> +                                              0xFFFF, 0xFFFF,
> +                                              0xFFFF, 0xFFFF,
> +                                              0xFFFF, 0xFFFF};
> +  /* Test for __builtin_vsx_cmple_u8hi */
> +  TEST (u8hi, unsigned short, vuh)
> +  test_vsx_cmple_u8hi (vuh_arg1, vuh_arg2, vuh_expected_result);
> +
> +  vui_arg1 = (vector unsigned int) {1, 2, 3, 4};
> +  vui_arg2 = (vector unsigned int) {11, 12, 13, 14};
> +  vui_expected_result = (vector unsigned int) {0xFFFFFFFF, 0xFFFFFFFF,
> +                                            0xFFFFFFFF, 0xFFFFFFFF};
> +  /* Test for __builtin_vsx_cmple_u4si */
> +  TEST (u4si, unsigned int, vui)
> +  test_vsx_cmple_u4si (vui_arg1, vui_arg2, vui_expected_result);
> +
> +  vull_arg1 = (vector unsigned long long) {1, 2};
> +  vull_arg2 = (vector unsigned long long) {11, 12};
> +  vull_expected_result = (vector unsigned long long) {0xFFFFFFFFFFFFFFFF,
> +                                                   0xFFFFFFFFFFFFFFFF};
> +  /* Test for __builtin_vsx_cmple_u2di */
> +  TEST (u2di, unsigned long long, vull)
> +  test_vsx_cmple_u2di (vull_arg1, vull_arg2, vull_expected_result);
> +  return 0;
> +}

Reply via email to