1  /* { dg-do compile } */
       2  /* { dg-options "-O2 -ftree-vectorize" } */
       3  
       4  #include <stdint.h>
       5  
       6  #define abd(A, B) (((A) < (B) ? (B) : (A)) - ((A) < (B) ? (A) : (B)))
       7  
       8  #define DEF_LOOP(TYPE)					\
       9    void __attribute__ ((noinline, noclone))		\
      10    test_##TYPE (TYPE *__restrict r, TYPE *__restrict a,	\
      11  	       TYPE *__restrict b, TYPE *__restrict c,	\
      12  	       int n)					\
      13    {							\
      14      for (int i = 0; i < n; ++i)				\
      15        r[i] = a[i] < 20 ? abd (b[i], c[i]) : 79;		\
      16    }
      17  
      18  #define TEST_ALL(T) \
      19    T (int8_t) \
      20    T (uint8_t) \
      21    T (int16_t) \
      22    T (uint16_t) \
      23    T (int32_t) \
      24    T (uint32_t) \
      25    T (int64_t) \
      26    T (uint64_t)
      27  
      28  TEST_ALL (DEF_LOOP)
      29  
      30  /* { dg-final { scan-assembler-times {\tsabd\tz[0-9]+\.b, p[0-7]/m,} 1 } } */
      31  /* { dg-final { scan-assembler-times {\tsabd\tz[0-9]+\.h, p[0-7]/m,} 1 } } */
      32  /* { dg-final { scan-assembler-times {\tsabd\tz[0-9]+\.s, p[0-7]/m,} 1 } } */
      33  /* { dg-final { scan-assembler-times {\tsabd\tz[0-9]+\.d, p[0-7]/m,} 1 } } */
      34  
      35  /* { dg-final { scan-assembler-times {\tuabd\tz[0-9]+\.b, p[0-7]/m,} 1 } } */
      36  /* { dg-final { scan-assembler-times {\tuabd\tz[0-9]+\.h, p[0-7]/m,} 1 } } */
      37  /* { dg-final { scan-assembler-times {\tuabd\tz[0-9]+\.s, p[0-7]/m,} 1 } } */
      38  /* { dg-final { scan-assembler-times {\tuabd\tz[0-9]+\.d, p[0-7]/m,} 1 } } */
      39  
      40  /* { dg-final { scan-assembler-not {\tmov\tz[^,]*z} } } */
      41  /* { dg-final { scan-assembler-not {\tmovprfx\t} } } */
      42  /* { dg-final { scan-assembler-times {\tsel\t} 8 } } */