1  /* { dg-do compile } */
       2  /* { dg-options "-O2 -mavx512fp16 -mavx512vl -ftree-slp-vectorize -mprefer-vector-width=512" } */
       3  
       4  extern double df[8];
       5  extern float sf[16];
       6  extern _Float16 hf[32];
       7  
       8  #define DO_PRAGMA(X) _Pragma(#X)
       9  
      10  #define TRUNCHFVV(size, mode)	    \
      11    void __attribute__ ((noinline, noclone))  \
      12  truncv##size##mode##v##size##hf ()   \
      13  {\
      14    int i;  \
      15    DO_PRAGMA (GCC unroll size)	\
      16    for (i = 0; i < size; i++)  \
      17      hf[i] = mode[i];  \
      18  }
      19  
      20  #define EXTENDHFVV(size, mode)	    \
      21    void __attribute__ ((noinline, noclone))  \
      22  extendv##size##hf##v##size##mode ()   \
      23  {\
      24    int i;  \
      25    DO_PRAGMA (GCC unroll size)	\
      26    for (i = 0; i < size; i++)  \
      27      mode[i] = hf[i];  \
      28  }
      29  
      30  TRUNCHFVV(8, df)
      31  TRUNCHFVV(4, df)
      32  TRUNCHFVV(2, df)
      33  TRUNCHFVV(16, sf)
      34  TRUNCHFVV(8, sf)
      35  TRUNCHFVV(4, sf)
      36  EXTENDHFVV(8, df)
      37  EXTENDHFVV(4, df)
      38  EXTENDHFVV(2, df)
      39  EXTENDHFVV(16, sf)
      40  EXTENDHFVV(8, sf)
      41  EXTENDHFVV(4, sf)
      42  
      43  /* { dg-final { scan-assembler-times "vcvtpd2phz\[ \\t\]+\[^\{\n\]*\[^\n\r]*%xmm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */
      44  /* { dg-final { scan-assembler-times "vcvtpd2phy\[ \\t\]+\[^\{\n\]*\[^\n\r]*%xmm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */
      45  /* { dg-final { scan-assembler-times "vcvtpd2phx\[ \\t\]+\[^\{\n\]*\[^\n\r]*%xmm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */
      46  /* { dg-final { scan-assembler-times "vcvtps2phx\[ \\t\]+\[^\{\n\]*\[^\n\r]*%ymm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */
      47  /* { dg-final { scan-assembler-times "vcvtps2phxy\[ \\t\]+\[^\{\n\]*\[^\n\r]*%xmm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */
      48  /* { dg-final { scan-assembler-times "vcvtps2phxx\[ \\t\]+\[^\{\n\]*\[^\n\r]*%xmm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */
      49  /* { dg-final { scan-assembler-times "vcvtph2pd\[ \\t\]+\[^\{\n\]*\[^\n\r]*%zmm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */
      50  /* { dg-final { scan-assembler-times "vcvtph2pd\[ \\t\]+\[^\{\n\]*\[^\n\r]*%ymm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */
      51  /* { dg-final { scan-assembler-times "vcvtph2pd\[ \\t\]+\[^\{\n\]*\[^\n\r]*%xmm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */
      52  /* { dg-final { scan-assembler-times "vcvtph2psx\[ \\t\]+\[^\{\n\]*\[^\n\r]*%zmm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */
      53  /* { dg-final { scan-assembler-times "vcvtph2psx\[ \\t\]+\[^\{\n\]*\[^\n\r]*%ymm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */
      54  /* { dg-final { scan-assembler-times "vcvtph2psx\[ \\t\]+\[^\{\n\]*\[^\n\r]*%xmm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */
      55