1  /* { dg-do compile } */
       2  /* { dg-options "-mf16c -msse2 -mno-avx2 -O2" } */
       3  
       4  typedef __bf16 v8bf __attribute__ ((__vector_size__ (16)));
       5  typedef __bf16 v16bf __attribute__ ((__vector_size__ (32)));
       6  
       7  #define VEC_EXTRACT(V,S,IDX)			\
       8    S						\
       9    __attribute__((noipa))			\
      10    vec_extract_##V##_##IDX (V v)			\
      11    {						\
      12      return v[IDX];				\
      13    }
      14  
      15  #define VEC_SET(V,S,IDX)			\
      16    V						\
      17    __attribute__((noipa))			\
      18    vec_set_##V##_##IDX (V v, S s)		\
      19    {						\
      20      v[IDX] = s;				\
      21      return v;					\
      22    }
      23  
      24  v8bf
      25  vec_init_v8bf (__bf16 a1, __bf16 a2, __bf16 a3, __bf16 a4,
      26  	       __bf16 a5,  __bf16 a6, __bf16 a7, __bf16 a8)
      27  {
      28      return __extension__ (v8bf) {a1, a2, a3, a4, a5, a6, a7, a8};
      29  }
      30  
      31  v16bf
      32  vec_init_v16bf (__bf16 a1, __bf16 a2, __bf16 a3, __bf16 a4,
      33  	       __bf16 a5,  __bf16 a6, __bf16 a7, __bf16 a8,
      34  	       __bf16 a9,  __bf16 a10, __bf16 a11, __bf16 a12,
      35  	       __bf16 a13,  __bf16 a14, __bf16 a15, __bf16 a16)
      36  {
      37      return __extension__ (v16bf) {a1, a2, a3, a4, a5, a6, a7, a8,
      38  				  a9, a10, a11, a12, a13, a14, a15, a16};
      39  }
      40  
      41  v8bf
      42  vec_init_dup_v8bf (__bf16 a1)
      43  {
      44      return __extension__ (v8bf) {a1, a1, a1, a1, a1, a1, a1, a1};
      45  }
      46  
      47  v16bf
      48  vec_init_dup_v16bf (__bf16 a1)
      49  {
      50      return __extension__ (v16bf) {a1, a1, a1, a1, a1, a1, a1, a1,
      51  				  a1, a1, a1, a1, a1, a1, a1, a1};
      52  }
      53  
      54  /* { dg-final { scan-assembler-times "vpunpcklwd" 12 } } */
      55  /* { dg-final { scan-assembler-times "vpunpckldq" 6 } } */
      56  /* { dg-final { scan-assembler-times "vpunpcklqdq" 3 } } */
      57  
      58  VEC_EXTRACT (v8bf, __bf16, 0);
      59  VEC_EXTRACT (v8bf, __bf16, 4);
      60  VEC_EXTRACT (v16bf, __bf16, 0);
      61  VEC_EXTRACT (v16bf, __bf16, 3);
      62  VEC_EXTRACT (v16bf, __bf16, 8);
      63  VEC_EXTRACT (v16bf, __bf16, 15);
      64  /* { dg-final { scan-assembler-times "vpsrldq\[\t ]*\\\$8" 1 } } */
      65  /* { dg-final { scan-assembler-times "vpsrldq\[\t ]*\\\$6" 1 } } */
      66  /* { dg-final { scan-assembler-times "vpsrldq\[\t ]*\\\$14" 1 } } */
      67  /* { dg-final { scan-assembler-times "vextract" 4 } } */
      68  
      69  VEC_SET (v8bf, __bf16, 4);
      70  VEC_SET (v16bf, __bf16, 3);
      71  VEC_SET (v16bf, __bf16, 8);
      72  VEC_SET (v16bf, __bf16, 15);
      73  /* { dg-final { scan-assembler-times "vpblendw" 3 { target { ! ia32 } } } } */
      74  
      75  /* { dg-final { scan-assembler-times "vpinsrw" 30 { target ia32 } } } */
      76