1  /* { dg-do compile } */
       2  /* { dg-options "-O2 -ftree-vectorize" } */
       3  
       4  #include <stdint.h>
       5  
       6  #define bit_and(A, B) ((A) & (B))
       7  #define bit_or(A, B) ((A) | (B))
       8  #define bit_xor(A, B) ((A) ^ (B))
       9  #define bit_bic(A, B) ((A) & ~(B))
      10  
      11  #define DEF_LOOP(TYPE, OP)				\
      12    void __attribute__ ((noinline, noclone))		\
      13    test_##TYPE##_##OP (TYPE *__restrict r,		\
      14  		      TYPE *__restrict a,		\
      15  		      TYPE *__restrict b,		\
      16  		      TYPE *__restrict c, int n)	\
      17    {							\
      18      for (int i = 0; i < n; ++i)				\
      19        r[i] = a[i] < 20 ? OP (b[i], c[i]) : a[i];	\
      20    }
      21  
      22  #define TEST_TYPE(T, TYPE) \
      23    T (TYPE, bit_and) \
      24    T (TYPE, bit_or) \
      25    T (TYPE, bit_xor) \
      26    T (TYPE, bit_bic)
      27  
      28  #define TEST_ALL(T) \
      29    TEST_TYPE (T, int8_t) \
      30    TEST_TYPE (T, uint8_t) \
      31    TEST_TYPE (T, int16_t) \
      32    TEST_TYPE (T, uint16_t) \
      33    TEST_TYPE (T, int32_t) \
      34    TEST_TYPE (T, uint32_t) \
      35    TEST_TYPE (T, int64_t) \
      36    TEST_TYPE (T, uint64_t)
      37  
      38  TEST_ALL (DEF_LOOP)
      39  
      40  /* { dg-final { scan-assembler-times {\tand\tz[0-9]+\.b, p[0-7]/m,} 2 } } */
      41  /* { dg-final { scan-assembler-times {\tand\tz[0-9]+\.h, p[0-7]/m,} 2 } } */
      42  /* { dg-final { scan-assembler-times {\tand\tz[0-9]+\.s, p[0-7]/m,} 2 } } */
      43  /* { dg-final { scan-assembler-times {\tand\tz[0-9]+\.d, p[0-7]/m,} 2 } } */
      44  
      45  /* { dg-final { scan-assembler-times {\torr\tz[0-9]+\.b, p[0-7]/m,} 2 } } */
      46  /* { dg-final { scan-assembler-times {\torr\tz[0-9]+\.h, p[0-7]/m,} 2 } } */
      47  /* { dg-final { scan-assembler-times {\torr\tz[0-9]+\.s, p[0-7]/m,} 2 } } */
      48  /* { dg-final { scan-assembler-times {\torr\tz[0-9]+\.d, p[0-7]/m,} 2 } } */
      49  
      50  /* { dg-final { scan-assembler-times {\teor\tz[0-9]+\.b, p[0-7]/m,} 2 } } */
      51  /* { dg-final { scan-assembler-times {\teor\tz[0-9]+\.h, p[0-7]/m,} 2 } } */
      52  /* { dg-final { scan-assembler-times {\teor\tz[0-9]+\.s, p[0-7]/m,} 2 } } */
      53  /* { dg-final { scan-assembler-times {\teor\tz[0-9]+\.d, p[0-7]/m,} 2 } } */
      54  
      55  /* { dg-final { scan-assembler-times {\tbic\tz[0-9]+\.b, p[0-7]/m,} 2 } } */
      56  /* { dg-final { scan-assembler-times {\tbic\tz[0-9]+\.h, p[0-7]/m,} 2 } } */
      57  /* { dg-final { scan-assembler-times {\tbic\tz[0-9]+\.s, p[0-7]/m,} 2 } } */
      58  /* { dg-final { scan-assembler-times {\tbic\tz[0-9]+\.d, p[0-7]/m,} 2 } } */
      59  
      60  /* { dg-final { scan-assembler-times {\tmovprfx\tz[0-9]+\.b, p[0-7]/m, z[0-9]+\.b\n} 8 } } */
      61  /* { dg-final { scan-assembler-times {\tmovprfx\tz[0-9]+\.h, p[0-7]/m, z[0-9]+\.h\n} 8 } } */
      62  /* { dg-final { scan-assembler-times {\tmovprfx\tz[0-9]+\.s, p[0-7]/m, z[0-9]+\.s\n} 8 } } */
      63  /* { dg-final { scan-assembler-times {\tmovprfx\tz[0-9]+\.d, p[0-7]/m, z[0-9]+\.d\n} 8 } } */
      64  
      65  /* { dg-final { scan-assembler-not {\tmov\tz[^,]*z} } } */
      66  /* { dg-final { scan-assembler-not {\tsel\t} } } */