1  /* { dg-do compile } */
       2  /* { dg-options "-mavx512fp16 -mavx512vl -O2" } */
       3  
       4  typedef _Float16 v8hf __attribute__((vector_size (16)));
       5  typedef _Float16 v16hf __attribute__((vector_size (32)));
       6  typedef _Float16 v32hf __attribute__((vector_size (64)));
       7  
       8  #define VEC_EXTRACT(V,S,IDX)			\
       9    S						\
      10    __attribute__((noipa))			\
      11    vec_extract_##V##_##IDX (V v)			\
      12    {						\
      13      return v[IDX];				\
      14    }
      15  
      16  #define VEC_SET(V,S,IDX)			\
      17    V						\
      18    __attribute__((noipa))			\
      19    vec_set_##V##_##IDX (V v, S s)		\
      20    {						\
      21      v[IDX] = s;				\
      22      return v;					\
      23    }
      24  
      25  v8hf
      26  vec_init_v8hf (_Float16 a1, _Float16 a2, _Float16 a3, _Float16 a4, _Float16 a5,
      27  _Float16 a6, _Float16 a7, _Float16 a8)
      28  {
      29      return __extension__ (v8hf) {a1, a2, a3, a4, a5, a6, a7, a8};
      30  }
      31  
      32  /* { dg-final { scan-assembler-times "vpunpcklwd" 4 } } */
      33  /* { dg-final { scan-assembler-times "vpunpckldq" 2 } } */
      34  /* { dg-final { scan-assembler-times "vpunpcklqdq" 1 } } */
      35  
      36  VEC_EXTRACT (v8hf, _Float16, 4);
      37  VEC_EXTRACT (v16hf, _Float16, 3);
      38  VEC_EXTRACT (v16hf, _Float16, 8);
      39  VEC_EXTRACT (v16hf, _Float16, 15);
      40  VEC_EXTRACT (v32hf, _Float16, 5);
      41  VEC_EXTRACT (v32hf, _Float16, 8);
      42  VEC_EXTRACT (v32hf, _Float16, 14);
      43  VEC_EXTRACT (v32hf, _Float16, 16);
      44  VEC_EXTRACT (v32hf, _Float16, 24);
      45  VEC_EXTRACT (v32hf, _Float16, 28);
      46  /* { dg-final { scan-assembler-times "vpsrldq\[\t ]*\\\$8" 2 } } */
      47  /* { dg-final { scan-assembler-times "vpsrldq\[\t ]*\\\$6" 1 } } */
      48  /* { dg-final { scan-assembler-times "vpsrldq\[\t ]*\\\$14" 1 } } */
      49  /* { dg-final { scan-assembler-times "vpsrldq\[\t ]*\\\$10" 1 } } */
      50  /* { dg-final { scan-assembler-times "vpsrldq\[\t ]*\\\$12" 1 } } */
      51  /* { dg-final { scan-assembler-times "vextract" 9 } } */
      52  
      53  VEC_SET (v8hf, _Float16, 4);
      54  VEC_SET (v16hf, _Float16, 3);
      55  VEC_SET (v16hf, _Float16, 8);
      56  VEC_SET (v16hf, _Float16, 15);
      57  VEC_SET (v32hf, _Float16, 5);
      58  VEC_SET (v32hf, _Float16, 8);
      59  VEC_SET (v32hf, _Float16, 14);
      60  VEC_SET (v32hf, _Float16, 16);
      61  VEC_SET (v32hf, _Float16, 24);
      62  VEC_SET (v32hf, _Float16, 28);
      63  /* { dg-final { scan-assembler-times "vpbroadcastw" 10 { target { ! ia32 } } } } */
      64  /* { dg-final { scan-assembler-times "vpblendw" 4 { target { ! ia32 } } } } */
      65  
      66  /* { dg-final { scan-assembler-times "vpbroadcastw" 9 { target ia32 } } } */
      67  /* { dg-final { scan-assembler-times "vpblendw" 3 { target ia32 } } } */
      68  /* { dg-final { scan-assembler-times "vpinsrw" 1 { target ia32 } } } */
      69  
      70  /* { dg-final { scan-assembler-times "vpblendd" 3 } } */