(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
aarch64/
sve/
vec_bool_cmp_1.c
       1  /* { dg-do compile } */
       2  /* { dg-options "-O2 -ftree-vectorize" } */
       3  
       4  #include <stdint.h>
       5  #include <stdbool.h>
       6  
       7  #define VEC_BOOL(NAME, OP, VARTYPE, INDUCTYPE)				\
       8  void __attribute__ ((noinline, noclone))				\
       9  vec_bool_##NAME##_##VARTYPE##_##INDUCTYPE (VARTYPE *dst, VARTYPE *src,	\
      10  					   INDUCTYPE start,		\
      11  					   INDUCTYPE n,			\
      12  					   INDUCTYPE mask)		\
      13  {									\
      14    for (INDUCTYPE i = 0; i < n; i++)					\
      15      {									\
      16        bool lhs = i >= start;						\
      17        bool rhs = (i & mask) != 0x3D;					\
      18        if (lhs OP rhs)							\
      19          dst[i] = src[i];						\
      20      }									\
      21  }
      22  
      23  #define TEST_OP(T, NAME, OP)			\
      24    T (NAME, OP, uint8_t, uint8_t)		\
      25    T (NAME, OP, uint16_t, uint16_t)		\
      26    T (NAME, OP, uint32_t, uint32_t)		\
      27    T (NAME, OP, uint64_t, uint64_t)		\
      28    T (NAME, OP, float, uint32_t)			\
      29    T (NAME, OP, double, uint64_t)
      30  
      31  #define TEST_ALL(T)				\
      32    TEST_OP (T, cmpeq, ==)			\
      33    TEST_OP (T, cmpne, !=)
      34  
      35  TEST_ALL (VEC_BOOL)
      36  
      37  /* Both cmpne and cmpeq loops will contain an exclusive predicate or.  */
      38  /* { dg-final { scan-assembler-times {\teors?\tp[0-9]*\.b, p[0-7]/z, p[0-9]*\.b, p[0-9]*\.b\n} 12 } } */
      39  /* cmpeq will also contain a masked predicate not operation, which gets
      40     folded to BIC.  */
      41  /* { dg-final { scan-assembler-times {\tbic\tp[0-9]+\.b, p[0-7]/z, p[0-9]+\.b, p[0-9]+\.b\n} 6 } } */