1  /* { dg-do compile } */
       2  /* { dg-options "-O2 -ftree-vectorize -ffast-math" } */
       3  
       4  #include <stdint.h>
       5  
       6  #define REDUC(TYPE)						\
       7    TYPE reduc_##TYPE (TYPE *x, int count)			\
       8    {								\
       9      TYPE sum = 0;						\
      10      for (int i = 0; i < count; ++i)				\
      11        sum -= x[i];						\
      12      return sum;							\
      13    }
      14  
      15  REDUC (int8_t)
      16  REDUC (uint8_t)
      17  REDUC (int16_t)
      18  REDUC (uint16_t)
      19  REDUC (int32_t)
      20  REDUC (uint32_t)
      21  REDUC (int64_t)
      22  REDUC (uint64_t)
      23  REDUC (float)
      24  REDUC (double)
      25  
      26  /* { dg-final { scan-assembler-times {\tsub\tz[0-9]+\.b, p[0-7]/m} 2 } } */
      27  /* { dg-final { scan-assembler-times {\tsub\tz[0-9]+\.h, p[0-7]/m} 2 } } */
      28  /* { dg-final { scan-assembler-times {\tsub\tz[0-9]+\.s, p[0-7]/m} 2 } } */
      29  /* { dg-final { scan-assembler-times {\tsub\tz[0-9]+\.d, p[0-7]/m} 2 } } */
      30  /* { dg-final { scan-assembler-times {\tfsub\tz[0-9]+\.s, p[0-7]/m} 1 } } */
      31  /* { dg-final { scan-assembler-times {\tfsub\tz[0-9]+\.d, p[0-7]/m} 1 } } */
      32  
      33  /* { dg-final { scan-assembler-times {\tsub\t} 8 } } */
      34  /* { dg-final { scan-assembler-times {\tfsub\t} 2 } } */