(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
i386/
pr92658-avx512bw-2.c
       1  /* PR target/92658 */
       2  /* { dg-do compile } */
       3  /* { dg-options "-O2 -mtune=icelake-server -ftree-vectorize -mavx512bw -mprefer-vector-width=512" } */
       4  
       5  typedef char v64qi __attribute__((vector_size (64)));
       6  typedef short v32hi __attribute__((vector_size (64)));
       7  typedef int v16si __attribute__((vector_size (64)));
       8  typedef long long v8di __attribute__((vector_size (64)));
       9  
      10  void
      11  foo_s8_s16 (v32hi * dst, v64qi * __restrict src)
      12  {
      13    short tem[32];
      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    tem[16] = (*src)[16];
      31    tem[17] = (*src)[17];
      32    tem[18] = (*src)[18];
      33    tem[19] = (*src)[19];
      34    tem[20] = (*src)[20];
      35    tem[21] = (*src)[21];
      36    tem[22] = (*src)[22];
      37    tem[23] = (*src)[23];
      38    tem[24] = (*src)[24];
      39    tem[25] = (*src)[25];
      40    tem[26] = (*src)[26];
      41    tem[27] = (*src)[27];
      42    tem[28] = (*src)[28];
      43    tem[29] = (*src)[29];
      44    tem[30] = (*src)[30];
      45    tem[31] = (*src)[31];
      46    dst[0] = *(v32hi *) tem;
      47  }
      48  
      49  void
      50  bar_s8_s16 (v32hi * dst, v64qi src)
      51  {
      52    short tem[32];
      53    tem[0] = src[0];
      54    tem[1] = src[1];
      55    tem[2] = src[2];
      56    tem[3] = src[3];
      57    tem[4] = src[4];
      58    tem[5] = src[5];
      59    tem[6] = src[6];
      60    tem[7] = src[7];
      61    tem[8] = src[8];
      62    tem[9] = src[9];
      63    tem[10] = src[10];
      64    tem[11] = src[11];
      65    tem[12] = src[12];
      66    tem[13] = src[13];
      67    tem[14] = src[14];
      68    tem[15] = src[15];
      69    tem[16] = src[16];
      70    tem[17] = src[17];
      71    tem[18] = src[18];
      72    tem[19] = src[19];
      73    tem[20] = src[20];
      74    tem[21] = src[21];
      75    tem[22] = src[22];
      76    tem[23] = src[23];
      77    tem[24] = src[24];
      78    tem[25] = src[25];
      79    tem[26] = src[26];
      80    tem[27] = src[27];
      81    tem[28] = src[28];
      82    tem[29] = src[29];
      83    tem[30] = src[30];
      84    tem[31] = src[31];
      85    dst[0] = *(v32hi *) tem;
      86  }
      87  
      88  /* { dg-final { scan-assembler-times "pmovsxbw" 2 } } */
      89  
      90  void
      91  foo_s8_s32 (v16si * dst, v64qi * __restrict src)
      92  {
      93    int tem[16];
      94    tem[0] = (*src)[0];
      95    tem[1] = (*src)[1];
      96    tem[2] = (*src)[2];
      97    tem[3] = (*src)[3];
      98    tem[4] = (*src)[4];
      99    tem[5] = (*src)[5];
     100    tem[6] = (*src)[6];
     101    tem[7] = (*src)[7];
     102    tem[8] = (*src)[8];
     103    tem[9] = (*src)[9];
     104    tem[10] = (*src)[10];
     105    tem[11] = (*src)[11];
     106    tem[12] = (*src)[12];
     107    tem[13] = (*src)[13];
     108    tem[14] = (*src)[14];
     109    tem[15] = (*src)[15];
     110    dst[0] = *(v16si *) tem;
     111  }
     112  
     113  void
     114  bar_s8_s32 (v16si * dst, v64qi src)
     115  {
     116    int tem[16];
     117    tem[0] = src[0];
     118    tem[1] = src[1];
     119    tem[2] = src[2];
     120    tem[3] = src[3];
     121    tem[4] = src[4];
     122    tem[5] = src[5];
     123    tem[6] = src[6];
     124    tem[7] = src[7];
     125    tem[8] = src[8];
     126    tem[9] = src[9];
     127    tem[10] = src[10];
     128    tem[11] = src[11];
     129    tem[12] = src[12];
     130    tem[13] = src[13];
     131    tem[14] = src[14];
     132    tem[15] = src[15];
     133    dst[0] = *(v16si *) tem;
     134  }
     135  
     136  /* { dg-final { scan-assembler-times "pmovsxbd" 2 } } */
     137  
     138  void
     139  foo_s8_s64 (v8di * dst, v64qi * __restrict src)
     140  {
     141    long long tem[8];
     142    tem[0] = (*src)[0];
     143    tem[1] = (*src)[1];
     144    tem[2] = (*src)[2];
     145    tem[3] = (*src)[3];
     146    tem[4] = (*src)[4];
     147    tem[5] = (*src)[5];
     148    tem[6] = (*src)[6];
     149    tem[7] = (*src)[7];
     150    dst[0] = *(v8di *) tem;
     151  }
     152  
     153  void
     154  bar_s8_s64 (v8di * dst, v64qi src)
     155  {
     156    long long tem[8];
     157    tem[0] = src[0];
     158    tem[1] = src[1];
     159    tem[2] = src[2];
     160    tem[3] = src[3];
     161    tem[4] = src[4];
     162    tem[5] = src[5];
     163    tem[6] = src[6];
     164    tem[7] = src[7];
     165    dst[0] = *(v8di *) tem;
     166  }
     167  
     168  /* { dg-final { scan-assembler-times "pmovsxbq" 2 } } */
     169  
     170  void
     171  foo_s16_s32 (v16si * dst, v32hi * __restrict src)
     172  {
     173    int tem[16];
     174    tem[0] = (*src)[0];
     175    tem[1] = (*src)[1];
     176    tem[2] = (*src)[2];
     177    tem[3] = (*src)[3];
     178    tem[4] = (*src)[4];
     179    tem[5] = (*src)[5];
     180    tem[6] = (*src)[6];
     181    tem[7] = (*src)[7];
     182    tem[8] = (*src)[8];
     183    tem[9] = (*src)[9];
     184    tem[10] = (*src)[10];
     185    tem[11] = (*src)[11];
     186    tem[12] = (*src)[12];
     187    tem[13] = (*src)[13];
     188    tem[14] = (*src)[14];
     189    tem[15] = (*src)[15];
     190    dst[0] = *(v16si *) tem;
     191  }
     192  
     193  void
     194  bar_s16_s32 (v16si * dst, v32hi src)
     195  {
     196    int tem[16];
     197    tem[0] = src[0];
     198    tem[1] = src[1];
     199    tem[2] = src[2];
     200    tem[3] = src[3];
     201    tem[4] = src[4];
     202    tem[5] = src[5];
     203    tem[6] = src[6];
     204    tem[7] = src[7];
     205    tem[8] = src[8];
     206    tem[9] = src[9];
     207    tem[10] = src[10];
     208    tem[11] = src[11];
     209    tem[12] = src[12];
     210    tem[13] = src[13];
     211    tem[14] = src[14];
     212    tem[15] = src[15];
     213    dst[0] = *(v16si *) tem;
     214  }
     215  
     216  /* { dg-final { scan-assembler-times "pmovsxwd" 2 } } */
     217  
     218  void
     219  foo_s16_s64 (v8di * dst, v32hi * __restrict src)
     220  {
     221    long long tem[8];
     222    tem[0] = (*src)[0];
     223    tem[1] = (*src)[1];
     224    tem[2] = (*src)[2];
     225    tem[3] = (*src)[3];
     226    tem[4] = (*src)[4];
     227    tem[5] = (*src)[5];
     228    tem[6] = (*src)[6];
     229    tem[7] = (*src)[7];
     230    dst[0] = *(v8di *) tem;
     231  }
     232  
     233  void
     234  bar_s16_s64 (v8di * dst, v32hi src)
     235  {
     236    long long tem[8];
     237    tem[0] = src[0];
     238    tem[1] = src[1];
     239    tem[2] = src[2];
     240    tem[3] = src[3];
     241    tem[4] = src[4];
     242    tem[5] = src[5];
     243    tem[6] = src[6];
     244    tem[7] = src[7];
     245    dst[0] = *(v8di *) tem;
     246  }
     247  
     248  /* { dg-final { scan-assembler-times "pmovsxwq" 2 } } */
     249  
     250  void
     251  foo_s32_s64 (v8di * dst, v16si * __restrict src)
     252  {
     253    long long tem[8];
     254    tem[0] = (*src)[0];
     255    tem[1] = (*src)[1];
     256    tem[2] = (*src)[2];
     257    tem[3] = (*src)[3];
     258    tem[4] = (*src)[4];
     259    tem[5] = (*src)[5];
     260    tem[6] = (*src)[6];
     261    tem[7] = (*src)[7];
     262    dst[0] = *(v8di *) tem;
     263  }
     264  
     265  void
     266  bar_s32_s64 (v8di * dst, v16si src)
     267  {
     268    long long tem[8];
     269    tem[0] = src[0];
     270    tem[1] = src[1];
     271    tem[2] = src[2];
     272    tem[3] = src[3];
     273    tem[4] = src[4];
     274    tem[5] = src[5];
     275    tem[6] = src[6];
     276    tem[7] = src[7];
     277    dst[0] = *(v8di *) tem;
     278  }
     279  
     280  /* { dg-final { scan-assembler-times "pmovsxdq" 2 } } */