1  /* { dg-do compile } */
       2  /* { dg-options "-O3" } */
       3  
       4  #pragma GCC target "+nosve"
       5  
       6  #define MAX(x, y) ((x) > (y) ? (x) : (y))
       7  #define MIN(x, y) ((x) < (y) ? (x) : (y))
       8  #define N 1024
       9  
      10  #define FUNC(T)								\
      11  void									\
      12  sabd_##T (signed T * restrict a, signed T * restrict b,		\
      13  		signed T * restrict out)				\
      14  {									\
      15    for (int i = 0; i < N; i++)						\
      16      out[i] = MAX (a[i], b[i]) - MIN (a[i], b[i]);			\
      17  }									\
      18  									\
      19  void									\
      20  uabd_##T (unsigned T * restrict a, unsigned T * restrict b,	\
      21  		  unsigned T * restrict out)				\
      22  {									\
      23    for (int i = 0; i < N; i++)						\
      24      out[i] = MAX (a[i], b[i]) - MIN (a[i], b[i]);			\
      25  }
      26  
      27  FUNC(char)
      28  FUNC(short)
      29  FUNC(int)
      30  
      31  /* { dg-final { scan-assembler-times "sabd\\tv\[0-9\]+\.16b, v\[0-9\]+\.16b, v\[0-9\]+\.16b" 1 } } */
      32  /* { dg-final { scan-assembler-times "uabd\\tv\[0-9\]+\.16b, v\[0-9\]+\.16b, v\[0-9\]+\.16b" 1 } } */
      33  /* { dg-final { scan-assembler-times "sabd\\tv\[0-9\]+\.8h, v\[0-9\]+\.8h, v\[0-9\]+\.8h" 1 } } */
      34  /* { dg-final { scan-assembler-times "uabd\\tv\[0-9\]+\.8h, v\[0-9\]+\.8h, v\[0-9\]+\.8h" 1 } } */
      35  /* { dg-final { scan-assembler-times "sabd\\tv\[0-9\]+\.4s, v\[0-9\]+\.4s, v\[0-9\]+\.4s" 1 } } */
      36  /* { dg-final { scan-assembler-times "uabd\\tv\[0-9\]+\.4s, v\[0-9\]+\.4s, v\[0-9\]+\.4s" 1 } } */