Hi Carl,

on 2023/5/31 04:46, Carl Love wrote:
> GCC maintainers:
> 
> The following patch takes the tests in vsx-vector-6-p7.h,  vsx-vector-
> 6-p8.h, vsx-vector-6-p9.h and reorganizes them into a series of smaller
> test files by functionality rather than processor version.
> 
> 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: Update the vsx-vector-6.* tests.
> 
> The vsx-vector-6.h file is included into the processor specific test files
> vsx-vector-6.p7.c, vsx-vector-6.p8.c, and vsx-vector-6.p9.c.  The .h file
> contains a large number of vsx vector builtin tests.  The processor
> specific files contain the number of instructions that the tests are
> expected to generate for that processor.  The tests are compile only.
> 
> The tests are broken up into a seriers of files for related tests.  The
> new tests are runnable tests to verify the builtin argument types and the

But the newly added test cases are all with "dg-do compile", it doesn't
match what you said here.

> functional correctness of each test rather then verifying the type and
> number of instructions generated.

It's good to have more coverage with runnable case, but we miss some test
coverages on the expected insn counts which cases p{7,8,9}.c can provide
originally.  Unless we can ensure it's already tested somewhere else (do
we? it wasn't stated in this patch), I think we still need those checks.

> 
> gcc/testsuite/
>       * gcc.target/powerpc/vsx-vector-6-1op.c: New test file.
>       * gcc.target/powerpc/vsx-vector-6-2lop.c: New test file.
>       * gcc.target/powerpc/vsx-vector-6-2op.c: New test file.
>       * gcc.target/powerpc/vsx-vector-6-3op.c: New test file.
>       * gcc.target/powerpc/vsx-vector-6-cmp-all.c: New test file.
>       * gcc.target/powerpc/vsx-vector-6-cmp.c: New test file.
>       * gcc.target/powerpc/vsx-vector-6.h: Remove test file.
>       * gcc.target/powerpc/vsx-vector-6-p7.h: Remove test file.
>       * gcc.target/powerpc/vsx-vector-6-p8.h: Remove test file.
>       * gcc.target/powerpc/vsx-vector-6-p9.h: Remove test file.
> ---
>  .../powerpc/vsx-vector-6-func-1op.c           | 319 +++++++++++++
>  .../powerpc/vsx-vector-6-func-2lop.c          | 305 +++++++++++++
>  .../powerpc/vsx-vector-6-func-2op.c           | 278 ++++++++++++
>  .../powerpc/vsx-vector-6-func-3op.c           | 229 ++++++++++
>  .../powerpc/vsx-vector-6-func-cmp-all.c       | 429 ++++++++++++++++++
>  .../powerpc/vsx-vector-6-func-cmp.c           | 237 ++++++++++
>  .../gcc.target/powerpc/vsx-vector-6.h         | 154 -------
>  .../gcc.target/powerpc/vsx-vector-6.p7.c      |  43 --
>  .../gcc.target/powerpc/vsx-vector-6.p8.c      |  43 --
>  .../gcc.target/powerpc/vsx-vector-6.p9.c      |  42 --
>  10 files changed, 1797 insertions(+), 282 deletions(-)
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vsx-vector-6-func-1op.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vsx-vector-6-func-2lop.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vsx-vector-6-func-2op.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vsx-vector-6-func-3op.c
>  create mode 100644 
> gcc/testsuite/gcc.target/powerpc/vsx-vector-6-func-cmp-all.c
>  create mode 100644 gcc/testsuite/gcc.target/powerpc/vsx-vector-6-func-cmp.c
>  delete mode 100644 gcc/testsuite/gcc.target/powerpc/vsx-vector-6.h
>  delete mode 100644 gcc/testsuite/gcc.target/powerpc/vsx-vector-6.p7.c
>  delete mode 100644 gcc/testsuite/gcc.target/powerpc/vsx-vector-6.p8.c
>  delete mode 100644 gcc/testsuite/gcc.target/powerpc/vsx-vector-6.p9.c
> 
> diff --git a/gcc/testsuite/gcc.target/powerpc/vsx-vector-6-func-1op.c 
> b/gcc/testsuite/gcc.target/powerpc/vsx-vector-6-func-1op.c
> new file mode 100644
> index 00000000000..90a360ea158
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vsx-vector-6-func-1op.c
> @@ -0,0 +1,319 @@
> +/* { dg-do compile { target lp64 } } */
> +/* { dg-skip-if "" { powerpc*-*-darwin* } } */
> +/* { dg-options "-O2 -mdejagnu-cpu=power7" } */
> +
> +/* Functional test of the one operand vector builtins.  */
> +
> +#include <altivec.h>
> +#include <stdio.h>
> +#include <stdlib.h>
> +
> +#define DEBUG 0
> +
> +void abort (void);
> +
> +int
> +main () {
> +  int i;
> +  vector float f_src = { 125.44, 23.04, -338.56, 17.64};
> +  vector float f_result;
> +  vector float f_abs_expected = { 125.44, 23.04, 338.56, 17.64};
> +  vector float f_ceil_expected = { 126.0, 24.0, -338, 18.0};
> +  vector float f_floor_expected = { 125.0, 23.0, -339, 17.0};
> +  vector float f_nearbyint_expected = { 125.0, 23.0, -339, 18.0};
> +  vector float f_rint_expected = { 125.0, 23.0, -339, 18.0};
> +  vector float f_sqrt_expected = { 11.2, 4.8, 18.4, 4.2};
> +  vector float f_trunc_expected = { 125.0, 23.0, -338, 17};
> +
> +  vector double d_src = { 125.44, -338.56};
> +  vector double d_result;
> +  vector double d_abs_expected = { 125.44, 338.56};
> +  vector double d_ceil_expected = { 126.0, -338.0};
> +  vector double d_floor_expected = { 125.0, -339.0};
> +  vector double d_nearbyint_expected = { 125.0, -339.0};
> +  vector double d_rint_expected = { 125.0, -339.0};
> +  vector double d_sqrt_expected = { 11.2, 18.4};
> +  vector double d_trunc_expected = { 125.0, -338.0};
> +
> +  /* Abs, float */
> +  f_result = vec_abs (f_src);
> +
> +  if ((f_result[0] != f_abs_expected[0])
> +      || (f_result[1] != f_abs_expected[1])
> +      || (f_result[2] != f_abs_expected[2])
> +      || (f_result[3] != f_abs_expected[3]))
> +#if DEBUG
> +    {
> +      printf("ERROR: vec_abs (float) expected value does not match\n");
> +      printf("   expected[0] = %f; result[0] = %f\n",
> +          f_abs_expected[0], f_result[0]);
> +      printf("   expected[1] = %f; result[1] = %f\n",
> +          f_abs_expected[1], f_result[1]);
> +      printf("   expected[2] = %f; result[2] = %f\n",
> +          f_abs_expected[2], f_result[2]);
> +      printf("   expected[3] = %f; result[3] = %f\n",
> +          f_abs_expected[3], f_result[3]);
> +    }
> +#else
> +  abort();
> +#endif
> +
> +  /* Ceiling, float */
> +  f_result = vec_ceil (f_src);
> +
> +  if ((f_result[0] != f_ceil_expected[0])
> +      || (f_result[1] != f_ceil_expected[1])
> +      || (f_result[2] != f_ceil_expected[2])
> +      || (f_result[3] != f_ceil_expected[3]))
> +#if DEBUG
> +    {
> +      printf("ERROR: vec_ceil (float) expected value does not match\n");
> +      printf("   expected[0] = %f; result[0] = %f\n",
> +          f_ceil_expected[0], f_result[0]);
> +      printf("   expected[1] = %f; result[1] = %f\n",
> +          f_ceil_expected[1], f_result[1]);
> +      printf("   expected[2] = %f; result[2] = %f\n",
> +          f_ceil_expected[2], f_result[2]);
> +      printf("   expected[3] = %f; result[3] = %f\n",
> +          f_ceil_expected[3], f_result[3]);
> +    }
> +#else
> +  abort();
> +#endif

It looks that you can use some macro for different floating point functions
and its check and dumping here, since the basic skeleton are sharable, some
thing like:

#define FLOAT_CHECK(NAME)                                                      \
  f_result = vec_##NAME(f_src);                                                \
                                                                               \
  if ((f_result[0] != f_##NAME##_expected[0]) ||                               \
      (f_result[1] != f_##NAME##_expected[1]) ||                               \
      (f_result[2] != f_##NAME##_expected[2]) ||                               \
      (f_result[3] != f_##NAME##_expected[3])) {                               \
    if (DEBUG) {                                                               \
      printf("ERROR: vec_%s (float) expected value does not match\n", #NAME); \
      printf("   expected[0] = %f; result[0] = %f\n", f_##NAME##_expected[0],  \
             f_result[0]);                                                     \
      printf("   expected[1] = %f; result[1] = %f\n", f_##NAME##_expected[1],  \
             f_result[1]);                                                     \
      printf("   expected[2] = %f; result[2] = %f\n", f_##NAME##_expected[2],  \
             f_result[2]);                                                     \
      printf("   expected[3] = %f; result[3] = %f\n", f_##NAME##_expected[3],  \
             f_result[3]);                                                     \
    } else                                                                     \
      abort();                                                                 \
  }

...
FLOAT_CHECK(ceil)
FLOAT_CHECK(nearbyint)
...

I hope it can help to make it brief and avoid some copy & paste typos.
But since you already expanded them, it's fine to me if you wanted to keep
the expanded ones.  :)

> +
> +  /* Floor, float */
> +  f_result = vec_floor (f_src);
> +
> +  if ((f_result[0] != f_floor_expected[0])
> +      || (f_result[1] != f_floor_expected[1])
> +      || (f_result[2] != f_floor_expected[2])
> +      || (f_result[3] != f_floor_expected[3]))
> +#if DEBUG
> +    {
> +      printf("ERROR: vec_floor (float) expected value does not match\n");
> +      printf("   expected[0] = %f; result[0] = %f\n",
> +          f_floor_expected[0], f_result[0]);
> +      printf("   expected[1] = %f; result[1] = %f\n",
> +          f_floor_expected[1], f_result[1]);
> +      printf("   expected[2] = %f; result[2] = %f\n",
> +          f_floor_expected[2], f_result[2]);
> +      printf("   expected[3] = %f; result[3] = %f\n",
> +          f_floor_expected[3], f_result[3]);
> +    }
> +#else
> +  abort();
> +#endif
> +
> +  /* Nearby int, float */
> +  f_result = vec_nearbyint (f_src);
> +
> +  if ((f_result[0] != f_nearbyint_expected[0])
> +      || (f_result[1] != f_nearbyint_expected[1])
> +      || (f_result[2] != f_nearbyint_expected[2])
> +      || (f_result[3] != f_nearbyint_expected[3]))
> +#if DEBUG
> +    {
> +      printf("ERROR: vec_nearby (float) expected value does not match\n");
> +      printf("   expected[0] = %f; result[0] = %f\n",
> +          f_nearbyint_expected[0], f_result[0]);
> +      printf("   expected[1] = %f; result[1] = %f\n",
> +          f_nearbyint_expected[1], f_result[1]);
> +      printf("   expected[2] = %f; result[2] = %f\n",
> +          f_nearbyint_expected[2], f_result[2]);
> +      printf("   expected[3] = %f; result[3] = %f\n",
> +          f_nearbyint_expected[3], f_result[3]);
> +    }
> +#else
> +  abort();
> +#endif
> +
> +  /* Round, float */
> +  f_result = vec_rint (f_src);
> +
> +  if ((f_result[0] != f_rint_expected[0])
> +      || (f_result[1] != f_rint_expected[1])
> +      || (f_result[2] != f_rint_expected[2])
> +      || (f_result[3] != f_rint_expected[3]))
> +#if DEBUG
> +    {
> +      printf("ERROR: vec_rint (float) expected value does not match\n");
> +      printf("   expected[0] = %f; result[0] = %f\n",
> +          f_rint_expected[0], f_result[0]);
> +      printf("   expected[1] = %f; result[1] = %f\n",
> +          f_rint_expected[1], f_result[1]);
> +      printf("   expected[2] = %f; result[2] = %f\n",
> +          f_rint_expected[2], f_result[2]);
> +      printf("   expected[3] = %f; result[3] = %f\n",
> +          f_rint_expected[3], f_result[3]);
> +    }
> +#else
> +  abort();
> +#endif
> +
> +    /* Square, float */
> +  f_result = vec_sqrt (vec_abs(f_src));
> +
> +  if ((f_result[0] != f_sqrt_expected[0])
> +      || (f_result[1] != f_sqrt_expected[1])
> +      || (f_result[2] != f_sqrt_expected[2])
> +      || (f_result[3] != f_sqrt_expected[3]))
> +#if DEBUG
> +    {
> +      printf("ERROR: vec_sqrt (float) expected value does not match\n");
> +      printf("   expected[0] = %f; result[0] = %f\n",
> +          f_sqrt_expected[0], f_result[0]);
> +      printf("   expected[1] = %f; result[1] = %f\n",
> +          f_sqrt_expected[1], f_result[1]);
> +      printf("   expected[2] = %f; result[2] = %f\n",
> +          f_sqrt_expected[2], f_result[2]);
> +      printf("   expected[3] = %f; result[3] = %f\n",
> +          f_sqrt_expected[3], f_result[3]);
> +    }
> +#else
> +  abort();
> +#endif
> +
> +    /* Truncate, float */
> +  f_result = vec_trunc (f_src);
> +
> +  if ((f_result[0] != f_trunc_expected[0])
> +      || (f_result[1] != f_trunc_expected[1])
> +      || (f_result[2] != f_trunc_expected[2])
> +      || (f_result[3] != f_trunc_expected[3]))
> +#if DEBUG
> +    {
> +      printf("ERROR: vec_trunc (float) expected value does not match\n");
> +      printf("   expected[0] = %f; result[0] = %f\n",
> +          f_trunc_expected[0], f_result[0]);
> +      printf("   expected[1] = %f; result[1] = %f\n",
> +          f_trunc_expected[1], f_result[1]);
> +      printf("   expected[2] = %f; result[2] = %f\n",
> +          f_trunc_expected[2], f_result[2]);
> +      printf("   expected[3] = %f; result[3] = %f\n",
> +          f_trunc_expected[3], f_result[3]);
> +    }
> +#else
> +  abort();
> +#endif
> +
> 

snip ...

> +
> +  /* Vector select */
> +  d_result = vec_sel (d_src_a, d_src_b, ull_src_c);
> +
> +  if ((d_result[0] != d_selectu_expected[0])
> +      || (d_result[1] != d_selectu_expected[1]))
> +#if DEBUG
> +    {
> +      printf("ERROR: vec_msub (double, unsigned) expected value does not 
> match\n");

Copy & paste typo.

> +      printf("   expected[0] = %f; result[0] = %f\n",
> +          d_selectu_expected[0], d_result[0]);
> +      printf("   expected[1] = %f; result[1] = %f\n",
> +          d_selectu_expected[1], d_result[1]);
> +    }
> +#else
> +  abort();
> +#endif
> +
> +  d_result = vec_sel (d_src_a, d_src_b, bll_src_c);
> +
> +  if ((d_result[0] != d_selectb_expected[0])
> +      || (d_result[1] != d_selectb_expected[1]))
> +#if DEBUG
> +    {
> +      printf("ERROR: vec_msub (double, bool) expected value does not 
> match\n");

Ditto

> +      printf("   expected[0] = %f; result[0] = %f\n",
> +          d_selectb_expected[0], d_result[0]);
> +      printf("   expected[1] = %f; result[1] = %f\n",
> +          d_selectb_expected[1], d_result[1]);
> +    }
> +#else
> +  abort();
> +#endif
> +
> +  /* Vector permute */
> +  d_result = vec_perm (d_src_a, d_src_b, uc_src_c);
> +
> +  if ((d_result[0] != d_perm_expected[0])
> +      || (d_result[1] != d_perm_expected[1]))
> +#if DEBUG
> +    {
> +      printf("ERROR: vec_perf (unsigned char) expected value does not 
> match\n");

perf -> perm

> +      printf("   expected[0] = %f; result[0] = %f\n",
> +          d_perm_expected[0], d_result[0]);
> +      printf("   expected[1] = %f; result[1] = %f\n",
> +          d_perm_expected[1], d_result[1]);
> +    }
> +#else
> +  abort();
> +#endif
> +
> +  return 0;
> +}
> diff --git a/gcc/testsuite/gcc.target/powerpc/vsx-vector-6-func-cmp-all.c 
> b/gcc/testsuite/gcc.target/powerpc/vsx-vector-6-func-cmp-all.c
> new file mode 100644
> index 00000000000..4558918058e
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/vsx-vector-6-func-cmp-all.c
> @@ -0,0 +1,429 @@
> +/* { dg-do compile { target lp64 } } */
> +/* { dg-skip-if "" { powerpc*-*-darwin* } } */
> +/* { dg-options "-O2 -mdejagnu-cpu=power7" } */
> +
> +/* Functional test of the vector compare all builtins.  */
> +
> +#include <altivec.h>
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <stdbool.h>
> +
> +#define DEBUG 0
> +
> +void abort (void);
> +
> +int
> +main () {
> +  int i;
> +  vector float f_src_a = {126.0, 23.0, -338.0, 17.0};
> +  vector float f_src_b = {2.00, 23.0, 1.0, 4.0};
> +  bool f_result;
> +  bool f_all_eq_expected = 0;
> +  bool f_all_gt_expected = 0;
> +  bool f_all_ge_expected = 0;
> +  bool f_all_lt_expected = 0;
> +  bool f_all_le_expected = 0;
> +  bool f_all_nan_expected = 0;
> +  bool f_all_numeric_expected = 1;
> +  bool f_any_eq_expected = 1;
> +  bool f_any_gt_expected = 1;
> +  bool f_any_ge_expected = 1;
> +  bool f_any_lt_expected = 1;
> +  bool f_any_le_expected = 1;
> +  bool f_any_nan_expected = 0;
> +  bool f_any_numeric_expected = 1;
> +
> +  vector double d_src_a = { 125.44, -338.56};
> +  vector double d_src_b = d_src_a;
> +  bool d_result;
> +  bool d_all_eq_expected = 1;
> +  bool d_all_gt_expected = 0;
> +  bool d_all_ge_expected = 1;
> +  bool d_all_lt_expected = 0;
> +  bool d_all_le_expected = 1;
> +  bool d_all_nan_expected = 0;
> +  bool d_all_numeric_expected = 1;
> +  bool d_any_eq_expected = 1;
> +  bool d_any_gt_expected = 0;
> +  bool d_any_ge_expected = 1;
> +  bool d_any_lt_expected = 0;
> +  bool d_any_le_expected = 1;
> +  bool d_any_nan_expected = 0;
> +  bool d_any_numeric_expected = 1;
> +
> +  /* Compare all equal, float */
> +  f_result = vec_all_eq (f_src_a, f_src_b);
> +
> +  if (f_result != f_all_eq_expected)
> +#if DEBUG
> +    {
> +      printf("ERROR: vec_all_eq (float) expected value does not match\n");
> +      printf("   expected = %d; result = %d\n",
> +          f_all_eq_expected, f_result);
> +    }
> +#else
> +  abort();
> +#endif
> +
> +  /* Compare all greater than, float */
> +  f_result = vec_all_gt (f_src_a, f_src_b);
> +
> +  if (f_result != f_all_gt_expected)
> +#if DEBUG
> +    {
> +      printf("ERROR: vec_all_gt (float) expected value does not match\n");
> +      printf("   expected = %d; result = %d\n",
> +          f_all_gt_expected, f_result);
> +    }
> +#else
> +  abort();
> +#endif
> +
> +  /* Compare all greater than or equal, float */
> +  f_result = vec_all_ge (f_src_a, f_src_b);
> +
> +  if (f_result != f_all_ge_expected)
> +#if DEBUG
> +    {
> +      printf("ERROR: vec_all_ge(float) expected value does not match\n");

inconsistent style (missing one space after vec_all_ge).

> +      printf("   expected] = %d; result = %d\n", f_all_ge_expected, 
> f_result);
> +    }
> +#else
> +  abort();
> +#endif
> +
> +  /* Compare all less than, float */
> +  f_result = vec_all_lt (f_src_a, f_src_b);
> +
> +  if (f_result != f_all_lt_expected)
> +#if DEBUG
> +    {
> +      printf("ERROR: vec_all_lt (float) expected value does not match\n");
> +      printf("   expected = %d; result = %d\n", f_all_lt_expected, f_result);
> +    }
> +#else
> +  abort();
> +#endif
> +
> +  /* Compare all less than or equal, float */
> +  f_result = vec_all_le (f_src_a, f_src_b);
> +
> +  if (f_result != f_all_le_expected)
> +#if DEBUG
> +    {
> +      printf("ERROR: vec_all_le (float) expected value does not match\n");
> +      printf("   expected = %d; result = %d\n", f_all_le_expected, f_result);
> +    }
> +#else
> +  abort();
> +#endif
> +
> +  /* All NaN, float */
> +  f_result = vec_all_nan (f_src_a);
> +
> +  if (f_result != f_all_nan_expected)
> +#if DEBUG
> +    {
> +      printf("ERROR: vec_all_le (float) expected value does not match\n");

copy & paste typo.

> +      printf("   expected = %d; result = %d\n", f_all_nan_expected, 
> f_result);
> +    }
> +#else
> +  abort();
> +#endif
> +
> +  /* All numeric, float */
> +  f_result = vec_all_numeric (f_src_a);
> +
> +  if (f_result != f_all_numeric_expected)
> +#if DEBUG
> +    {
> +      printf("ERROR: vec_all_numeric (float) expected value does not 
> match\n");
> +      printf("   expected = %d; result = %d\n", f_all_numeric_expected,
> +          f_result);
> +    }
> +#else
> +  abort();
> +#endif
> +
> +
> +  /* Compare any equal, float */
> +  f_result = vec_any_eq (f_src_a, f_src_b);
> +
> +  if (f_result != f_any_eq_expected)
> +#if DEBUG
> +    {
> +      printf("ERROR: vec_any_eq (float) expected value does not match\n");
> +      printf("   expected = %d; result = %d\n",
> +          f_any_eq_expected, f_result);
> +    }
> +#else
> +  abort();
> +#endif
> +
> +  /* Compare any greater than, float */
> +  f_result = vec_any_gt (f_src_a, f_src_b);
> +
> +  if (f_result != f_any_gt_expected)
> +#if DEBUG
> +    {
> +      printf("ERROR: vec_any_gt (float) expected value does not match\n");
> +      printf("   expected = %d; result = %d\n",
> +          f_any_gt_expected, f_result);
> +    }
> +#else
> +  abort();
> +#endif
> +
> +  /* Compare any greater than or equal, float */
> +  f_result = vec_any_ge (f_src_a, f_src_b);
> +
> +  if (f_result != f_any_ge_expected)
> +#if DEBUG
> +    {
> +      printf("ERROR: vec_any_ge(float) expected value does not match\n");

missing one space.

> +      printf("   expected] = %d; result = %d\n", f_any_ge_expected, 
> f_result);
> +    }
> +#else
> +  abort();
> +#endif
> +
> +  /* Compare any less than, float */
> +  f_result = vec_any_lt (f_src_a, f_src_b);
> +
> +  if (f_result != f_any_lt_expected)
> +#if DEBUG
> +    {
> +      printf("ERROR: vec_any_lt (float) expected value does not match\n");
> +      printf("   expected = %d; result = %d\n", f_any_lt_expected, f_result);
> +    }
> +#else
> +  abort();
> +#endif
> +
> +  /* Compare any less than or equal, float */
> +  f_result = vec_any_le (f_src_a, f_src_b);
> +
> +  if (f_result != f_any_le_expected)
> +#if DEBUG
> +    {
> +      printf("ERROR: vec_any_le (float) expected value does not match\n");
> +      printf("   expected = %d; result = %d\n", f_any_le_expected, f_result);
> +    }
> +#else
> +  abort();
> +#endif
> +
> +  /* Any NaN, float */
> +  f_result = vec_any_nan (f_src_a);
> +
> +  if (f_result != f_any_nan_expected)
> +#if DEBUG
> +    {
> +      printf("ERROR: vec_any_le (float) expected value does not match\n");

typo, s/vec_any_le/vec_any_nan/

BR,
Kewen

Reply via email to