(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
i386/
pr92658-avx2.c
       1  /* PR target/92658 */
       2  /* { dg-do compile } */
       3  /* { dg-options "-O2 -ftree-vectorize -mavx2" } */
       4  
       5  typedef unsigned char v32qi __attribute__((vector_size (32)));
       6  typedef unsigned short v16hi __attribute__((vector_size (32)));
       7  typedef unsigned int v8si __attribute__((vector_size (32)));
       8  typedef unsigned long long v4di __attribute__((vector_size (32)));
       9  
      10  void
      11  foo_u8_u16 (v16hi * dst, v32qi * __restrict src)
      12  {
      13    unsigned short tem[16];
      14    tem[0] = (*src)[0];
      15    tem[1] = (*src)[1];
      16    tem[2] = (*src)[2];
      17    tem[3] = (*src)[3];
      18    tem[4] = (*src)[4];
      19    tem[5] = (*src)[5];
      20    tem[6] = (*src)[6];
      21    tem[7] = (*src)[7];
      22    tem[8] = (*src)[8];
      23    tem[9] = (*src)[9];
      24    tem[10] = (*src)[10];
      25    tem[11] = (*src)[11];
      26    tem[12] = (*src)[12];
      27    tem[13] = (*src)[13];
      28    tem[14] = (*src)[14];
      29    tem[15] = (*src)[15];
      30    dst[0] = *(v16hi *) tem;
      31  }
      32  
      33  void
      34  bar_u8_u16 (v16hi * dst, v32qi src)
      35  {
      36    unsigned short tem[16];
      37    tem[0] = src[0];
      38    tem[1] = src[1];
      39    tem[2] = src[2];
      40    tem[3] = src[3];
      41    tem[4] = src[4];
      42    tem[5] = src[5];
      43    tem[6] = src[6];
      44    tem[7] = src[7];
      45    tem[8] = src[8];
      46    tem[9] = src[9];
      47    tem[10] = src[10];
      48    tem[11] = src[11];
      49    tem[12] = src[12];
      50    tem[13] = src[13];
      51    tem[14] = src[14];
      52    tem[15] = src[15];
      53    dst[0] = *(v16hi *) tem;
      54  }
      55  
      56  /* { dg-final { scan-assembler-times "pmovzxbw" 2 } } */
      57  
      58  void
      59  foo_u8_u32 (v8si * dst, v32qi * __restrict src)
      60  {
      61    unsigned int tem[8];
      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    dst[0] = *(v8si *) tem;
      71  }
      72  
      73  void
      74  bar_u8_u32 (v8si * dst, v32qi src)
      75  {
      76    unsigned int tem[8];
      77    tem[0] = src[0];
      78    tem[1] = src[1];
      79    tem[2] = src[2];
      80    tem[3] = src[3];
      81    tem[4] = src[4];
      82    tem[5] = src[5];
      83    tem[6] = src[6];
      84    tem[7] = src[7];
      85    dst[0] = *(v8si *) tem;
      86  }
      87  
      88  /* { dg-final { scan-assembler-times "pmovzxbd" 2 } } */
      89  
      90  void
      91  foo_u8_u64 (v4di * dst, v32qi * __restrict src)
      92  {
      93    unsigned long long tem[4];
      94    tem[0] = (*src)[0];
      95    tem[1] = (*src)[1];
      96    tem[2] = (*src)[2];
      97    tem[3] = (*src)[3];
      98    dst[0] = *(v4di *) tem;
      99  }
     100  
     101  void
     102  bar_u8_u64 (v4di * dst, v32qi src)
     103  {
     104    unsigned long long tem[4];
     105    tem[0] = src[0];
     106    tem[1] = src[1];
     107    tem[2] = src[2];
     108    tem[3] = src[3];
     109    dst[0] = *(v4di *) tem;
     110  }
     111  
     112  /* { dg-final { scan-assembler-times "pmovzxbq" 2 } } */
     113  
     114  void
     115  foo_u16_u32 (v8si * dst, v16hi * __restrict src)
     116  {
     117    unsigned int tem[8];
     118    tem[0] = (*src)[0];
     119    tem[1] = (*src)[1];
     120    tem[2] = (*src)[2];
     121    tem[3] = (*src)[3];
     122    tem[4] = (*src)[4];
     123    tem[5] = (*src)[5];
     124    tem[6] = (*src)[6];
     125    tem[7] = (*src)[7];
     126    dst[0] = *(v8si *) tem;
     127  }
     128  
     129  void
     130  bar_u16_u32 (v8si * dst, v16hi src)
     131  {
     132    unsigned int tem[8];
     133    tem[0] = src[0];
     134    tem[1] = src[1];
     135    tem[2] = src[2];
     136    tem[3] = src[3];
     137    tem[4] = src[4];
     138    tem[5] = src[5];
     139    tem[6] = src[6];
     140    tem[7] = src[7];
     141    dst[0] = *(v8si *) tem;
     142  }
     143  
     144  /* { dg-final { scan-assembler-times "pmovzxwd" 2 } } */
     145  
     146  void
     147  foo_u16_u64 (v4di * dst, v16hi * __restrict src)
     148  {
     149    unsigned long long tem[4];
     150    tem[0] = (*src)[0];
     151    tem[1] = (*src)[1];
     152    tem[2] = (*src)[2];
     153    tem[3] = (*src)[3];
     154    dst[0] = *(v4di *) tem;
     155  }
     156  
     157  void
     158  bar_u16_u64 (v4di * dst, v16hi src)
     159  {
     160    unsigned long long tem[4];
     161    tem[0] = src[0];
     162    tem[1] = src[1];
     163    tem[2] = src[2];
     164    tem[3] = src[3];
     165    dst[0] = *(v4di *) tem;
     166  }
     167  
     168  /* { dg-final { scan-assembler-times "pmovzxwq" 2 } } */
     169  
     170  void
     171  foo_u32_u64 (v4di * dst, v8si * __restrict src)
     172  {
     173    unsigned long long tem[4];
     174    tem[0] = (*src)[0];
     175    tem[1] = (*src)[1];
     176    tem[2] = (*src)[2];
     177    tem[3] = (*src)[3];
     178    dst[0] = *(v4di *) tem;
     179  }
     180  
     181  void
     182  bar_u32_u64 (v4di * dst, v8si src)
     183  {
     184    unsigned long long tem[4];
     185    tem[0] = src[0];
     186    tem[1] = src[1];
     187    tem[2] = src[2];
     188    tem[3] = src[3];
     189    dst[0] = *(v4di *) tem;
     190  }
     191  
     192  /* { dg-final { scan-assembler-times "pmovzxdq" 2 } } */