1  /* PR target/92658 */
       2  /* { dg-do compile } */
       3  /* { dg-options "-O2 -ftree-vectorize -mavx512f -mprefer-vector-width=512" } */
       4  
       5  typedef unsigned char v8qi __attribute__((vector_size (8)));
       6  typedef unsigned char v16qi __attribute__((vector_size (16)));
       7  typedef unsigned short v8hi __attribute__((vector_size (16)));
       8  typedef unsigned short v16hi __attribute__((vector_size (32)));
       9  typedef unsigned int v8si __attribute__((vector_size (32)));
      10  typedef unsigned int v16si __attribute__((vector_size (64)));
      11  typedef unsigned long long v8di __attribute__((vector_size (64)));
      12  
      13  void
      14  truncqd (v8si * dst, v8di * __restrict src)
      15  {
      16    unsigned tem[8];
      17    tem[0] = (*src)[0];
      18    tem[1] = (*src)[1];
      19    tem[2] = (*src)[2];
      20    tem[3] = (*src)[3];
      21    tem[4] = (*src)[4];
      22    tem[5] = (*src)[5];
      23    tem[6] = (*src)[6];
      24    tem[7] = (*src)[7];
      25    dst[0] = *(v8si *) tem;
      26  }
      27  
      28  void
      29  truncqw (v8hi * dst, v8di * __restrict src)
      30  {
      31    unsigned short tem[8];
      32    tem[0] = (*src)[0];
      33    tem[1] = (*src)[1];
      34    tem[2] = (*src)[2];
      35    tem[3] = (*src)[3];
      36    tem[4] = (*src)[4];
      37    tem[5] = (*src)[5];
      38    tem[6] = (*src)[6];
      39    tem[7] = (*src)[7];
      40    dst[0] = *(v8hi *) tem;
      41  }
      42  
      43  void
      44  truncqb (v8qi * dst, v8di * __restrict src)
      45  {
      46    unsigned char tem[8];
      47    tem[0] = (*src)[0];
      48    tem[1] = (*src)[1];
      49    tem[2] = (*src)[2];
      50    tem[3] = (*src)[3];
      51    tem[4] = (*src)[4];
      52    tem[5] = (*src)[5];
      53    tem[6] = (*src)[6];
      54    tem[7] = (*src)[7];
      55    dst[0] = *(v8qi *) tem;
      56  }
      57  
      58  void
      59  truncdw (v16hi * dst, v16si * __restrict src)
      60  {
      61    unsigned short tem[16];
      62    tem[0] = (*src)[0];
      63    tem[1] = (*src)[1];
      64    tem[2] = (*src)[2];
      65    tem[3] = (*src)[3];
      66    tem[4] = (*src)[4];
      67    tem[5] = (*src)[5];
      68    tem[6] = (*src)[6];
      69    tem[7] = (*src)[7];
      70    tem[8] = (*src)[8];
      71    tem[9] = (*src)[9];
      72    tem[10] = (*src)[10];
      73    tem[11] = (*src)[11];
      74    tem[12] = (*src)[12];
      75    tem[13] = (*src)[13];
      76    tem[14] = (*src)[14];
      77    tem[15] = (*src)[15];
      78    dst[0] = *(v16hi *) tem;
      79  }
      80  
      81  
      82  void
      83  truncdb (v16qi * dst, v16si * __restrict src)
      84  {
      85    unsigned char tem[16];
      86    tem[0] = (*src)[0];
      87    tem[1] = (*src)[1];
      88    tem[2] = (*src)[2];
      89    tem[3] = (*src)[3];
      90    tem[4] = (*src)[4];
      91    tem[5] = (*src)[5];
      92    tem[6] = (*src)[6];
      93    tem[7] = (*src)[7];
      94    tem[8] = (*src)[8];
      95    tem[9] = (*src)[9];
      96    tem[10] = (*src)[10];
      97    tem[11] = (*src)[11];
      98    tem[12] = (*src)[12];
      99    tem[13] = (*src)[13];
     100    tem[14] = (*src)[14];
     101    tem[15] = (*src)[15];
     102    dst[0] = *(v16qi *) tem;
     103  }
     104  
     105  /* { dg-final { scan-assembler-times "vpmovqd" 1 } } */
     106  /* { dg-final { scan-assembler-times "vpmovqw" 1 } } */
     107  /* { dg-final { scan-assembler-times "vpmovqb" 1 } } */
     108  /* { dg-final { scan-assembler-times "vpmovdw" 1 } } */
     109  /* { dg-final { scan-assembler-times "vpmovdb" 1 } } */
     110